스프링 MVC 패턴

데일리·2024년 11월 11일
0

TIL

목록 보기
5/16
post-thumbnail

우리가 흔히 쓰는 스프링 MVC패턴에 대해 알아보자

스프링 MVC란??

스프링 MVC는 MVC패턴을 기반으로 웹 애플리케이션을 쉽게 만들 수 있게 도와주는 프레임워크이다.

여기서 MVC 패턴은 소프트웨어 디자인 패턴 중 하나로, 애플리케이션을 Model, View, Controller라는 세 가지 역할로 나누는 방식이다.

  • Model: 데이터와 비즈니스 로직을 관리
  • View: 사용자에게 보여주는 화면
  • Controller: 요청을 받아서 Model과 View를 연결

스프링 MVC는 이러한 패턴을 좀더 쉽게 구현할 수 있는 기능과 설정이 제공된 프레임워크라고 보면 된다(예시) @RequesetMapping, @Controller)

스프링 MVC의 동작 흐름


사진을 참고해서 아래 설명을 보면 이해하기가 쉽다.

  1. 클라이언트에서 HTTP 요청이 들어온다. 이때 DispatcherServlet이 프론트 컨트롤러 역할을 한다.

    • 여기서 잠시 DispatcherServlet에 대해 설명하자면 Spring MVC에서 모든 웹 요청을 처음으로 받아들이는 중앙관리자라고 볼 수 있다.
      해당 요청을 받고 적절한 컨트롤러로 연결하고 해당 컨트롤러의 응답을 뷰에 전달하는 마치 백화점의 고객(요청)을 안내해주는 안내데스크라고 이해하면 편하다
  2. HandlerMapping을 통해 URL에 매핑된 컨트롤러를 조회한다.

  3. DispatcherServlet은 찾은 핸들러를 실행하기 위해 HandlerAdapter를 사용한다.

    • 여기서 HandlerAdapter는 DispatcherServlet의 요청을 처리할 컨트롤러를 실행하고 DispatcherServlet에게 결과를 전달하는 중간자 역할을 한다.
  4. HandlerAdapter가 실제로 요청을 처리하는 메서드를 호출한다.

  5. 컨트롤러는 결과 데이터를 Model객체에 담고 View이름을 반환한다.

  6. ViewResolver는 View이름을 기반으로 적절한 뷰를 찾는다.

  7. ViewResolver가 찾은 뷰를 사용해 최종적으로 HTML과 같은 응답을 생성한다.

View가 아닌 Json일 경우에는?

요즘에는 View를 전달하는 대신 JSON과 문자열을 응답하는 경우가 있는데 해당 흐름도 유사하게 흘러간다.

1,2는 동일하고
3. @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter가 ArgumentResolver를 호출해 핸들러가 필요하는 파라미터 값을 생성하고 컨트롤러 메서드를 호출하면서 값을 넘겨준다. 이때 ArgumentResolver가 HttpMessageConverter를 사용해 필요한 객체를 생성한다.

위 내용이 좀어려울 수 있는데 예시를 들어보자

  • 사용자가 POST 요청으로 JSON 데이터({"name": "Alice", "age": 30})를 보낼 경우
  • 이 데이터는 컨트롤러 메서드의 파라미터로 선언된 User 객체(예: public String addUser(@RequestBody User user))로 전달되어야 한다.
  • 이 때 ArgumentResolver는 @RequestBody 어노테이션을 보고 HttpMessageConverter를 사용해 JSON 데이터를 User 객체로 변환해준다.
  • 변환된 User 객체는 메서드에 전달되어, addUser 메서드는 이 객체를 통해 요청을 처리한다.

즉 ArgumentResolver와 HttpMessageConverter는 요청데이터를 메서드에서 필요로 하는 형태로 변환해주는 데이터 준비도구라고 볼 수 있다.
4. 컨트롤러는 전닯다은 파라미터를 사용하여 서비스 계층과 데이터 접근 계층을 호출해 비즈니스 로직을 수행
5. @ResponseBody와 HttpEntity를 처리하는 ReturnValueHandler가 HttpMessageConver를 통해 응답 결과를 만들어준다.

profile
하루에 한편 씩 읽기 좋은 테크 로그

0개의 댓글