[DB Programming] HTTP, Servlet, JSP, response/request/pageContext 객체, page/include 지시자, include/forward Action Tags, JavaBeans
HTTP Request Handling
Web Client가 HTTP Request를 보내면, Web Server & Container에서 작업을 한다.
Web Server & Container에서는 HttpServletRequest 내장객체를 자동으로 생성하고 저장한다.
Web Components -> JavaBeans Components -> DB
Web Components -> DB
위 2줄의 작업 후에 HttpServletResponse 객체를 생성해 HTTP Response를 Web Client로 보낸다.
Container란 어떤 환경에서나 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지이다.
Web Components란 Servlets나 JSP pages를 말한다. 개발자가 직접 개발해야 하는 부분이다.
JavaBeans Components는 쉽게 재사용하고 응용 프로그램으로 함께 구성할 수 있는 Java 클래스이다. 특정 디자인 규칙을 따르는 모든 Java 클래스는 JavaBeans Components이다.
javax.servlet.http.HttpServletRequest, j.s.h.HttpServletResponse 객체는 HTTP 요청 및 응답에 관한 정보, 연산(method)들을 제공한다. 실행결과와 같은 내용으로 body만 채우면 된다.
Servlet
Java 언어 기반의 웹 프로그래밍 기술이다. Java Class이다. 모든 Java API 사용 가능하고 확장가능성 높다.
Client가 어떤 요청을 하면 Server는 요청 확인 및 처리 후 응답을 전송해야 하는데, 이런 역할을 하는 자바 프로그램이다.
예를 들어, 사용자가 로그인 할 때 아이디와 비밀먼호를 입력하고 로그인 버튼을 누르면 서버는 클라이언트의 아이디와 비밀번호를 확인하고, 결과에 따라 다른 페이지를 띄운다. 이러한 역할을 수행하는 것이 Servlet이다.
Servlet이 생성되면 요청을 받을 수 있고, 응답을 보낼 수 있게 된다.
Multi-thread로 실행되어 빠른 처리 속도를 가지고, 기본적으로 HTTPServlet class를 상속받는 sub-class로 구현한다.
웹 애플리케이션을 Servlet으로만 작성해도 되고 JSP로만 작성해도 되고 2개를 같이 사용해서 작성해도 된다. 근데 Servlet으로만 작성 시 Java 프로그램 내에서 화면 출력 생성 코드를 포함해야 한다. 최종 결과로는 화면에 띄우는 코드(html)만 브라우저에게 전송 가능하기 때문이다.
MVC design pattern에서 Controller 구현을 위해 사용된다.
결론적으로 Servlet은 Java Class라서 Java 코드, DB 검색 등이 가능하긴 한데 최종 결과를 html 코드로 일일히 생성하고 추가해야 하므로 번거롭다. 그래서 JSP가 더 낫다.
Servlet Container
Servlet을 관리해주는 Container이다.
Server에 Servlet을 만들었다고 해서 스스로 작동하는 것이 아니고, Servlet을 관리해주는 것이 필요하고 이 역할을 하는 것이 Servlet Container다.
Servlet이 어떤 동작을 수행하는 문서라고 하면, Servlet Container는 그 문서를 보고 수행한다고 볼 수 있다.
Servlet Container는 Client의 요청을 받고 응답을 줄 수 있게 Web Server와 Socket으로 통신하고, Servlet Container의 대표적인 예로 Tomcat이 있다. Tomcat은 실제로 Web Server와 통신해 JSP와 Servlet이 작동하는 환경을 제공해준다. Tomcat으로 Web Server, Web Client 모두와 통신할 수 있다.
JSP (Java Server Pages)
Servlet 기반의 server-side scrpit 언어이다. Java 코드가 들어가 있는 html 코드이다.
Servlet은 Java 코드 속에 html 코드가 들어가는 형태인데, JSP는 반대로 html 코드 속에 Java 코드가 들어가는 형태의 웹 프로그래밍 기술이다. html 속에서 Java 코드는 <% .. %> 또는 <%= .. =%> 형태로 들어간다. Java 코드로 작성된 부분은 웹 브라우저로 전송하는 것이 아니라 Web Server에서 실행된다.
Java web applicaton에서 presentation layer의 핵심 구현 기술로 사용된다. html page 내에서 Java 언어로 프로그램을 작성할 수는 있지만, 요즘 JSP는 html 정리해서 UI 화면 용도로만 사용한다. UI, Business logic 및 data 처리 구현을 동시에 할 수는 있으나 프로그램의 복잡도 및 유지보수의 어려움이 증가하기 때문이다.
JSP page는 최초 요청 처리 시 servlet으로 변환되고 메모리에 load된다. 최초 1회 이후 요청은 변환 없이 메모리 상이 servlet에서 바로 처리된다.
Expression Languase(EL), JSP Standard Tag Library(JSTL) 등 다양한 확장 기술 이용 가능하다.
MVC design pattern에서 View 구현을 위해 사용된다.
JSP Request 처리 과정
1. Web Client - 웹 브라우저에서 JSP 파일 요청 (HTTP request message) -> Internet
2. -> Web Server - 사용자 요청 처리 요청
3. -> Web Container - JSP 파일 parsing/Servlet으로 변환/class 파일 생성/메모리에 적재 후 실행/처리 결과(html) 전송
4. -> Web Server -> Internet - 처리 결과(HTTP response message) 전송
5. -> Web Client - 화면 출력
JSP 내장 객체
JSP Container가 기본적으로 생성 및 제공하는 객체이다.
Servlet으로 변환될 때 _jspService() 메소드 내에서 선언되고 참조된다.
1. request 객체
클라이언트가 서버에 전송한 요청 정보를 저장하는 JSP의 기본 객체이다. Servlet에 정의된 특정 클래스(javax.servlet.http.HttpServletRequest)에 정의되어 있다.
Servlet의 service(), doGet(), doPost() 등의 첫번째 parameter로 전달되는 HTTPServletRequest 객체와 동일하다.
request 객체의 기능은 클라이언트(웹 브라우저)와 관련된 정보 참조, 클라이언트가 전송한 요청 매개변수(request parameter)/요청 헤더(request header)/cookie date 참조, request 객체에 대한 속성 처리 등이 있다.
클라이언트가 html form의 입력 요소를 사용해 전송한 정보들이 request parameter로 전송된다. request parameter 참조할 때 getParameter, getParameterValues, getContentType 등의 메소드를 사용해서 조회할 수 있다.
2. response 객체
요청에 대한 처리 결과로 클라이언트에게 보낼 응답 정보를 저장하는 객체이다.
Servlet의 service(), doGet(), doPost() 등의 두번째 parameter로 전달되는 HTTPServletResponse 객체와 동일하다.
response 객체의 기능은 resonse message의 header 정보 설정, error 응답 처리, redirection 수행 등이 있고, serContentType, sendError, sendRedirect 등의 메소드를 사용해서 기능을 구현할 수 있다.
response 객체의 기능 중 redirection은 웹 서버가 클라이언트에게 다른 url로 이동하라고 지시하는 기능이다.
- redirect 지시 후에는 클라이언트로부터 새로운 request message가 생성되고 기존 request 객체는 삭제되어 재사용이 불가하다.
- response.sendRedirect(String location) 에서 location에 url이나 같은 어플리케이션 내에 있는 jsp 파일을 넣어 요청할 수 있다.
- html form에서 submit할 경우 일반적으로는 action에 설정한 위치가 주소창에 찍힌다. 근데 그 안에서 redirect 지시가 있을 경우 redirect 후의 url이 주소창에 찍힌다. 사용자 입장에서는 내부 처리라 과정을 모르는데 아무튼 redirect를 거쳐서 띄워진 페이지이다.
데이터 저장 영역
request, session, application 객체
- 사용자가 속성을 통해 값, 객체를 저장 및 참조할 수 있음
- 서로 다른 저장 영역과 scope(생성 및 소멸 시점)을 가짐
- HttpServletRequest request : 요청 객체, 다른 page를 include하거나 다른 page로 forward할 때 전달됨(중간 결과 느낌), response message가 return될 때까지가 scope임
- HttpSession session : 각 클라이언트마다 여러 request들에 대해 유지 및 공유되는 영역, Servlet에서는 request.getSession()으로 생성 또는 획득함, 장바구니 같은 느낌
- ServletContext application : Web container에서 관리하며 모든 클라이언트에서 공유 가능함, Servlet에서는 this.getServletContext()로 획득함, 톰캣 실행되는 동안은 저장됨
- 속성 저장 및 참조를 위한 메소드로 setAttribute, getAttribute 등이 있다.
JSP 지시자
JSP page가 요청되어 실행될 때 해당 페이지를 어떻게 처리할 것인지 JSP container에게 알리는 역할을 한다.
<%@ 지시자이름 속성1="값1" 속성2="값2" .. %> 형식으로 작성하고, 종류에는 page, include, taglib이 있다.
1. page 지시자
JSP page의 여러 가지 속성을 정의한다. page 지시자의 속성은 다음과 같다.
- contentType : JSP page가 생성하는 문서의 종류 및 문자 집합을 지정
- import : JSP page에서 사용할 자바 클래스를 import할 때 지정
- extends : JSP page -> Servlet 변환 시 변환한 Servlet 클래스가 상속받을 클래스를 표현
- session : JSP page가 HttpSession을 사용할 것인지 결정, JSP page를 요청한 측과 지속적인 연결을 할 것인지 아닌지를 결정, 기본값은 true
- buffer : JSP page에 의해 생성된 결과(html)를 저장하는 임시공간의 크기를 결정, none일 경우 임시공간 없이 바로 클라이언트에게 결과 전달, 기본값은 8KB
- autoFlash : buffer가 다 채워졌을 경우 저장된 내용을 자동으로 클라이언트로 전송할지 여부를 결정, 기본값은 true
- isThreadSafe : 하나의 JSP page에 대한 요청들을 multi-thread로 처리할 것인지 결정, 기본값은 true
- pageEncoding : JSP page 내의 글자를 어떤 방식으로 인코딩할 것인지 지정
- errorPage : JSP page 처리 도중 예외가 발생할 경우 예외를 처리할 JSP page를 지정
- isErrorPage : 이 속성을 갖는 JSP page가 error를 처리하는 JSP page인지 지정, 기본값은 false
2. include 지시자
여러 JSP page에서 공통으로 사용되는 부분을 별도의 JSP page로 만들어 놓고 이를 특정 JSP page에 포함시킬 때 사용한다. include한 JSP page를 포함해 하나의 servlet을 생성한다. 하나처럼 합쳐져서 parsing되고 Java 객체가 생성된다. 하나가 되기 때문에 변수 공유가 가능하나, 변수의 이름을 중복해서 사용할 수 없다.
JSP Action Tags
특정 동작이 일어날 때 JSP page를 제어하기 위해 사용한다.
JSP page들 사이의 흐름 제어, Java Applet 지원, JavaBeans와의 상호작용을 지원한다.
Action Tags의 종류로는 include, forward, plug-in, useBean, setProperty, getProperty가 있다.
1. include Action
JSP page에 다른 resource(JSP page, servlet, html file)을 포함시킨다.
- include 지시자와 유사하나, 포함되는 page를 먼저 실행 후 그 실행 결과를 현재 page에 포함시키는 점이 다름
- 각 페이지는 독립적으로 컴파일되어 실행되어 변수 공유 불가 -> 다른 페이지에서 쓰고 싶은 변수라면, set메소드로 속성 저장 후 get메소드로 읽어야함
- request 및 response 객체가 전달됨
- jsp:param 태그를 이용해 추가적인 파라미터 전달 가능
- 형식은 <jsp:include page="local URL" />
a.jsp가 b.jsp를 include하면, 요청이 b.jsp로 넘어간다. html 결과를 다른 jsp에서 각각 출력 후 합친다.
include 지시자는 먼저 합치고 컴파일, 실행하고 include Action은 개별로 컴파일, 실행 후에 합친다.
2. forward Action
include Action보다 많이 쓴다.
JSP page에서 다른 resource로 제어를 넘긴다.
- 사용자의 선택에 따라 다른 JSP page로 이동하고자 할 때 사용
- request 및 response 객체가 전달됨 (Redirection과 차이점)
- jsp:param 태그를 이용해서 추가적인 파라미터 전달 가능
- 기존 page로 되돌아올 수 없음
- 형식은 <jsp:forward page="local URL" />
Redirection: a.jsp 끝에서 b.jsp로 redirect할 수 있다. a.jsp와 b.jsp가 따로 실행되고 둘 사이에 파라미터 전달 불가하다.
forward Action: a.jsp 끝에서 b.jsp로 forward할 수 있다. a.jsp와 b.jsp가 따로 실행되고 둘 사이에 파라미터 전달 가능하다.
forward Action에서 a.jsp는 이제 더 실행되지 않는다. b.jsp에서 응답을 바로 보낸다. 역할 분담 느낌이다. include Action에서는 각각 결과 출력 후 요청한 곳으로 차례대로 되돌아가며 응답을 보낸다.
pageContext 내장 객체 활용
javax.servlet.jsp.PageContext pageContext
- Servlet에서 자동으로 생성된 내장 객체 관리
- forward 및 include 기능 제공
Servlet이 먼저 실행되고 Servlet에서 다른 JSP로 forwarding한다.
MVC에서는 모든 request가 하나의 정해진 Servlet으로 와서 계산 등의 실행을 한 후 JSP로 forwarding해 결과를 넘기고 화면 출력을 JSP에서 한다.
Servlet에서 JSP로의 forward/include
javax.servlet.jsp.RequestDispatcher interface의 method 이용
- void forward(ServletRequest request, ServletResponse response)
- void include(ServletRequest request, ServletResponse response)
request 객체에 set메소드로 이전의 결과를 다 저장해놓고 JSP로 forwarding한다.
JavaBeans 클래스 정의
일반적인 Java 클래스 정의와 유사하지만 특정 규칙을 따라야 한다.
- JavaBeans 클래스가 갖는 멤버 변수(property)는 private으로 선언
- private으로 선언한 변수의 값을 설정하고 읽기 위한 public 메소드를 선언 (setter/getter)