[웹MVC]_01_소개

1 minute read

스프링 웹 MVC 1부: 소개

  • 스프링 웹 MVC
    • https://docs.spring.io/spring/docs/5.0.7.RELEASE/spring-framework-reference/web.html#spring-web
  • 스프링 부트 MVC
    • 자동 설정으로 제공하는 여러 기본 기능 (앞으로 살펴볼 예정)
  • 스프링 MVC 확장
    • @Configuration + WebMvcConfigurer
  • 스프링 MVC 재정의
    • @Configuration + @EnableWebMvc

스프링부트가 제공하는 스프링 웹 MVC와 연동되는 기능들

  • (준비) 스프링 부트 프로젝트 : demospringmvc
  1. @WebMvcTest : 슬라이싱 테스트 진행 : 웹 계층만 테스트

  2. MockMvc 주입 받기

@Autowired
MockMvc mockMvc; //WebMvcTest를 사용하면 자동으로 빈으로 만들어주기 때문에 주입받아서 사용하면 된다.
  1. 실패하는 테스트 생성

아직 /hello 요청을 처리하는 핸들러를 만들지 않았기 때문에 테스트는 실패

package dev.solar.demospringmvc.user;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.client.match.MockRestRequestMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {

    @Autowired
    MockMvc mockMvc; //WebMvcTest를 사용하면 자동으로 빈으로 만들어주기 때문에 주입받아서 사용하면 된다.

    @Test
    public void hello() {
        mockMvc.perform("/hello")
                .andExpect(status().isOk())
                .andExpect(content().string("hello"));
    }
}
  1. 컨트롤러 생성
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

⇒ 별다른 설정 없이 스프링 웹 MVC 개발을 바로 시작할 수 있다.

why? WebMvcAutoConfiguration 자동 설정이 적용되었기 때문에

WebMvcAutoConfiguration

  • HiddenHttpMethodFilter

    • Spring Framework에서 제공
    • PUT, DELETE, PATCH 요청이 오면 hidden form 파라미터로 어떤 메서드인지 값을 받아올 수 있어서, 그 메서드를 컨트롤러에 매핑해서 컨트롤러를 만들 수 있도록 해준다.
    • ex) @DeleteMapping
  • HttpPutFormContentFilter

    • HTTP POST나 form 데이터를 보낼 수 있도록 Servlet spec에 정의가 되어있다. PUT이나 PATCH도 application/x-www-form-urlencoded라는 content type으로 form 데이터로 보내면, POST 요청에서 꺼낼 수 있는 것처럼 PUT이나 PATCH 요청에서도 꺼낼 수 있도록 매핑을 해준다.
  • WebMvcProperties.class : spring.mvc로 시작하는 프로퍼티를 바인딩 받아옴

  • ResourceProperties.class : spring.resources로 시작하는 프로퍼티를 바인딩 받아옴

    ​ ⇒ 설정을 커스터마이징 할 수 있는 프로퍼티들이 정의되어 있음

  • MessageCodesResolver : form에서 받아온 데이터를 바인딩할 때 에러가 발생하면 에러메시지를 생성하는 로직

스프링 웹 MVC가 제공하는 기능을 확장

  • 기본적으로 제공해주는 기능을 모두 사용하면서 추가적으로 확장하고 싶을 때,
  • WebMvcConfigurer을 구현한 WebConfig 파일을 만들어 준다.

  • @EnableWebMvc
    • 애노테이션을 붙이면, 스프링부트가 제공하는 MVC기능은 다 사라지고, 직접 MVC관련 설정을 해줘야한다.
    • 뷰 설정이 귀찮으므로 붙이지 않음. 스프링이 적절하게 잘 제공해준다.
    • WebMvc까지 직접 설정할 일은 많지 않아서 보통 붙이지 않는다.
  • WebMvcConfigurer 인터페이스가 제공하는 여러 콜백 메서드를 사용해서 설정을 커스터마이징한다.
    • 컨버터, 인터셉터, cors 매핑, 뷰리졸버 설정 등등
package dev.solar.demospringmvc.config;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configurable
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
}