Spring

DispatcherServlet

yoon9 2022. 11. 11. 22:05

 

 

ServletContainer SpringContainer

스프링부트를 이용해서 혼자서 공부겸 개발을 하다가 보니까 각종 에러나 예외에 대해 맞닥드리게 되는데.. 전체적인 구조에 대해 이해도가 없어서 에러내용을 봐도 감이 오질 않았다.. 사실 전

yoon9.tistory.com

위에 저번글에서 다룬 내용중 서블릿에 대해 정리를 해보았습니다..

근데 저는 개발을 하면서 스프링부트를 주로 이용하였지만 스프링프레임워크도 한 번 경험이 있엇는데..

위에 글의 내용과 같이 web.xml에서 각 서블릿에 맞는 매핑을 설정을 해줘야한다고 했는데..

그런적은 한 번도 없고 dispatcherServlet를 사용하였다

 

그럼 dispatcherServlet는 뭘까..?

스프링MVC에서는 dispatcherServlet를 구현하여 controller에 매핑을 시켜준다.

javaEE로만 이용을 하여 서블릿을 만들며 할 경우에는 web.xml에 등록 각 서블릿클래스를 만들고 구현을 해줘야한다..

근데 이게 점점 더 확장이 되면서 규모가 커지면.. 작성하는 양이 어마어마할 것이고 관리하기가 어려워질 것이다.

 

dispatcherServlet는 frontController로써 서버로 요청이 들어올때 제일 먼저 앞에서 요청을 받아주며 각 controller에 맞게 뿌려준다.

그림을 보며 이해를 해보자

 

출처 : https://lazymankook.tistory.com/69

 

이미지가 제일 잘 나온것을 찾아봤다...

 

1. 요청이 들어온다.

2. handlerMapping에서 요청에 맞는 handler가 있는지 조회를 한다.

3. handler를 처리할 수 있는handlerAdapter를 조회한다.

4. 조회 후 존재 시 handlerAdapter에게 위임을 해준다 그리고 handler에 매개변수로 넣어줄 객체를 생성하기위한 처리를 위해 argumentResolver(HandlerMethodArgumentResolver)에게 위임 바디에 데이터가 있을 경우 MessageConverter에게 처리를 위임을 해준다.

5.이 과정중에 처리 후 ReturnValueHandler 혹은 바디에 데이터를 실어야하는 경우 MessageConverter 에게 처리를 하고 

return값이 viewName이면

6.viewResolver에게 보내

7,8.  view를 retuen한다.

 

실제로는 훨씬 더 복잡한 로직으로 이루어져있지만... 기본적인 flow을 알아야 더 이해가 간다고 생각해서 정리...

 

+ 추가...

 

이렇게 보면 dispatcherServlet로 서블릿이다.

일반 그냥 서블릿으로 구현을 했을 경우에는 java코드에 html등의 코드도 다 들어가 있어서 가독성과 너무 조잡해서 알아보기 힘든 경우가 많다고 한다. 그리고 서블릿에 대해 등록을 해줘야 하니까 번거롭기도 하고... @webServlet으로 인하여 좀 나아지긴 했지만 ...

 

그래서 jsp가 나와서 html같은 공간에 자바코드를 넣어서 개발을 한다. serverSide 스크립트 언어이다. 어찌보면 서블릿과 반대 같지만 똑같은 역할을 한다. 서블릿의 역할에 +_추가 기능이라고 할까...

 

서블릿(controller)와 Jsp(view)의 장점을 살려서 mvc를 구현을 한다...

 

어찌댓건 사진을 보면서 구조를 이해하는게 제일 좋은 거 같다.

위에 사진이 인터넷에 제일 좋게 나와있다고 본다 시큐리티를 모르면 시큐리티 부분은 안봐도 되고... 사진을 어디서 저장을 했는데 출처가 기억이 안난다...(아시면 알려주세요).

 

 

암튼 이제는 dispatcher 서블릿을 이용을 할 것이다.

근데 dispatcher 서블릿는 하나만 있는게 아니고 1개 이상 여러개가 있을 수 있다...(필요로 한다면..?)

흔히 ServletAppliationContext에는 controller,handlerMapping,intercepter등등... 이 있고,

RootAppliationContext에는 DAO,DB등이 있다고 한다.

 

RootAppliationContext의 자식 ServletApplicationContext는 여러개가 존재 할 수 있지만, 굳이 사용을 안한다고 한다.

그래서 그 자식들이 공통적으로 부모(RootAppliationContext)빈들을 접근할 수 있는 것이다.

이런식으로 안되면 각각 dispatcher 서블릿마다 RootAppliationContext 가 생성이 되어서 중복되는 빈들이 존재할 것이다..

 

 

 

dispatcher 서블릿 안에 존재한다고 보면 안되고 앞단에 있다고 보면 될 것같다. 저 위에 사진은 1:1로 이루어져있고 더 많은 ServletWebApplicaionContext를 만들 수 있다... 그런데 위에 말하다시피 굳이 프론트컨트롤러역할로 모든 요청을 분기할 수 있는 dispatcher 서블릿이 있는데 굳이 이렇게 계층구조로  만든 이유가 무엇일까...

전체 애플리케이션에 서 웹기술에 의존적인 부분과 아닌 부분을 구분하기 위해서라고 한다...

비즈니스계층과 데이터계층은 스프링으로 이용하여 만들었지만.. 프레젠테이션계층은 다른걸로도 만들 수 있으니까...

이상...

 

 

references

Tomcat, Spring MVC의 동작 과정 (taes-k.github.io)

 

Tomcat, Spring MVC의 동작 과정

(부제 : 스프링 웹 프로그래밍을 하는 당신, 클라이언트의 요청을 어떻게 처리하는지 알고 있는가?) Tomcat 일반적으로 탐캣(Tomcat)은 ‘WAS(Web Application Server)’의 대표적인 미들웨어 서비스로 알려

taes-k.github.io

토비의 스프링 3.1