실전 JSP 인프런 강의 정리
Servlet 같은 부분은 아무래도 처음 배웠을 때 보단 대충 더 알 것 같지만 복잡한 JSP..
웹 프로그램 개요
- 웹 프로그램이란?
- 네트워크 (컴퓨터가 서로 연결되어 있는 것)을 통해서 데이터를 주고 받는 것을 인터넷 서비스를 이용하는 것이라고 이야기 함
- 인터넷 서비스를 이용해서 서로 다른 구성요소들이 통신할 수 있는 프로그램
- 프로토콜과 IP
- 프로토콜
- 인터넷 객체 (request) → 웹 서버 → 인터넷 객체 (response) : 통신 규약
- HTTP, FTP, SMTP, POP 등
- IP
- IP 주소: 해당 IP를 통해서 웹 서버를 접근 할 수 있음
- DNS 서버: 네이버에 들어가기 위해서 ip 주소를 입력하는 것이 아니라 www.naver.com 을 입력 할 수 있게 매핑을 도와주는 서버
- 프로토콜
- 웹 프로그램의 동작 원리
- 정적 데이터인 경우 HTML으로 응답
- 동적 데이터인 경우 웹 컨테이너에 데이터를 담아서 응답함
- 웹 컨테이너 구조
- xxx.jsp → xxx_jsp.java → xxx_jsp.class → xxx_jsp.obj → html
- WAS = Web Application Server가 담고 있는 웹 컨테이너가 개발자가 만든 jsp 파일을 가지고 java 파일을 만들어서 클래스 파일을 만들고 object 파일까지 만들어줌.
- 개발자는 jsp 파일을 작성하는 것 까지만 실행함
- WebContent : 웹 컨테이너 역할을 하는 부분, JSP 파일이 웹 컨테이너 안에서 동작해야 하기 때문에 해당 폴더 하위에 생성해줘야 함
- 사용자가 응답 받는 HTML 파일에서 확인을 하면 JSP 문법은 보이지 않고 정적인 HTML 코드만 확인 할 수 있음.
Sevlet 맵핑
- Servlet 맵핑이란?
- 웹 컨테이너(tomcat)안에 저장되어있는 servlet이 수십만개가 있는 경우 servlet을 브라우저에서 검색할 때 구분하기 위하여 고유한 이름이 필요함
- full path > http://localhost:8090/flyToJsp/servlet/com.servlet.ServletEx
- 보안이 취약하고 복잡한 URL을 가진다.
- mapping path > http://localhost:8090/flyToJsp/SE
- 간결한 URL로 나타 낼 수 있음
- web.xml 파일을 이용한 맵핑
- 고전적인 방식
- web.xml 파일에 해당 코드를 넣어준다.
<servlet>
<servlet-name>servletEx</servlet-name>
<servlet-class>com.servlet.ServletEx</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletEx</servlet-name>
<url-pattern>/SE</url-pattern>
</servlet-mapping>
- Java Annotation을 이용한 맵핑
Servlet request, response
- HttpServletRequest : 요청에 대한 정보를 가지고 있는 객체, 클라이언트가 서버 쪽으로 데이터를 요청 할 때 기능과 속성들을 가지고 있는 객체
- HttpServletResponse:: 응답에 대한 정보를 가지고 있는 객체, 서버가 브라우저 쪽으로 데이터를 보내줄 때 기능과 속성들을 가지고 있는 객체
Servlet Life-Cycle
- 사용자의 요청에 의해서 생성된 servlet의 생명 주기(생성, 실행, 종료)
- Servlet의 생명 주기
@PostContruct
Servlet을 준비해주는 단계init()
생성 단계service
servlet이 일하는 단계, 구현하는 단계destory()
일을 다 하고 소멸되는 단계@PreDestory
Servlet을 종료시켜주는 단계
- 웹 컨테이너 톰캣에서 알아서 해당 메소드들을 단계에 맞춰서 실행 시켜줌
form 데이터 처리
- 사용자의 form 데이터를 Servlet에서 처리 할 수 있음
Servlet vs JSP
- Servelet
- 순수 자바 파일
- xxx.java → xxx.class
- httpServlet 클래스를 상속 받아서 만들어짐
- JSP
- xxx.jsp → xxx_jsp.java → xxx_jsp.class : jsp 파일을 개발자가 만들면 컨테이너가 알아서 java 파일을 만들고 컴파일러를 통해서 class 파일로 컴파일됨
- jsp 파일을 서버에 올려보면 html 주석은 남아있고 jsp 주석은 사라지는 것을 확인 할 수 있음
- 지시어: 서버에서 jsp 페이지를 처리하는 방법에 대한ㄴ 정의
-
page: 페이지 기본 설정
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
include: include file 설정 : include 하고 싶은 위치에 해당 지시어 추가 해주면 마치 하나의 페이지 처럼 화면에 보이게 함
-
taglib: 외부라이브러리 태그 설정
-
import 하는 경우
-
JSP Request, Response
- Request
- Servlet에서 사용한 코드와 동일함
- Response
- response.XXX()
JSP 내장객체
- config 객체
- web.xml (웹 환경설정)의 데이터를 getinitParameter()라는 메소드를 이용해서 jsp에서 해당 구성 값을 가지고 올 수 있게 하는 객체
getServletConfg().getInitParameter(param-name);
을 하면 param-value 값을 가지고 올 수 있음
<!-- 해당 파일(userWebxml.js)에 해당하는 곳에서만 사용 할 수있는 param -->
<servlet>
<servlet-name>servletEx</servlet-name>
<jsp-file>/useWebxml.jsp</jsp-file>
<init-param>
<param-name>adminId</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>adminPw</param-name>
<param-value>1234</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servletEx</servlet-name>
<url-pattern>/useWebxml.jsp</url-pattern>
</servlet-mapping>
- application 객체
- config 객체와는 다르게 모든 jsp 파일에서 전체적으로 사용 할 수 있는 param을 가지고 올 수 있게 함
- global한 변수의 경우에 사용
<context-param>
<param-name>imgDir</param-name>
<param-value>/upload/img</param-value>
</context-param>
<context-param>
<param-name>testServerIp</param-name>
<param-value>127.0.0.1</param-value>
</context-param>
<context-param>
<param-name>realServerIp</param-name>
<param-value>172.0.0.1</param-value>
</context-param>
- out 객체
- exception 객체
<%@ page isErrorPage="true" %>
exception.getMessage()
메소드를 이용해서 exception message를 알아본다.
Cookie
- 클라이언트와 서버의 연결을 유지시켜주는 방법으로 Cookie에 대해서 학습한다.
http
의 특징으로 한번 클라이언트가 request를 하고 서버가 response를 하고 나면 해당 연결을 해제 시켜 버림 > 왜냐면 하나의 서버에 수 천개의 많은 클라이언트가 붙는 경우 서버의 부하가 예상되기 때문에 효율적으로 운영하기 위해서 리소스를 낭비하지 않기 위해 연결을 해제시킴.- 어떤 데이터가 유지 되기를 원하게 되면서 사용 (ex: 사이트의 로그인 정보의 경우 페이지를 움직여도 로그인 정보를 유지하고 싶음)
- 브라우저의 연결 정보 (요청과 응답 정보)를 서버에 저장하기에는 서버에 부하가 걱정이 되기 때문에 클라이언트 쪽에 기존 연결정보를 저장함.
- Cookie란?
- 서버와 클라이언트 연결을 시도한 흔적
- Cookie 구현
-
cookie가 null인지 판단한다
1-1. true인 경우 재활용
1-2. false인 경우 cookie 생성
-
- Cookie는 사용자의 정보가 브라우저에 저장이 되면 보안에 취약 할 수 있음. Cookie에 저장하는 데이터는 간단한 데이터만 저장하는 것이 좋음.
Session
- 클라이어트와 서버의 연결을 유지시켜주는 방법으로 Session에 대해서 학습한다.
- Cookie에서 언급한 http의 특성으로 인해서 연결을 유지시키는 방법으로 쿠키와 다르게 클라이언트(브라우저)에 저장하는 것이 아닌 서버에 기존 연결정보를 저장하여 연결을 유지시켜준다.
- 웹 컨테이너에서 생성이 되고 서버에서 저장이 되는 데이터를 의미한다.
Filter
- 브라우저와 웹 서버가 통신을 할 때
filter
라는 것을 둬서 중간 다리 역할을 수행함. - 서블릿의 개수가 많아지는 경우에 한글 처리 코드를 모두 추가하는 것은 비효율적이기 때문에 Filter에 한글 처리 코드 부분을 추가해주면 모든 Request와 Response에 대한 한글 처리가 이루어 질 수 있음.
- 강의에서는 web.xml을 통해서 Filter를 적용하는 부분을 진행했지만 어노테이션을 통해서도 Filter를 적용 할 수 있다.
@WebFilter(urlPatterns = { "/*" }, initParams = {
@WebInitParam(name = "encoding", value = "utf-8", description = "encoding"),
@WebInitParam(name = "forceEncoding", value = "true", description = "forceEncoding") })
public void init(FilterConfig fConfig) throws ServletException {
encoding = fConfig.getInitParameter("encoding") == null ? "" : fConfig.getInitParameter("encoding");
forceEncoding = fConfig.getInitParameter("forceEncoding") == null ? "false"
: fConfig.getInitParameter("forceEncoding");
}
JDBC
- Java와 DB가 통신할수 있게 해주는 API
- Eclipse에서도 Oracle의 API를 이용하기 위해서 Oracle Lib을 Eclipse에 복사한다.
- window - preference - classpath variables에서 실제로 우리가 사용하고 있는 jar 라이브러리의 위치를 확인 할 수 있다.
- 이 부분이 jdk 16버전 사용하면서 해당 강의대로 하면 안되고
ojdbc6.jar
파일을 WEB-INF - lib 파일 하위에 붙여 넣어 줘야 했다. - 강의 따라 하면 jre-lib 이 deprecated 되었다고 뜬다. 검색해보면 해당 방법 쓰는 건 거의 jre 1.8 버전 대의 것들인 듯..
- Client (브라우저) → 웹 컨테이너 속 jsp, servlet → (jdbc를 통해) → 데이터베이스
- JDBC 실행 순서
- OracleDriver 로딩 :
Class.forName(driver);
- Driver가 Java 것이 아니기 때문에 드라이버를 메모리에 로딩해야 한다.
- Java와 Oracle 연결 : con =
DriverManager.getConnection(url, id, pw);
- Query 전송 객체 :
stat = con.createStatement();
- 통신을 위한 객체
- Query 작성 :
String sql = "SELECT * FROM book;"
- Query 전송 :
res = stmt.executeQuery(sql)
- 실제적인 통신
- OracleDriver 로딩 :
- 오류란 오류는 다 만나고 있다.
-
driver를 찾지 못했음 - 위에 작성한 방법으로 해결
-
url이 올바르지 않다는 에러 메세지 - 오타 확인
-
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
1) SID를 잘못 입력했나 해서 접속 테스트 화면에서 확인해 봤지만 xe가 맞았다.
2) CMD 창에서
lsnrctl status
을 입력 해보라해서 (이유도 모르고..) 입력을 해봤지만 status가 ready로 정상이었다.- 오라클 리스너는 네트워크를 이용해서 클라이언트에서 오라클 서버로 연결하기 위한 오라클 네트워크 관리자로
lsnrctl
명령어로 리스너를 확인 할 수 있음.
3) https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hyoun1202&logNo=220107048463 해당 블로그 글을 확인해보고 혹시나 싶어서 :xe 부분을 /xe로 변경해보았다. 결과는 성공.
- 어이가 없는 것은.. sid가... 진짜.. xe라는 것이다.. 일단.. 여기서 좀 더 소모하고 싶지 않기 때문에 넘어간다..
- 오라클 리스너는 네트워크를 이용해서 클라이언트에서 오라클 서버로 연결하기 위한 오라클 네트워크 관리자로
-
문법 관련 오류 - 에러를 잘 보면 알아서 확인 할 수 있다. 대부분 휴먼 에러..
-
DAO와 DTO
- DAO (Data Access Object)
- DTO (Data Transfer Object) - 서로 데이터를 관리하는 경우, 데이터 베이스에 있는 데이터를 자바의 형태로 바꿔주는 객체 (VO)
- Mybatis의 감사함을 다시 느끼며 코딩 중 ㅋㅋ
Connection Pool
- 데이터베이스와 통신하는 자원을 효율적으로 관리하기 위해서 사용함
- 데이터베이스와 통신 할 때 (입출력) 계속해서 Connection을 맺고 끊고 수십 만 번 반복하면 과부하가 걸릴 수 있음.
- 미리 Connection Pool에 이미 Connection이 만들어져 있는 상태에서 웹 서버는 Connection 객체를 가지고 와서 사용하고 그냥 반환하면 됨.
- Tomcat 컨테이너에서 미리 만들어서 필요 할 때마다 가져옴.
- Server 하위 context.xml 파일에 해당 부분을 추가해준다.
<Resource
auth="Container"
driverClassname="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521/xe"
username="scott"
password="tiger"
name="jdbc/orace11g"
type="javax.sql.DataSource"
maxActive="4"
maxWait="10000" />
- Connection Pool은 해당 xml의
name
값을 가지고 접근한다. - 음~ 바로 오류나 버렸다.
추가적으로 확인 할 부분
- java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'jdbc:oracle:thin:@localhost:1521:xe'
- DataSource
- 환경 설정 관련
https://proni.tistory.com/entry/Eclipse-Dynamic-Web-Project-파일-저장-path-설정-java-classes-web관련-등
Author And Source
이 문제에 관하여(실전 JSP 인프런 강의 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@minchoi/실전-JSP-인프런-강의-정리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)