실전 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의 생명 주기
@PostContructServlet을 준비해주는 단계init()생성 단계serviceservlet이 일하는 단계, 구현하는 단계destory()일을 다 하고 소멸되는 단계@PreDestoryServlet을 종료시켜주는 단계
- 웹 컨테이너 톰캣에서 알아서 해당 메소드들을 단계에 맞춰서 실행 시켜줌
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.)