JSP2.2 & Servlet3.0 챕터1 정리
오정원 지음 / 출판사 혜지원
서블릿(Servlet) : 동적 웹 구현 기술. 자바를 기반으로 하여 객체 지향적, 플랫폼 독립적, 스레드를 써서 사용자가 다수일수록 효율적.
프로세스: 실행 중인 상태의 프로그램을 말함.
스레드(Thread) : 하나의 프로세스 내에서 해당 프로세스가 할당받은 자원을 공유함. (프로세스의 자원을 참조할 뿐 새로 자원을 할당받는게 아니기 때문에 생성이 빠름)
3-tier 구조: 클라이언트, 결과 페이지를 전송하는 웹 서버, 비즈니스 로직이 구현되어 있는 어플리케이션 서버(ex: EJB로 구현되어 있는 WAS)
SOA(Service Oriented Architecture) : 1996년 가트너(Gartner) 그룹에 의해 처음 소개됨. 프로젝트 중심의 개발이 아니라 서비스를 중심으로 개발하는 것. 재활용성이 높아지며 비용절감과 효율성 증대
에 최적.
기존 CGI 방식의 가장 큰 단점은 서버 자원의 낭비 -> JSP는 스레드로 극복. 요청에 맞는 JSP 페이지의 서블릿 인스턴스를 단 한 번 생성하고, 이후 같은 요청이 들어올 경우 이미 있는 인스턴스에 스레
드 단위로 요청을 처리
인스턴스(Instance) : 클래스로부터 만들어진 객체를 뜻함. (클래스를 객체로 만드는 과정: Instantiate(인스턴스화)).
객체와 인스턴스의 차이: 인스턴스는 실제 사용할 수 있게 메모리에 생성된 객체.
MVC 패턴 (Model-View-Controller) : 중대형 프로젝트에서 효율적이라 평가받는 디자인 패턴. JSP(View) – 자바빈즈(Model) – 서블릿(Controller) 로 분업하여 효율적인 개발가능.
※ 디자인 패턴 : 문제 해결을 위한 지침. 효과적이라 판명받은 설계구조.
서블릿(Servlet): HTML은 정적임. 사용자 요청에 따라 HTML을 생산해낼 수 있는 자바 진영의 기술이 서블릿임.
웹 서버 상에서 실행되는 자바의 클래스 파일임. javax.servlet.Servlet 인터페이스를 구현(Implements)해서 작성해야만 함. 입력과 출력을 HTTP 프로토콜의 요청(Request)과 응답(Response)의 형태로 다
룬다는 점만이 일반 클래스와 다르다. Server Side Applet, 서버 사이드의 자바 응용 프로그램이라는 뜻.
※ 애플릿(Applet): 패널(Panel)을 상속하는 클래스로, 웹 브라우저에 담겨서 실행되는 작은 응용 프로그램을 말함.
※ JSP에 서블릿이 꼭 필요한가: JSP로 요청이 되어도 컨테이너는 JSP 파일을 서블릿 형태의 자바코드로 변환한 후 서블릿 라이프사이클을 거쳐 요청을 처리함. 어차피 같음.
HTTP(HyperText Transfer Protocol) : 웹 브라우저 통신에 관한 규약.
※ 프로토콜(Protocol) : 통신규약
□ HTTP 프로토콜의 구조: HTTP 프로토콜은 요청(Request)과 응답(Response)로 나뉨.
HTTP ┌ Request ┌ GET
│ └ POST
└ Response
HTTP 메시지 : 시작라인+헤더(일반헤더+요청 또는 응답헤더)+바디(메시지)
(1) Request (HTTP 요청 메시지) : GET 방식의 요청메시지와 POST 방식의 요청메시지로 나뉨.
-GET방식의 요청 : 길이 256바이트를 넘을 수 없음. 바디(본문)이 없기 때문에 조금 빠름.
시작라인 : GET /myhome/mypage.jsp?name=’woo_sung_ho’&email=’bb_@naver.com’ HTTP/1.1
요청헤더 : Host:www.myhome.com
User-Agent: Mozilla/5.0 …
(바디: 없음)
-POST방식의 요청: 파라미터가 바디에 속해 보이지 않음. 보안상 유용.
시작라인 : GET /myhome/mypage.jsp HTTP/1.1
응답헤더 : Host:www.myhome.com
User-Agent: Mozilla/5.0 …
바디: name=’woo_sung_ho’&email=’bb_@naver.com’
(2) Response (HTTP 응답 메시지)
□ 웹 서버
웹 서버는 HTTP서버와 웹 컨테이너로 나뉨.
-HTTP 서버 : 어떤 URL 요청이 들어왔을 경우 미리 매핑되어 있는 콘텐츠(HTML파일이나 이미지)를 응답 형태로 전송함.
단, 요청 URL이 서블릿 클래스 또는 JSP 파일(ex: http ://www.servlet.com/servlet 또는 http ://www.servlet.com/home.jsp)일 경우 HTTP서버는 요청을 웹 컨테이너로 넘김.
-웹 컨테이너(Web Container) : 요청된 URL에 따라 미리 설정된 서블릿 클래스 또는 JSP 파일을 실행하여 결과를 HTTP 서버에 넘겨줌.
ex) 자카르타 톰캣, 웹로직, Resin
※ 서블릿 컨테이너: 서블릿 컨테이너에 대한 웹 컨테이너 / JSP 컨테이너: JSP 파일에 대한 웹 컨테이너.
서블릿 컨테이너, JSP컨테이너 모두 웹 컨테이너에 속함.
클라이언트 —– 웹 서버 —– 컨테이너
□ 서블릿의 동작 원리
1. 클라이언트: http ://servlet.com/servlet 요청
2. 웹서버: 요청된 서블릿 확인후 컨테이너로 요청
3. 컨테이너: request와 response 객체 생성후 web.xml 참조하여 해당 서블릿의 스레드 생성 후 service 메소드 호출
4. 컨테이너: service 메소드에서는 요청 방식에 따라 doGet이나 doPost 메소드 호출
5. doGet이나 doPost 메소드에서 응답 생성
또는,
1. 사용자의 URL요청
2. request,response 객체 생성
3. 서블릿 인스턴스와 스레드 생성
4. service() 메소드 호출과 서블릿 클래스 실행
5. 응답과 스레드의 소멸
<서블릿의 동작 원리 설명>
사용자 URL 요청
-> 배포 서술자에 따라, 서블릿을 담당하는 웹 컨테이너로 요청 전달
-> request와 response객체 생성 (javax.servlet.http.HttpServletRequest 객체 타입,
javax.servlet.http.HttpServletResponse 객체 타입)
-> 배포 서술자에 따라, 필요한 서블릿 클래스를 알아내고 인스턴스 생성
※ 해당 클래스가 메모리에 없으면 인스턴스를 생성(메모리에 로드)하고, init() 메소드 실행으로 초기화하여 스레드 하나 생성함. 이미 인스턴스가 있다면 기존 인스턴스에 스레드만 하나 새로 생성. 각 서블릿 인스턴스는 웹 컨테이너당 하나만 존재하므로 init()메소드는 각 서블릿당 한 번씩만 호출된다.
※ 배포 서술자(Deployment Descriptor) : URL과 서블릿 클래스를 미리 매핑시켜 놓은 파일. ex) web.xml
-> 스레드가 생성되면 각 스레드에서 service()메소드가 호출되며, HTTP요청방식에 따라 doGet() 또는 doPost() 메소드가 request, response 객체를 인자로 자동 호출됨.
※ 개발자는 doGet(), doPost() 메소드 부분에 페이지 생성을 할 수 있는 코드를 만들어야 함.
-> doGet(), doPost()메소드에서 동적인 웹 페이지를 생성했다면 결과물을 response 객체에 담아 웹 컨테이너가 HTTP 응답(Response) 형태로 바꾸어 웹 서버로 전송. 사용이 끝난 request, response 객체를 소멸시키고 스레드를 종료하게 됨.
-> 웹 서버는 HTTP 응답 메시지를 사용자 브라우저로 전송하고 사용자는 브라우저를 통해 동적으로 생성된 페이지를 받아보게 됨.