JAVA spring 이론(2) Dispatcher Servlet

Cori1304·2025년 4월 9일
0

JAVA Spring 이론

목록 보기
2/7

Dispatcher Servlet이란?

JAVA spring에서 사용하는 MVC 패턴을 구현하기 위해서 사용되는 servlet객책이다. spring이전에 MVC패턴에서 prontController라는 개념으로 불리는 것과 같은 역할을 수행한다. HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 controller에 보내주는 역할을 수행하는 것이다.

~~client 요청을 제일 먼저 받아서 처리하고 client가 요청한 Controller로 요청을 보낸 후 다시dispatcherservlet을 거쳐서 client에게 응답이 반환된다. ~~

--

Dispatcher Servlet 구조

상속 구조

public class DispatcherServlet extends FrameworkServletpublic abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAwarepublic abstract class HttpServletBean extends HttpServletpublic abstract class HttpServlet extends GenericServlet

결국 Dispatcher Servlet은HttpServlet을 상속함을 알 수 있다. spring이전에 사용되었던 HttpServlet은 삭제된것이 아닌 상속되어져서 사용되고 있는 것이다. 그렇기 Dispatcher Servlet도 그냥 Servlet의 생명주기와 비슷하게 흘러감을 알 수 있다.

요청흐름

Servlet Container(대표적으로 Toncat, Jetty)에게 HttpServletRequest와 HttpServletResponse 객체를 받고 doService()를 호출하여서 동작한다. 그 후에 잘알고 있는 handlerMapping과 Handler Adapter가 실행되고 서비스 계층으로 이동한다.

spring Boot) DispatcherServlet 코드

인텔리 제이에서 shift+ shift를 누름 후에 검색창에 DispatcherServlet을 검색하면 아래 코드가 나온다.

public class DispatcherServlet extends FrameworkServlet {
//...

	 protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
//... 
      try {
            this.doDispatch(request, response);
        } finally {
            if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted() && attributesSnapshot != null) {
                this.restoreAttributesAfterInclude(request, attributesSnapshot);
            }

            if (this.parseRequestPath) {
                ServletRequestPathUtils.setParsedRequestPath(previousRequestPath, request);
            }

        }
// ... 
 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {

// ...
}

동작 순서 정리

실제로 디버깅을 해보면, doService가 호출된다. 그 후 Dispatcher Servlet은 front-controller 역할을 하기 때문에 doDispatch를 호출한다. 그 다음은 위에 그림에서 본것과 동일하게 HandlerMapping -> HandlerMapping 순서로 동작한다.

[Http 요청]
     ↓
DispatcherServlet
     ↓
doService()
     ↓
doDispatch()
     ↓
[HandlerMapping] → 어떤 Controller 실행할지 결정
     ↓
[HandlerAdapter] → 어떻게 실행할지 결정 (ex. @Controller, @RestController 등)
     ↓
[Controller] 

예전에는 특정 URL이 survlet으로 이동할 수 있게 XML에서 설정하고

frontController의 역할을 수행하는 servlet으로 HTTP 요청이 들어오면 제일 먼저 처리하는 객체이다.
spring 1.0부터 있었고 MVC 패턴을 더욱 더 잘 구현하기 위해서 사용된다.

MVC라는 아키택처 개념이 먼저 만들어지고 web에서 그것을 구현하기 위해서 servlet 중심으로 직접 구현하던 시절 코드

느낀점

JAVA를 공부하며서 느낀것은 관심사를 분리하는 거가 중요하다는 것이다. 이전에는 크게 생각해본적 없는 동작하는 것과 직관적인 코드만을 생각했다. 하지만 관심사에 분리가 복잡하기는 프로그램을 에러없이 동작시키는데 도움과 지곽적인 코드를 만들 수 있을거라고 생각한다. 분업하여서 맡은 구역에서 맡은 일을 처리하게 하는것은 효율을 가져온다. 디버깅과 테스트하기 좋은 구조가 에러없이 동작하는 프로그램을 만들게 하는데 크게 기어한다는 것이다.

참고 글

profile
개발 공부 기록

0개의 댓글