[웹MVC]_01_소개
스프링 웹 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
-
@WebMvcTest
: 슬라이싱 테스트 진행 : 웹 계층만 테스트 -
MockMvc
주입 받기
@Autowired
MockMvc mockMvc; //WebMvcTest를 사용하면 자동으로 빈으로 만들어주기 때문에 주입받아서 사용하면 된다.
- 실패하는 테스트 생성
아직 /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"));
}
}
- 컨트롤러 생성
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 요청에서도 꺼낼 수 있도록 매핑을 해준다.
- HTTP POST나 form 데이터를 보낼 수 있도록 Servlet spec에 정의가 되어있다. 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 {
}