스프링으로 웹 프로젝트를 진행하다 문서를 찾아보면
Servlet이란 말이 자주 나온다.
근데 이게 뭘까요...? 정확하게 알아보자
(모르는것보단 아는게 약이다!)
Servlet
클라이언트가요청(Req)
하면, 그에 대한 결과를 다시응답(Res)
을 담당하는 자바 프로그램
간단하게 말해서 "자바를 사용하여 웹을 만들기 위해 필요한 기술"
이라고 말할 수 있다.
Thread
로 동작HttpServlet
클래스를 상속기존 WEB 서버와 WAS는 정적인 페이지만 제공한다.
요청(Req)
을 서버로 보냄HttpServletRequest
, HttpServletResponse
객체를 생성doGet()
, doPost()
와 같은 메소드를 실행HttpServletResponse
객체에 응답을 보냄HttpServletRequest
, HttpServletResponse
두 객체를 소멸위에서 말하는 서블릿 컨테이너
(Servlet Container)에 해당 Servlet
을 등록해줘야 정상 작동이 가능하다.
즉, 서블릿은 Servlet Container
의 제어를 받는다고 볼 수 있다.
1단계: 웹 서버에서 실행 중인 애플리케이션이 요청을 수신
2단계: 서버는 request를 서블릿 컨테이너로 전달
3단계: Target Servlet(대상 서블릿, 요청 url과 HTTP 메서드 일치) 전달
init()
: 서블릿 클래스를 로드 후, 초기화
service()
: HTTP 요청 유형(GET, POST, PUT, DELETE 등)을 해석하고 doGet, doPost, doPut, doDelete 등의 메서드 를 적절하게 호출
destroy()
: 서블릿을 서비스에서 제외하는 메소드
Dispatcher Servlet
스프링 부트에서 사용중인 대표적인 서블릿
사용자로부터 들어온요청(Req)
을 받아 적절한 서블릿에요청(Req)
을 위임하는 역할
※ dispatch: (특별한 목적을 위해) "보내다"
스프링부트의 스프링 컨테이너
(ApplicationContext) 내에서 디스패처 서블릿
이 관리한다.
디스패처 서블릿은 요청(Req)
과 처리를 위임할 Bean
을 찾아 담당한다.
Spring Boot에서 HTTP 요청을 처리하는 방법은 여러가지가 있다.
@WebServlet
어노테이션 + HttpServlet 클래스 상속 + @ServletComponentScan
@Controller
or @RestController
어노테이션 스프링 MVC는 요청url와 메서드에 맞는 적절한 Servlet
(or Controller
)를 호출해주는 기능이 필요하다.
그 기능을 디스패처 서블릿
이 담당하는 것 같다.
이 기능을 담당하는 것을 프론트 컨트롤러(Front Controller) 라고 한다.
스프링을 사용해보셨다면 @Controller
와 @RestController
가 익숙하다.
@Controller
: VIEW 자체를 전달@RestController
: 데이터만 전달 (Json)스프링 MVC 프레임워크에선 저 두개의 어노테이션을 사용하면 직접 서블릿을 등록하지 않아도 서블릿의 역할을 해낼 수 있도록 구현되어있다.
현재 거의 모든 인터넷이 HTTP 프로토콜을 기반으로 동작한다. 그래서 서블릿의 하위 구현체인 HttpServlet이 주로 사용중이였던 것이다.
@Controller
와 Servlet 은 역할이 똑같다.
@Controller
가 붙게 되면, 스프링 컨테이너에서 Bean 객체로 관리되고 이 객체를 위에서 말했던 디스패처 서블릿가 호출하게 된다.
즉, 관리의 주체가
@Controller
: 디스패처 서블릿이 관리Servlet
: 서블릿 컨테이너(예: Tomcat 등)가 관리차이가 있을 뿐, 하는 역할은 비슷하다.
스프링에서는 서블릿 컨테이너의 역할을 스프링 컨테이너(ApplicationContext)가 대신한다.
코드의 품질과 유지보수성을 향상시켰다고 볼 수 있다.
우리가 흔히 강의에서 듣는 Servlet은 톰캣에서 사용하는 자바 프로그램을 말하는 거고,
Spring Boot에서 듣는 Servlet은 Dispatcher Servlet을 말하는 것!