[Java] HttpServlet
HttpServlet
HttpServlet은 GenericServlet을 상속하고 있고 GeneralServlet은 Servlet을 구현한 클래스이다.
그럼 차례대로 알아보자.
Servlet
Servlet은 서블릿 생명주기와 정보에 관련된 메서드들이 선언되어 있다.
- init()
- servlet이 처음 로딩될 때 한 번 호출되는 메서드
- 예외가 생겼을 경우 UnavailableException이나 ServletException 발생
- service()
- client로부터 servlet에 대한 요청이 있을 때 호출되는 메서드
- 성공적으로 Init() 메서드가 호출되면 수행된다.
- client의 요청 방식에 따라 get일 경우 doGet(), post일 경우 doPost() 메서드를 호출한다
- destroy()
- servlet이 메모리로부터 제거될 때 호출되는 메서드
- servlet 객체가 더 이상 서비스 하지 않고 있는 경우 메모리에서 제거되며 이때 destroy() 메서드가 호출된다.
- destroy()가 호출되면, GC는 servlet 객체를 제거한다.
- getServletConfig(): servlet이 시작할 때 필요한 정보
- getServletInfo(): 작성자, 버전, 저작권 같은 기본 정보
GenericServlet
GenericServlet은 Servlet 인터페이스를 구현한 추상 클래스로, 클라이언트-서버 환경에서 서버 단의 애플리케이션으로서 필요한 기능을 구현한다.
servlet() 메서드를 제외한 모든 메서드를 재정의하여 적절한 기능으로 구현되어있다.
즉, 우리가 Servlet 인터페이스를 구현해서 Servlet 클래스를 작성하려면 안에 선언되어 있는 5개의 메서드를 모두 구현해야한다. 하지만 GenericServlet을 상속하면 service()만 별도로 구현해주면 된다.
여기서 주의할 점은 GenericServlet은 애플리케이션 프로토콜에 따라 메서드를 재정의 해야한다는 것이다.
HttpServlet
HttpServlet은 GenericServlet을 상속하고 service() 메서드를 재정의하여 HTTP 프로토콜에 알맞은 동작을 수행하도록 구현한 클래스이다.
즉, HTTP 프로토콜 기반으로 브라우저로부터 요청을 전달받아서 처리하도록 하는 클래스이다.
service() 메서드는 요청 방식에 따라 doGet(), doPost() 등 정해진 사양의 메서드가 호출되도록 구현되어 있다.
HttpServlet을 상속하면 필요한 메서드만 재정의하여 구현할 수 있다.
Servlet Life Cycle
- client로부터 요청 받음
- client가 브라우저를 통해 요청을 보내면 웹 서버는 이를 받아서 요청 정보의 헤더 안에 있는 URI를 분석한다. 이때, 요청 받은 페이지가 서블릿이면 서블릿 컨테이너에 처리를 넘긴다.
- 서블릿 컨테이너는 요청받은 서블릿을 WEB-INF/classes나 WEB-INF/lib에서 찾아 실행 준비를 한다.
- 최초 요청 여부 판단
- 서블릿 컨테이너는 현재 실행할 서블릿이 최초의 요청인지 판단한다.
- 실행할 서블릿 객체가 메모리에 없으면 최초 요청이고, 이미 있으면 아닌 것으로 판단한다.
- 서블릿 객체 생성
- 서블릿 컨테이너는 요청받은 서블릿이 최초 요청이면 해당 서블릿을 메모리에 로딩하고 객체를 생성한다.
- 서블릿은 최초 요청이 들어왔을 때 한 번만 객체를 생성하고 이때 생성된 객체를 계속 사용한다.
- init() 호출
- init()은 처음 요청 시 서블릿 객체가 생성된 다음 호출되므로 주로 서블릿 객체의 초기화 작업이 구현되어 있다.
- GenericServlet 클래스에 구현된 내용을 바꾸고 싶다면 init() 메서드를 재정의하여 구현할 수 있다.
- service() 호출
- service()는 실행하는 서블릿의 요청 순서에 상관없이 client의 요청이 있을 때마다 실행된다. 때문에 service() 에는 실제 서블릿에서 처리해야 하는 내용이 구현되어 있다.
이렇게 보면 프로그램의 실행 흐름을 개발자가 아닌 컨테이너가 제어한다는 것을 알 수 있다. 이를 "제어의 역전(IoC, Inversion of Control)" 이라고 한다.
따라서 Java EE 기반 프로그램을 개발할 때는 먼저 애플리케이션 컨테이너들이 프로그램을 어떤 순서로 동작시키는지 알고 해당 순서에 맞게 개발해야 한다.
콜백 메서드
콜백 메서드(callback method)란, 어떤 객체에서 어떤 상황이 발생하면 컨테이너가 자동으로 호출하여 실행되는 메서드를 의미한다.
Servlet에는 init(), service(), destroy() 가 콜백 메서드에 속한다. 이 메서드들은 서블릿 객체에 어떤 event가 발생하면 호출된다.
추가적으로 템플릿 콜백 패턴을 참고하는 것을 추천한다
'Language > Java' 카테고리의 다른 글
[Java] 숫자형 스트림 (0) | 2023.04.11 |
---|---|
[Java] 스트림 연산 (0) | 2023.04.07 |
[Java] 스트림(Stream) (0) | 2023.04.06 |
[Java] 메서드 참조 (0) | 2023.04.04 |
[Java] 람다 타입 검사/추론/제약 (0) | 2023.04.04 |
댓글
이 글 공유하기
다른 글
-
[Java] 숫자형 스트림
[Java] 숫자형 스트림
2023.04.11 -
[Java] 스트림 연산
[Java] 스트림 연산
2023.04.07 -
[Java] 스트림(Stream)
[Java] 스트림(Stream)
2023.04.06 -
[Java] 메서드 참조
[Java] 메서드 참조
2023.04.04