서블릿(Servlet)
- 웹 페이지의 동적 컨텐츠를 제공할 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술
- 웹 페이지에서 클라이언트의 다양한
요청(Request)
과 응답(Response)
을 개발자가 일일이 처리하면 굉장히 힘들어질테니 Servlet이 역할을 대신하여 간단한 메서드 호출만으로 이를 체계적으로 다룰 수 있게 해준다.
- 예를 들어 사용자가 웹 사이트에 로그인을 하려고 할 때, 사용자는 아이디와 비밀번호를 입력하고 로그인 버튼을 누른다. 이때 서버는 클라이언트의 아이디와 비밀번호의 정보를 확인하고, 다음 페이지를 띄워주어야 하는데, 이러한 역할을 수행하는 것이 바로 서블릿이다.
- 즉, 서블릿은 자바를 사용하여 동적인 웹 서비스를 만들기 위해 필요한 프로그램이다.
서블릿(Servlet) 특징
- 클라이언트의
요청(Request)
에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- HTML을 사용하여 요청에
응답(Response)
- Java Thread를 이용하여 동작
- MVC 패턴에서 Controller로 이용된다.
- HTTP 프로토콜 서비스를 지원하는
javax.servlet.http.HttpServlet
클래스를 상속받는다.
- HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.
서블릿 컨테이너(Servlet Container)
- 서블릿을 담고 관리해주는 컨테이너이다.
- 클라이언트에서 요청을 보내면 서블릿 컨테이너는
HttpServletRequest
, HttpServletResponse
두 객체를 생성하며 GET
, POST
여부에 따라 동적인 웹 페이지를 생성한 후 응답을 보낸다.
HttpServletRequest
- HTTP 프로토콜의 요청 정보를 서블릿에게 전달하기 위한 목적으로 사용한다.
- 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와 Body의 Stream을 읽어 들이는 메서드를 가지고 있다.
HttpServletResponse
- 해당 클라이언트에게 응답을 보내기 위한 객체를 생성하여 서블릿에게 전달한다.
- 이 객체를 활용하여 Content type, 응답 코드, 응답 메시지 등을 전송한다.
서블릿 컨테이너(Servlet Container)의 역할
- 웹 서버와의 통신 지원
- 웹 서버와의 통신을 할 때 소켓을 만들고, listen, accept 등의 과정을 서블릿 컨테이너가 API로 제공하여 복잡한 과정은 생략하고 서블릿과 웹 서버가 쉽게 통신할 수 있도록 해준다.
- 이를 통해 개발자는 비즈니스 로직에만 더욱 집중할 수 있게 된다.
- 서블릿 생명주기 관리
- 서블릿 컨테이너가 기동되는 순간 서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 호출한다.
- 서블릿이 생명을 다 한 순간에는
Garbage Collection
을 진행하여 알아서 메모리에서 지워준다.
- 멀티스레드 지원 및 관리
- 서블릿이 동시에 여러 요청이 들어와도 멀티스레드로 동시다발적인 작업을 관리할 수 있다.
- 선언적인 보안 관리
- 서블릿 또는 자바 클래스 안에 보안 관련된 메서드를 구현하지 않아도된다.
서블릿 생명주기(Servlet LifeCycle) 메서드
- init()
- 서블릿을 초기화하며 처음에 한 번만 실행된다.
- service()
요청(Request)
과 응답(Response)
을 처리하며 요청이 GET
인지 POST
인지 구분하여 doGet()
또는 doPost()
로 분기된다.
- destroy()
서블릿(Servlet) 동작 과정
- 클라이언트가 URL을 입력하면 HTTP Request가 서블릿 컨테이너로 전송한다.
- 요청을 받은 컨테이너는
HttpServletRequest
, HttpServletResponse
두 객체를 생성하고 서블릿 분석 파일인 web.xml
을 참고하여 어느 서블릿에 대한 요청인지 찾는다.
- 해당 서블릿에서
service
메서드를 호출한 후 클라이언트의 GET
, POST
여부에 따라 doGet()
또는 doPost()
를 호출하여 동적인 웹 페이지를 생성한 후 응답을 보낸다.
- 응답이 끝나면
HttpServletRequest
, HttpServletResponse
두 객체를 소멸시킨다.
Reference
https://mangkyu.tistory.com/14
https://kadosholy.tistory.com/47
글에 감동을 받았습니다.