2018-10-10 스프링웹MVC
Spring web-mvc
//ControllerTest
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("hello"));
}
}
//Controller Code
@RestController
public class UserController {
@GetMapping("hello")
public String hello() {
return "hello";
}
}
- TDD방식으로 바로 개발을 할 수 있다.
- 아무런 설정없이 Spring Web MVC를 사용할 수 있는 이유는 spring-boot-autoconfigureation안에 있는 spring.factories때문이다. 이 자동 설정 파일이 적용이 됬기때문에 우리가 아무런 문제없이 적용을 할 수 있다.
Q. spring-boot가 제공해주는 mvc기능을 확장하려면?
@Configuration
public class WebConfig implements WebMvcConfigurer {
}
// 이렇게 하면안된다
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
}
- Configuration어노테이션만 붙어야된다. 그러면 자동설정을 확장할 수 있다. 만약에 밑에처럼 @EnableMvc를 붙이면 모든 설정을 저기서 다 해야한다.
- 스프링MVC확장 : @Configuration + WebMvcConfigurer
- 스프링MVC재정의 : @Configuration + @EnableWebMvc
Spring Mvc HttpMessageConverters
- HttpMessageConverters : Http 요청 본문을 객체로 변경하거나, 객체를 Http 응답 본문으로 변경할 때 사용한다. RequestBody, ResponseBody와 같이 사용된다.
@RestController
public class UserController {
@GetMapping("hello")
public String hello() {
return "hello";
}
@PostMapping("/user")
public @ResponseBody User create(@RequestBody User user) {
}
}
- @RequestBody User user : 이때 HttpMessageConverter가 사용이 된다. Converter는 여러가지가 있고, 우리가 요청을 받았는지, 어떤 응답을 해야되는지에 따라서 Converter가 다르다.
- 요청에 있는 Content-Type에 Json이 되있으면, JsonMessageConverter가 사용이 된다.
- 리턴할때 @ResponseBody User, 객체자체를 리턴할 수 없기때문에, 변환을 해야한다. 기본적으로는 JsonMessageConverter가 사용이 된다.
- 위에 @RestController가 붙어있으면 @ResponseBody를 생략해도 된다.
@RestCotroller를 안사용하고, 일반 @Controller를 사용할경우
@Controller
public class UserController {
@GetMapping("hello")
public String hello() {
return "hello";
}
}
- 위와 같이 그냥 컨트롤러 어노테이션을 붙이면 return hello를 할경우 ViewNameResolver가 동작을 해서 hello에 해당하는 뷰를 리턴해준다.
Written on October 10, 2018