본문 바로가기
Spring

Spring MVC의 동작 원리 (Spring에 요청을 보내면 어떻게 될까?)

by eunjineee 2023. 9. 22.
스프링에 요청을 보내면 어떻게 동작하는지 아시나요?

최근에 봤던 면접에서 받은 질문이다.

왜 한번도 생각해보지 않았는지 궁금해지는 질문이였다.

 

단순히 포스트맨 혹은 스웨거를 통해서 url로 요청을 보내면 바로 응답을 볼 수 있었기 때문에 궁금해하지도 않았던 것 같다.

 

그렇다면, 스프링에 요청을 보내면 어떤 과정을 통해 동작할까?

 

 

 

Spring MVC의 동작 원리

출처 : https://starkying.tistory.com/entry/Spring-MVC-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C

Spring MVC의 동작 과정을 가장 잘 이해할 수 있는 다이어그램이다.

 

1. 클라이언트의 요청

클라이언트가 서버에 요청을 하면, Front Controller인 DispatcherSevlet 클래스가 요청을 받는다.

 

2. 컨트롤러 매핑하기

DispatcherSevlet가 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾는다.

매핑(mapping)된 컨트롤러가 있으면 @RequestMapping을 통해 요청을 처리할 메소드로 이동한다.

 

3. 세부 컨트롤러 찾기

DispatcherServlet 이 HandlerAdapter 객체를 가져온다.

 

4. 세부 컨트롤러 찾기

HandlerAdapter 객체의 메소드를 실행한다.

(※ HandlerMapping은 DispatcherServlet로부터 전달된 URL을 바탕으로 HandlerAdapter 객체를 포함하는 HandlerExecutionChain 객체를 생성한다.

이후 DispatcherServlet이 HandlerExecutionChain 객체로부터 HandlerAdapter 객체를 가져와서 해당 메소드를 실행하게 된다.)

 

5.비즈니스 로직 처리

Controller 객체는 비즈니스 로직을 처리하고, 그 결과를 바탕으로 뷰에 전달할 객체를 Model 객체에 저장한다.

 

6. View 객체 얻기

DispatcherServlet은 view name을 View Resolver에게 전달하여 View 객체를 얻는다.

 

7. 화면 표시를 의뢰

DispatcherServlet은 View 객체에 화면 표시를 의뢰한다.

 

8. 화면 표시를 처리

View 객체는 해당하는 뷰(ex. JSP, Thymeleaf)를 호출하며, 뷰는 Model 객체에서 화면 표시에 필요한 객체를 가져와 화면 표시를 처리한다.

 

 

 

 

 

그렇다면, Spring MVC의 구성 요소들을 자세히 알아보자.

 

Spring MVC의 구성 요소

DispatcherServlet

- Front Controller를 담당 : Request를 각각의 Controller에 위임

- 모든 HTTP 요청을 받아들여서 다른 객체들 사이의 흐름을 제어

- Spring MVC에서 제공하는 DispatcherServlet 클래스를 그대로 적용

 

HandlerMapping

- 클라이언트의 요청을 바탕으로 어떤 Handler(Controller 메소드)를 실행할지 탐색 및 결정

- 구체적인 Mapping은 xml 파일이나 java config 관련 어노테이션 등을 통해 처리

 

HandlerAdapter

- 매핑된 컨트롤러의 실행을 요청

 

Controller

- 클라이언트 요청에 맞는 presentation layer의 처리를 실행

- 직접 요청을 처리하고, 결과를 반환

- 결과가 반환되면 handlerAdapter가 ModelAndView 객체로 변환됨

ModelAndView 객체에는 View Name과 같이 응답을 보여줄 View에 대한 정보와 관련된 데이터가 포함

 

ViewResolver

- view name을 확인하고, 실제 컨트롤러로 부터 받은 로직 처리 결과를 반영할 View 객체(jsp)를 탐색

 

View

- 로직 처리 결과를 반영한 최종 화면을 생성

 

Model

- Controller에서 View로 넘겨줄 객체가 저장되는 곳

- key(String)-value pair

 

 

 


DispatcherServlet 이 흐름을 제어하는 핵심적인 역할을 한다는 점을 알게 되었다.

토비의 스프링 책, 강의를 구매한 상태여서 더 자세히 공부하면서 기록할 예정이다.😊

 

 

 

📌참고한 사이트

https://ss-o.tistory.com/160

https://starkying.tistory.com/entry/Spring-MVC-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C

https://lcs1245.tistory.com/entry/DispatcherServlet%EC%9D%B4%EB%9E%80-Spring-MVC%EC%9D%98-%ED%95%B5%EC%8B%AC

https://yenbook.tistory.com/6