작지만 꾸준한 반복

@RestController로 요청이 들어왔을 때, 스프링 MVC는 어떻게 처리할까? 본문

공부기록/Spring

@RestController로 요청이 들어왔을 때, 스프링 MVC는 어떻게 처리할까?

iamjooon2 2023. 4. 18. 17:49

웹 자동차 경주 미션을 하며, @RestController 어노테이션만 붙이면 스프링이 알아서 해당하는 요청 경로를 찾아주는게 너무 신기했다.

 

그래서 이 웹 MVC의 구조를 찾아보며 정리해보려 한다.

 

 

 

 

 

클라이언트로부터 요청이 들어오면(1번), 디스패쳐 서블렛은 그 요청을 처리하기 위한 컨트롤러 객체를 검색한다

이때 디스패쳐 서블렛은 직접 컨트롤러를 검색하지 않고 핸들러 매핑이라는 빈 객체에 컨트롤러 검색을 요청한다.(2번 과정)

 

핸들러매핑은 클라이언트의 요청 경로를 이용해서 이를 처리할 컨트롤러 빈 객체를 디스패쳐 서블렛에 전달한다.(3번 과정)

예를 들어 웹 요청 경로가 '/plays'라면 등록된 컨트롤러 빈에서 '/plays' 요청 경로를 처리할 컨트롤러를 리턴한다.

 

이때, 컨트롤러 객체를 디스패쳐 서블렛이 전달받았다고 해서, 바로 컨트롤러 객체의 메서드를 실행할 수 있는 것은 아니다.

 

디스패쳐 서블렛은 핸들러 매퍼가 찾아준 컨트롤러 객체를 처리할 수 있는 핸들러 어댑터 빈에게 요청 처리를 위임한다.(4번 과정) HandlerAdapter는 컨트롤러의 알맞은 메서드를 호출해서 요청을 처리한 후(5~6번 과정)

그 결과를 DispatcherServlet에 반환해준다(7번) 

 

마지막으로 DispatcherServlet은 요청받은 형태를 json 형태로 직렬화시켜, 클라이언트에게 요청에 대한 응답을 반환한다 (8번)

 

처리 과정을 보면, 디스패쳐 서블렛을 중심으로 핸들러 매퍼, 핸들러 어댑터, 컨트롤러가 각자 역할을 수행하여 클라이언트의 요청을 처리하는 것을 알 수 있는데, 이중 하나라도 어긋나면 클라이언트의 요청을 처리할 수 없게 되므로 각 구성 요소를 올바르게 설정하는 것이 중요하다.

 

컨트롤러는 뭐고, 핸들러는 뭘까?

- 클라이언트의 요청을 실제로 처리하는 것은 컨트롤러이고, 디스패쳐 서블렛은 클라이언트의 요청을 전달받는 창구 역할을 한다.

앞서 설명했듯이 디스패쳐 서블렛은 클라이언트의 요청을 처리할 컨트롤러를 찾기 위해 핸들러 매퍼를 사용한다.

컨트롤러를 찾아주는 객체는 ControllerMappping 타입이어야 할 것 같은데, 실제는 핸들러 매파다.

 

왜 핸들러 매퍼지?

스프링 MVC는 웹 요청을 처리할 수 있는 범용 프레임워크다

@Controller, @RestController등의 어노테이션을 붙인 클래스를 이용해서 클라이언트의 요청을 처리하지만,

원한다면 자신이 직접 만든 클래스를 이용해서 클라이언트의 요청을 처리할 수도 있다.

 

즉 디스패쳐서블렛 입장에서는, 클라이언트 요청을 처리하는 객체의 타입이 반드시 컨트롤러를 적용한 클래스일 필요는 없다.


(실제로 스프링이 클라이언트의 요청을 처리하기 위해 제공하는 타입 중에서는 HttpRequestHander도 존재한다!)

 

이런 이유로 스프링 MVC는 웹 요청을 실제로 처리하는 객체를 Handler라고 표현하고 있으며, @Controller 적용 객체나 컨트롤러 인터페이스를 구현한 객체는 모두 스프링 MVC 입장에서는 핸들러가 한다. 따라서 특정 요청 경로를 처리해주는 핸들러를 찾아주는 객체를 핸들러 매퍼라고 부른다.

 

핸들러 객체의 실제 타입마다 그에 알맞은 핸들러 매퍼와 핸들러 어댑터가 존재하기 때문에, 사용할 핸들러의 종류에 따라 해당 핸들러 매핑과 핸들러 어댑터를 스프링 빈으로 등록해야 한다. 물론 스프링이 제공하는 설정 기능을 사용하면, 이 두 종류의 빈을 직접 등록하지 않아도된다.

 

 

참고 자료

http://www.yes24.com/Product/Goods/62268795

 

스프링5 프로그래밍 입문 - YES24

스프링 프레임워크의 버전업으로 개선된 내용을 담았다. 처음 스프링을 배우고자 하는 독자들이 입문할 때 필요한 것은 스프링의 방대한 내용이 아닌 기초와 전반적인 흐름을 잡아주는 것으로

www.yes24.com

 

 

최범균님의 책을 바탕으로 Spring MVC를 정리해보았다

책에서는 JSP 형태의 예제를 들었지만, 뷰를 리턴하는 형태가 아닌 RESTapi를 사용할 때로 작성했다.

 

MVC 작동 원리를 배우다 보니, 여기서 디스패쳐 서블렛이 아주 핵심적인 역할임을 알게되었는데,

덕분에.. 디스패쳐 서블렛이 또 궁금해졌다..

 

아마 다음 포스트는 디스패쳐 서블렛이 되지 않을까 싶다...