[Spring] Servlet(서블릿)?

SIK407·2024년 11월 22일
0

spring

목록 보기
10/11
post-thumbnail

스프링으로 웹 프로젝트를 진행하다 문서를 찾아보면
Servlet이란 말이 자주 나온다.

근데 이게 뭘까요...? 정확하게 알아보자

(모르는것보단 아는게 약이다!)

A. 서블렛(Servlet)?

Servlet
클라이언트가 요청(Req) 하면, 그에 대한 결과를 다시 응답(Res)을 담당하는 자바 프로그램

간단하게 말해서 "자바를 사용하여 웹을 만들기 위해 필요한 기술"
이라고 말할 수 있다.

Servlet 특징

  1. MVC 패턴 중, Controller의 역할을 담당
  2. Java의 Thread로 동작
  3. HTTP 프로토콜 서비스를 지원하는 HttpServlet 클래스를 상속
  4. HTML을 사용해 요청에 응답
  5. UDP보다 처리 속도가 느림

기존 WEB 서버WAS는 정적인 페이지만 제공한다.

Servlet 방식

  1. 클라이언트가 요청(Req)을 서버로 보냄
  2. Http Req가 서블릿 컨테이너로 보냄
  3. 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성
  4. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾음
  5. 찾은 서블릿을 통해 service 메소드를 호출
    -> doGet(), doPost()와 같은 메소드를 실행
    -> HttpServletResponse 객체에 응답을 보냄
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸



B. Servlet Container

위에서 말하는 서블릿 컨테이너(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(): 서블릿을 서비스에서 제외하는 메소드



C. Dispatcher Servlet (디스패처 서블릿)

Dispatcher Servlet
스프링 부트에서 사용중인 대표적인 서블릿
사용자로부터 들어온 요청(Req)을 받아 적절한 서블릿에 요청(Req)을 위임하는 역할

※ dispatch: (특별한 목적을 위해) "보내다"

스프링부트의 스프링 컨테이너(ApplicationContext) 내에서 디스패처 서블릿이 관리한다.
디스패처 서블릿은 요청(Req)과 처리를 위임할 Bean을 찾아 담당한다.

Spring Boot에서 HTTP 요청을 처리하는 방법은 여러가지가 있다.

  1. web.xml 파일에서 직접 서블릿 등록
  2. @WebServlet 어노테이션 + HttpServlet 클래스 상속 + @ServletComponentScan
  3. @Controller or @RestController 어노테이션

스프링 MVC는 요청url와 메서드에 맞는 적절한 Servlet (or Controller)를 호출해주는 기능이 필요하다.
그 기능을 디스패처 서블릿이 담당하는 것 같다.

이 기능을 담당하는 것을 프론트 컨트롤러(Front Controller) 라고 한다.



D. 근데 Servlet하고 @Controller는 다른거야?

스프링을 사용해보셨다면 @Controller@RestController가 익숙하다.

  • @Controller: VIEW 자체를 전달
  • @RestController: 데이터만 전달 (Json)

스프링 MVC 프레임워크에선 저 두개의 어노테이션을 사용하면 직접 서블릿을 등록하지 않아도 서블릿의 역할을 해낼 수 있도록 구현되어있다.
현재 거의 모든 인터넷이 HTTP 프로토콜을 기반으로 동작한다. 그래서 서블릿의 하위 구현체인 HttpServlet이 주로 사용중이였던 것이다.

@ControllerServlet 은 역할이 똑같다.
@Controller가 붙게 되면, 스프링 컨테이너에서 Bean 객체로 관리되고 이 객체를 위에서 말했던 디스패처 서블릿가 호출하게 된다.

즉, 관리의 주체가

  • @Controller: 디스패처 서블릿이 관리
  • Servlet: 서블릿 컨테이너(예: Tomcat 등)가 관리

차이가 있을 뿐, 하는 역할은 비슷하다.



정리

스프링에서는 서블릿 컨테이너의 역할을 스프링 컨테이너(ApplicationContext)가 대신한다.
코드의 품질과 유지보수성을 향상시켰다고 볼 수 있다.

우리가 흔히 강의에서 듣는 Servlet은 톰캣에서 사용하는 자바 프로그램을 말하는 거고,
Spring Boot에서 듣는 ServletDispatcher Servlet을 말하는 것!

profile
Spring 백엔드!

0개의 댓글

관련 채용 정보