코딩기록
서블릿과 서블릿 컨테이너 정리 본문
1. 서블릿
서블릿이란?
WebProgramming에서 Client의 요청을 처리하고 그 결과를 다시 Client에게 전송하는 자바 웹 프로그래밍 기술
서블릿을 사용하는 이유
서블릿을 사용하지 않고 직접 HTTP 통신으로 오고가는 문자열을 파싱하여 서블릿과 같은 기능을 구현해도 무방하지만, 이미 편리하게 사용할 수 있는 서블릿을 놔두고 직접 문자열 파싱을 구현하는 것은 개발자가 온전히 비즈니스 로직에 집중하지 못하게 만들 수 있다.
개발자는 서블릿을 통해 문자열 파싱 등에 열올리지 않고 비즈니스 로직에 더욱 집중할 수 있다.
서블릿 동작 방식
1. 개발자가 서블릿 소스코드(.java)를 작성한다.
2. 소스코드가 빌드 시 컴파일되어 서블릿 클래스(.class)가 된다.
3. 해당 서블릿 클래스가 톰캣과 같은 서블릿 컨테이너에 등록된다.
4. 클라이언트가 특정 경로에 대한 HTTP Request를 보낸다.
5. HTTP Request에 상응하는 서블릿이 실행된다.
6. 서블릿 메소드가 실행된다.
7. DB 연동 작업이 필요한 경우 DB 연동이 실행된다.
8. 완성된 데이터를 클라이언트에게 반환한다.
2. 서블릿 컨테이너
서블릿 컨테이너란?
위와 같이 서블릿은 클라이언트의 요청을 처리하고 반환하는 것이다. 그런데 서블릿만으로는 한계가 있는 것이, 클라이언트가 URL을 입력하여 요청을 하게 되면 정보를 처리하기 위해 스레드를 만들고 객체를 생성하고 직접 서블릿을 맵핑하는 등의 작업이 있어야 한다
이를 처리하는 것이 서블릿 컨테이너이다
서블릿 컨테이너의 대표적인 예로 톰캣(Tomcat)이 있다. 톰캣은 실제로 웹 서버와 통신하여 JSP(자바 서버 페이지)와 Servlet이 작동하는 환경을 제공한다.
역할
1. 웹서버와의 통신지원
서블릿과 웹서버가 손쉽게 통신할 수 있게 소켓을 만들고, Listen, Aceept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 도와준다.
2. 서블릿 생명주기 관리
서블릿 클래스를 로딩하여 인스턴스화
초기화 메서드를 호출
요청이 들어오면 적절한 서블릿 메서드 호출
서블릿 소멸 시 가비지 컬렉션 진행
3. 멀티쓰레드 지원 및 관리
서블릿 컨테이너는 요청이 올 때마다 새로운 자바 쓰레드를 생성하며, HTTP 서비스 메소드를 다 실행하고 나면 쓰레드는 자동으로 종료된다.
4. 선언적인 보안 관리
서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다.
일반적으로 보안관리 XML 배포 서술자에 기록하므로 보안에 대해 수정할 일이 생겨도 자바 소스코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다.
동작원리
1. 클라이언트가 HttpRequest 요청을 하면 이것을 웹서버가 받아 서블릿 컨테이너로 전송한다.
2. HttpRequest를 전송받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성하며, 이 두 객체에 클라이언트가 파라미터 등에 보낸 정보를 담는다.
3. 요청 URL을 분석하여 어느 서블릿에 요청한 것인지 찾는다. web.xml 확인
4. 해당 서블릿에서 service() 메서드를 호출한 후 GET, POST 여부에 따라 doGet() 또는 doPost()를 호출한다.
5. doGet() 또는 doPost()가 동적 페이지를 생성한 후에 HttpServletResponse 객체 응답을 보낸다
6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
javax.servlet에 정의된 인터페이스
서블릿의 생명주기 관리를 위한 세 가지 필수적인 메소드를 정의
init() : 서블릿 생명주기 중 초기화 단계에 호출
service() : 초기화 이후 각 요청들이 들어오면 호출됨
destroy() : 서블릿 객체가 파괴되어야 할 때 호출