서블릿(Servlet)
자바 코드를 작성하다 보면 종종 마주하게되는 서블릿(Servlet)이 있다. 과연 서블릿이란 무엇일까?
서블릿이란 자바를 사용해 웹페이지를 생성하는 서버측 프로그램, 혹은 그 사양을 의미한다.
즉, 클라이언트가 요청을 하면 그에 대한 결과를 다시 전송해주는 역할을 하는 클래스를 말한다.
서블릿은 Java EE*에 포함된 스펙 중 하나로 자바에서 HTTP 요청과 응답을 처리하기 위한 내용을 담는다.
일반적으로 웹서버는 정적인 페이지를 제공하는데, 동적인 페이지 제공을 위해서는 다른곳에서 필요한 정보를 가져와야한다.
이 때 동적인 페이지 정보를 가져올 수 있도록 도와주는 애플리케이션이 서블릿이이다.
[Servlet 동작 방식]
1. 클라이언트가 요청 보내면 Servlet Container로 HTTP Request가 전송됨
2. Servlet Container가 HttpServletRequest, HttpServletResponse 객체를 생성함
3. 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 검색함
4. 타겟 서블릿에서 해당하는 메서드(service) 호출한 뒤 HTTP 요청에 따른 동작을 수행함(ex. Post, Get 등)
5. post, get 메소드를 통해 동적 페이지 생성 후 HttpServletResponse 객체에 응답을 보냄
6. 응답이 종료되면 HttpServletRequest, HttpServletResponse 객체를 소멸시킴
위 과정에서 언급되는것이 Servlet Container이다.
Servlet Container는 Web Container라고도 불리며 서블릿의 생명주기를 관리하고 URL과 특정 서블릿을 매핑하는 역할을 한다.
클라이언트의 요청을 받고 응답할 수 있도록 웹서버와 소켓으로 통신한다. 대표적으로 톰캣(Tomcat)이 있다.
[Servlet 생명주기]
서블릿의 생명 주기는 초기화(initialize), 서비스(service), 소멸(destroy)의 세단계로 구성된다.
일반적으로 웹 애플리케이션은 HTTP 프로토콜을 기반으로하므로 추상클래스인 HttpServlet을 상속받아서 만들게 된다.
1. 초기화: 클라이언트 요청이 들어오면 해당 서블릿이 메모리에 있는지 확인하고, 없을 경우 init() 메서드를 호출해 적재한다.
2. 서비스: 클라이언트 요청에 따라서 service() 메서드를 통해서 요청에 맞는 동작을 수행한다.
3. 소멸: 컨테이너가 서블릿에 종료 요청을 하거나 런타임 오류가 발생하면 서블릿이 언로드 된다.
[DispatcherServlet]
우리가 쉽게 접할 수 있는 서블릿으로 DispatcherServlet이 있다. Spring MVC(API 계층)에서 언급했던 내용이다.
DispatcherServlet도 HttpServlet 을 상속받은 클래스로 클라이언트의 요청을 받고 적합한 응답을 리턴해준다.
참고: 2023.04.11 - [부트캠프 개발일기/Spring MVC] - 부트캠프 41일차 - Spring MVC(API 계층)
실제로 현재 구현중인 커피 주문 애플리케이션을 실행하고 Coffee 메뉴 Post 요청을 하면,
아래와 같이 DispatcherServlet이 호출되는것을 볼 수 있다.
별도로 설정을 하지 않았는데도 DispatcherServlet 이 설정되는 이유는 스프링 부트의 자동 설정기능때문이다.
스프링 부트의 spring-boot-starter-web 의존성을 추가하면 웹 애플리케이션 개발을 위한 여러가지 설정이 자동으로 추가된다.
따라서 클라이언트로부터 요청이 왔을 때 자동으로 생성된 DispatcherServlet이 요청을 받고, 적절한 응답을 할 수 있도록 해준다.
* 개인 학습용 기록입니다. 잘못된 부분이나 추가가 필요한 부분이 있다면 편하게 말씀해주세요 :)
참고자료
도서: 스프링부트로 배우는 자바 웹개발(저자: 윤석진, 출판사: 주식회사 제이펍)
'추가 공부 > 개념학습' 카테고리의 다른 글
데이터베이스 - 관계대수(Relational Algebra) (0) | 2023.10.16 |
---|---|
Github SSH 등록, Github CLI 인증 (0) | 2023.09.13 |
코드 컨벤션 설정: Formatter, CheckStyle 적용(intelliJ) (0) | 2023.08.24 |
[Spring] HandlerInterceptor (0) | 2023.06.11 |