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이 모든 요청을 처리하되
- 계산 → Handler Mapping : 요청 처리할 핸들러를 검색한다
- 음료 직원 호출 → 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