`Spring5-최범균` 정리
Dispatcher-Servlet이란?
[정의]
Servlet Container에서 HTTP프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일 앞에 둬서 중앙 집중식으로 처리해주는 프론트 컨트롤러
- 클라이언트로부터 어떤 요청이 오면
Tomcat
과 같은 서블릿 컨테이너가 요청을 받는데, 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 프론트 컨트롤러를 Spring에서 정의하였고, 이를Dispatcher-Servlet
이라고 한다. - 공통처리 작업을 Dispatcher 서블릿이 처리한 후, 적절한 세부 컨트롤러로 작업을 위임해 준다.
- 클라이언트로부터 어떤 요청이 오면
[
Dispatcher-Servlet
의 흐름]
- 클라이언트가 해당 어플리케이션에 접근하면 접근한 URL요청을
DispatcherServlet
이 가로챈다. 이렇게 요청을 가로챌 수 있는 이유는web.xml
에 등록 된DispatcherServlet
의<url-pattern>
이/
와 같이 해당 어플리케이션의 모든 URL로 등록되어 있기 때문이다. 만약 특정 URL만 적용하고 싶다면<url-pattern>
의 내용을 바꿔주어 범위를 변경 시켜주면 된다. - 가로챈 정보를
HandlerMapping
에게 보내 해당 요청을 처리할 수 있는 Controller를 찾아낸다.
(이 부분은 스프링의 디폴트 전략에 의해BeanNameUrlHandlerMapping
과 DefaultAnnotationHandlerMapping`이 기본으로 스프링MVC에 탑재되어있기 때문에 특별한 경우가 아니라면 따로 설정할 필요가 없다.) - 핸들러 매핑이 해당 요청을 처리할 컨트롤러를 찾아냈다면 요청을 컨트롤러에 보내준다. 컨트롤러는 사용자가 직접 구현해주는 부분이다.
- 해당 요청을 처리한 후에 보통 컨트롤러는 요청을 응답받을 View의 이름을 리턴하게 된다. (물론 다른 핸들러 매핑 전략을 이용한다면 다를 수도 있다.)
그때 이 이름을ViewResolver
가 먼저 받아 해당하는View
가 존재하는지 검색한다. - 해당 View가 있다면 처리결과를
View
에 보낸다. - 이 결과를 다시
DispatcherServlet
에 보낸다. DispatcherServlet
은 최종 결과를 클라이언트에 전송한다.
실제 돌아가는 구조는 복잡해 보이지만 사용자가 직접 구현하는 부분은
Controller
부분과View
부분밖에 없다. 나머지는 대략적인 흐름만 알고있자.- 클라이언트가 해당 어플리케이션에 접근하면 접근한 URL요청을
[모든 요청을 처리하다보니 이미지나 HTML파일, 게다가 JSP안의 자바스크립트나 CSS 파일도 다 요청을 가로채버릴 때]
- 디스패처 서블릿이 처리할 URL과 자바와 관련없는 리소스들의 영역을 분리 시키는 것
- [예]
/apps
- 클라이언트가 이 URL로 접근하면 앞으로 디스패처 서블릿이 담당/resources
- 이 URL은 디스패처 서블릿이 컨트롤할 수 없는 영역으로 분리 - 그러나..
이런 처리방식은 괜찮지만 코드가 지저분해지고 form에서 모든 요청을 보낼때apps
라는URL
을 붙여줘야 하기 때문에 직관적인 설계가 불가
- [예]
- 모든 요청을 컨트롤러에 등록하는 방법
절대금지3.<mvc:resources />
사용Spring Template Projcect
로 생성했다면servlet-context.xml
에서 해당 코드를 발견 할 것이다.<resources mapping="/resources/-*" location="/resources" />
해당 전략은 먼저 디스패처 서블릿을 통해 들어온 요청을 처리하는데, 만약 디스패처 서블릿이 해당 요청에 대한 컨트롤러를 찾을 수 없다면 2차적으로 위의 설정된 경로를 검색하여 해당 자원을 찾아내게 되는 것이다.
많은 대형 웹서비스들의 비 어플리케이션 자원 URL을 보면 철저하게 static 성격의 외부 자원들을 분리시켜 사용하고 있다. 네이버 같은 경우는 http://static.naver.net/이란 URL을 통해 자원을 분리한 것을 볼 수 있다. 차후 확장을 위해 비어플리케이션 자원은 반드시 분리해야할 영역이다.
- 디스패처 서블릿이 처리할 URL과 자바와 관련없는 리소스들의 영역을 분리 시키는 것