BoostCourse | Spring MVC

judyzero·2025년 2월 4일

BoostCourse

목록 보기
7/7

Spring MVC

MVC란?

  • Model : 모델은 뷰가 렌더링하는데 필요한 데이터이다. 예를 들어 사용자가 요청한 상품 목록이나, 주문 내역
  • View : 웹 애플리케이션에서 뷰(View)는 실제로 보이는 부분이며, 모델을 사용해 렌더링한다. 뷰는 JSP, JSF, PDF, XML등으로 결과를 표현한다.
  • Controller : 컨트롤러는 사용자의 액션에 응답하는 컴포넌트. 컨트롤러는 모델을 업데이트하고, 다른 액션을 수행한다.


로직과 뷰를 분리할 수 있다.


클라이언트가 보내는 모든 요청을 프론트 컨트롤러인 Servlet이 받는다.
프론트 컨트롤러는 요청만 받고 처리는 하지 않는다. 모든 요청은 처리는 컨트롤러 또는 Handler에 보낸다. 이러한 Controller는 Bean으로 결과를 만들어 Model에 보내고, 프론트 컨트롤러가 응답을 반환한다.

Spring MVC 구성요소


우리가 만들 부분은 보라색으로 표시되어 있다.

기본 동작 흐름

  1. 모든 요청은 Dispatcher Servlet에 보낸다.
  2. Dispatcher Servlet은 요청을 처리해줄 Controller와 Method가 무엇인지 Handler Mapping에 물어본다.
    -> 어떤 요청에 어떤 Controller가 동작할지는 어노테이션으로 작성해놓아야 한다.
  3. Hanlder Adapter에게 실행을 요청한다.
  4. 이때 요청된, Controller가 실행한다.
  5. Controller가 요청한 view name을 가지고 View Resolver가 호출 되고, 이를 통해 보여지게 된다.

DispatcherServlet의 동작 순서

Front Contrller는 요청을 받아서 DispatcherServlet에 전달한다고 하였다.
이를 처리할 핸들러에게 넘기고 핸들러가 처리한 결과를 받아 사용자에게 응답 결과를 보여준다.
DispatcherServlet은 여러 컴포넌트를 이용해 작업을 처리하게 된다.

DispatcherServlet 내부 동작흐름


1. 요청이 들어오면 요청의 선처리 작업을 한다.
선처리 작업은 Locale결정, RequestContextHolder에 요청 저장, FlashMap 복원, 멀티파트요청을 해준다.

  • Locale결정: 지역 기반 언어 변경
  • RequestContextHolder 요청 저장: HttpServletRequest, HttpServletResponse등을 스프링이 관리하는 객체 안에서 사용할 수 있도록 저장해준다.
  • FlashMap 복원: redirect로 값을 전달할 때, 파라미터를 계속 사용하다보면 복잡해진다. FlashMap을 사용하면 redirect가 된 값을 1번 저장해준다.
  • 멀티파트요청: 파일 업로드 전략이다.
  1. HandlerExecutionChain을 결정하고 실행한다.
  2. 이때, 예외가 발생하면 예외처리를 하고, 아니라면 뷰를 렌더링한다.
  3. 요청처리가 완료된다.

Spring MVC를 이용한 웹 페이지 작성

DispatcherServlet을 FrontController로 설정하기

  • web.xml 파일에 설정
  • org.springframework.web.WebApplicationInitializer인터페이스 추가하기

2번째 방법을 사용해서 설정을 해보겠다.

@Configuration: java config 파일임을 알려준다.
@EnableWebMvc: web에 필요한 빈들을 대부분 자동으로 설정해준다. 다른 설정이 필요할 경우 WebMvcConfigurerAdapter 클래스를 상속 받은 후, 메소드를 오버라이딩하여 구현한다.
@ComponentScan: Controller, Service, Repository, Component 애노테이션이 붙은 클래스를 찾아 스프링 컨테이너가 관리하게 된다.

Controller 클래스 작성하기

매핑을 위해 @RequestMapping 애노테이션을 클래스나 메소드에서 사용한다.

  • Http Method와 연결하는 방법
    @RequestMapping("/users", method=RequestMethod.POST)
  • Http 특정 헤더와 연결하는 방법
    @RequestMapping(method = RequestMethod.GET, header = "content-type=application/json")

- @RequstParam
mapping된 메소드의 argument에 붙일 수 있는 어노테이션
http parmeter의 name과 mapping
required는 필수인지 아닌지 판단.

- @PathVariable
@RequeestMapping의 path에 변수명을 입력받기 위한 placeholder가 필요함.
place holder의 이름과 PathVariable의 name 값과 같으면 mapping됨.

0개의 댓글