Dispatcher Servlet은 Spring MVC 구조의 핵심이다. Dispatcher Servlet에 대해 먼저 설명하고, 다음 글에서 Spring MVC 의 동작 방식에 대해 설명해보려고 한다.
1. Dispatcher Servlet이란?
Dispatcher Servlet은 Spring 에서 HTTP Request들을 받아 올바른 @Controller, @RestController 어노테이션이 달린 핸들러(컨트롤러)로 위임해준다.
Front Controller 패턴과 Request Dispatcher의 역할이 합쳐져 있는 형태이다.
Spring MVC에서는 web.xml 파일에 등록되었으나 Spring Boot에서는 Dispatcher Servlet을 자동으로 구성하여 등록해준다.
Front Controller 패턴이란?
기존의 방식은 각 요청마다 Servlet을 생성하고 Controller에게 요청을 보내는 형식으로 작성되었다.
Front Controller 패턴은 모든 request를 하나의 Servlet 에서 받고, Front Controller Servlet이 직접 각 요청에 대한 Controller로 분배해주는 방식이다. 이렇게 Front Controller 패턴을 사용할 경우 모든 요청에 대하여 에러 페이지나 인코딩과 같은 처리들을 모두 한 곳에서 해결할 수 있다는 장점이 있다.
Request Dispatcher
Request Dispatcher는 클라이언트로부터 들어온 요청을 원하는 자원으로 보내는 역할을 수행하거나, 특정 자원에 처리를 요청하고 결과를 가져오는 기능을 수행한다.
클라이언트에서 요청이 들어올 때 Servlet Container(톰캣과 같은 웹서버)는 Request 객체와 Response 객체를 매번 새로 생성한다. 만일 A에서 처리한 요청을 B까지 가져가고 싶을 경우 새로운 Request Dispatcher를 이용하면 request 객체가 새로 생성되지 않고 기존 Request 객체의 내용을 유지한 상태로 B로 넘어갈 수 있다.
sendRedirect와 requestDispatcher의 차이
브라우저에서 A -> B로 페이지를 전환하는 방식은 sendRedirect와 RequestDispatcher를 사용하는 두 가지 방식이 있다.
만일 sendRedirect()를 사용할 경우 하나의 요청 내에서 처리하는 것이 아니라 브라우저로 Response를 한 후에 브라우저 측에서 새로 B로 재요청을 하게되는 방식으로, Http 요청이 두 번 일어나게 된다. 따라서 url이 바뀌고 최초의 요청 때 생성된 request 객체는 소실되고 새로운 request 객체가 생성된다.
반면 RequestDispatcher를 사용할 경우 하나의 요청(request) 범위 내에서 처리되어 최초에 생성된 request 객체를 B까지 가져갈 수 있게 된다.
'백엔드' 카테고리의 다른 글
[Java] 1. Garbage Collection이란? GC의 핵심 및 과정 (0) | 2022.06.24 |
---|---|
[Java/Postgresql] 랜덤 문자열 생성 - get_random_string() (0) | 2022.03.21 |
[Java] equals()와 ==의 차이점(feat: String str=""와 new String("")의 차이점) (0) | 2022.02.03 |
[Java] Generic이란? Generic class Class field 가져오기, 동적 메소드 실행 (0) | 2021.10.01 |
[Spring] IoC와 DI - 2. IoC(제어의 역전)이란? (토비의 스프링) (0) | 2021.09.26 |
댓글