Spring

[Spring Web MVC 1] Servlet?

kchabin 2025. 1. 29. 17:12

 

웹 서버에 프로그램을 붙여 동적 페이지 생성

요청 메시지 파싱과 클래스 메서드 호출 중 더 쉬운 것을 골라보라면?

  • 서블릿 정의 → 요청 다룸
  • 처리 로직에 더 집중할 수 있게 됨

Servlet Container : 서블릿을 담는 일종의 바구니

  • 서블릿 요청 / 응답 객체 생성
  • 서블릿 설정 파일을 참고해 매핑할 servlet 확인/hello 로 요청이 들어왔을 때 HelloServlet이라는 이름의 서블릿이 설정 파일에 존재하는 지 확인. HelloServlet은 servlet이라는 패키지 아래에 HelloServlet 클래스로 정의되어있음.
    • 없으면 생성→ init()
  • <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello<url-pattern> </servlet-mapping>
  • servlet container에 스레드를 생성하고, res, req를 인자로 service 실행
  • 이후엔 응답을 처리한 res, req 객체를 소멸시키고 끝남

서블릿 객체는 소멸하지 않고 있다가 다음에 똑같은 요청이 들어오면 처리 → 싱글톤 패턴

→ 서블릿 컨테이너는 서블릿의 생명 주기를 처리함.

여러 개의 요청 → 멀티 스레드로 처리

  • 스레드 생성은 큰 비용
  • 컨텍스트 스위칭 오버헤드
  • 생성 제한을 두지 않고 hw 한계를 넘으면 서버거 터져버림.
  • 핸들러의 공통 로직 중복 문제
    • 메뉴마다 담당하는 카페 직원 : 아메리카노 담당, 콜드브루 담당
    • 주문받고 계산, 포장이 공통 로직 → 매니저로 따로 빼서 손님의 요청을 앞단에서 처리하고 직원들에게 위임
     

Front Controller Pattern

매니저 역할을 Dispatcher Servlet이 하게 된다.

 

spring mvc도 프론트 컨트롤러 패턴을 따름 → Dispatcher Servlet

  • 서블릿을 하나만 두고 모든 요청을 받을 수 있도록
  • 이전에는 요청마다 스레드를 생성했지만 여기선 하나만

전면 매니저인 Dispatcher Servelt이 모든 요청을 처리하되

  1. 계산 → Handler Mapping : 요청 처리할 핸들러를 검색한다
  2. 음료 직원 호출 → Handler Adapter : 핸들러 호출
    • hello 처리 핸들러
    • greeting 처리 핸들러
    • bye 처리 핸들러

→ 개발자는 핸들러만 신경쓰면 됨

 

3. 포장 → ViewResolver : 뷰 검색 또는 생성

 

디스패처 서블릿이 스프링 컨테이너로부터 주입을 받아서 중간 관리자들을 사용하게 됨.

  • Servlet Web Application Context
    • 웹 요청 관련 - Controllers, HandlerMapping, ViewResolver
  • Root Web Application Context
    • 서비스, 레포지토리 관련 

서블릿 설정 파일만 잘 작성해주면 설정대로 작성된 객체가 스프링 컨테이너에서 관리되고 필요한 부분에서 주입받아 디스패처 서블릿이 사용

  • 프레임워크의 기능인 spring mvc + spring ioc 를 사용해서 핸들러 개발에만 집중할 수 있게 되는 개발자

 

참고 영상 : 테코톡 코기의 Servlet vs Spring

https://youtu.be/calGCwG_B4Y?feature=shared