[JSP] 서블릿(Servlet)
서블릿(Servlet)의 개요
브라우저는 기본적으로 HTML 형식의 문서만 표시할 수 있어 동적 웹 페이지 표현에 한계가 있다.
이 한계를 극복하기 위해 웹 서버측에서 사용자 요구에 따라 생성된 HTML 페이지를 생산해 전송할 수 있는 기술이 서블릿이다.
서블릿은 웹 서버에서 실행되는 자바의 클래스 파일이라 할 수 있다. (확장자가 .java임)
기본적으로 자바의 모든 API를 사용할 수 있으며 객체지향성 등 자바의 장점을 갖고 있다. 하지만 서블릿은 반드시
javax.servlet.Servlet 인터페이스를 implement하여 작성(Servlet 인터페이스를 구현한 추상클래스를 상속하기도 함)
하고 HTTP 프로토콜을 Request, Response 형태로 다룬다는 점만이 다르다.
JSP의 요청또한 컨테이너가 JSP파일을 서블릿 형태의 자바 코드로 변환한 후 서블릿의 라이프사이클을 거치면서 요청을 처리해준다. JSP와 서블릿은 크게 다른 개념이 아니며 서블릿만을 사용해 웹을 만들면 화면구현이 어려워 JSP를 사용하는 것. 그러므로 서블릿을 이해한다면 JSP또한 빠르게 이해할 수 있다.
웹 컨테이너란?
웹 서버는 URL 주소 해석을 담당하는 HTTP 서버와 서블릿클래스 혹은 JSP 파일의 요청을 처리해주는
웹 컨테이너(Web Container)로 구성된다.
HTTP 서버는 특정 주소(URL) 요청이 들어왔을 경우 그 주소에 매핑되어있는 콘텐츠(HTML 파일이나 이미지)를 사용자에게 응답형태로 전송하는 역할을 한다.
이 때 요청된 URL이 서블릿혹은 JSP파일일 경우 HTTP서버는 이를 웹 컨테이너에 넘겨서 처리한다.
웹 컨테이너는 요청된 URL에 맞는 서블릿 혹은 JSP파일을 실행하여 그 결과를 다시 HTTP서버에 넘겨 사용자에 전송한다.
즉 웹 컨테이너는 웹 서버 내부에서 서블릿, JSP파일을 실행하기 위한 환경을 제공하며 서블릿 클래스에 대한 웹 컨테이너를 서블릿 컨테이너, JSP파일에 대한건 JSP 컨테이너라고 하나 둘을 합쳐 웹 컨테이너(서블릿 컨테이너)로 통칭하는 경우가 많다고 함
대표적인 웹 컨테이너로 자카르타 톰캣, 웹로직, Resin등이 있다.
서블릿의 동작 원리
서블릿은 컨테이너가 있어야만 동작할 수 있다.
그러면 사용자가 서블릿 요청을 보냈을 때 서블릿이 어떤 원리로 동작하고 서블릿 컨테이너가 어떻게 서블릿 클래스를 실행시킬까
1. 사용자의 URL 요청
특정 URL 요청이 서블릿 요청임을 알기 위해서는 배포 서술자 혹은 기술자(Deployment Descriptor)가 필요하다.
배포서술자는 WEB-INF폴더안의 web.xml 기술되어 있는 내용이며 서블릿 3.0버전부터는 web.xml없이도 서블릿 파일 내 Annootation으로 @WebServlet를 붙여주어 배포서술자를 기술할 수 있다.
배포 서술자를 통해 서블릿 요청임을 파악하고 웹 컨테이너로 전달한다.
위 사진의 빨간박스 안 @WebServlet 각주부분이 서블릿의 DD 어노테이션이다.
2. requaest, response 객체 생성
요청과 응답을 처리하기 위해 javax.servlet.http 패키지에 있는
HttpServletRequest와 HttpServletResponse객체를 생성한다.
3. 서블릿 인스턴스와 스레드 생성
request, response 객체 생성 후 어떤 서블릿 클래스를 필요하는지 배포 서술자를 통해 알아낸다.
만일 그 클래스가 웹 컨테이너에 실행된 적 없거나 메모리에 생성되어 있는 인스턴스(프로세스)가 없다면 새로 인스턴스를 생성하고(메모리에 로드) init() 메소드를 실행하여 초기화한 뒤 스레드를 하나 생성한다. 이미 인스턴스가 존재할 경우 새로 인스턴스를 생서하지 않고 기존 인스턴스에 스레드만 하나 새로 생성한다.
각 서블릿 인스턴스는 웹 컨테이너당 하나만 존재하기 때문에 init() 메소드는 각 서블릿 당 한번만 호출된다.
4. service() 메소드 호출과 서블릿 클래스 실행
스레드가 생성되면 각 스레드에서 service() 메소드가 호출된다. HTTP 요청에 따라 doGet() 혹은 doPost() 메소드가 request, response 객체를 자도으로 호출한다. 따라서 doGet, doPost메소드가 웹페이지를 생성하는 메소드이다.
5. 응답과 스레드 소멸
결과물이 담긴 response 객체를 웹 컨테이너가 HTTP 응답(Response) 형태로 바꾸어 웹 서버로 전송한다.
그리고 사용이 끝난 요청, 응답 객체를 소멸시키고 스레드를 종료한다.
이 때 destory() 메소드가 있으면 이를 실행시키고 종료한다.
서블릿 배포 서술자(web.xml) 요소
<servlet>
<servlet-name>설정 파일 내부에서 사용하는 임의 서블릿 명</servlet-name>
<servlet-class>요청에 처리될 실제 서블릿 명</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> 맵핑에 사용되는 서블릿 명 (2번과 동일해야함) </servlet-name>
<url-pattern>url 상에 요청될 서블릿 명</url-pattern>
</servlet-mapping>
서블릿 요청 방식
1. GET 방식
서버에 존재하는 간단한 페이지 요청, 글 목록 페이지에서 페이지 번호 요청과 같이 간단한 파라미터를 전송하는 경우 사용한다.
ex) <a href="list.jsp?pageNo=2">[2]</a>
GET방식이 사용되는 경우
1. 주소 표시줄에 직접 입력하여 요청하는 경우
2. a태그 링크로 전송하는 경우
3. 폼 태그에서 method 속성을 GET으로 지정하는 경우
<form action="" name= "" method="GET">
2. POST 방식
단순 페이지 요청이 아닌 특정 페이지로 많은 양의 파라미터를 전송해야 할 때 사용한다.
회원가입 요청, 게시판 글쓰기, 자료실 업로드 등 POST 사용한다.
POST방식이 사용되는 경우
POST방식으로 요청을 전송하려면 반드시 HTML의 form태그에서 POST속성을 지정해주어야 한다.