스프링부트는 기본 설정에 의해, 기본적으로 웹 mvc를 바로 사용할 수 있다.(자동 설정 파일이 적용되었기 때문)
스프링 프레임워크에서 제공하는 인터페이스이며 spring MVC의 일부분이다.
HTTP 요청 본문을 객체로 변경하거나, 객체를 HTTP 응답 본문으로 변경할 때 사용한다.
@RequestBody / @ResponseBody 와 함께 사용된다.
데이터가 요청으로 들어올 때 요청의 본문에 그 데이터가 들어있을 때, 그걸 객체로 받고 싶으면 파라미터로 @RequestBody 를 붙여 객체로 받을 수 있다.(스프링이 알아서 conversion 해준다.)
이렇게 하면 HttpMessageConverters 가 사용이 된다.
사용하는 HttpMessageConverters는 여러가지가 있고, 그 중에서 어떤 요청을 받았는지 또는 어떤 응답을 보내야하는지에 따라 사용하는 HttpMessageConverters가 달라진다.
예를 들어 요청이 json요청이고, json 본문이 들어온 경우(요청에는 contents type이라는 헤더가 있다. contents type도 json이고, 본문도 json) jsonMessageConverter가 사용이 되어, json 메세지를 User라는 객체로 컨버팅 해주는 것이다.
return할 때, User라는 객체를 return 할 것이다. http가 문자이므로, 객체 자체를 response로 내보낼 수는 없다. 따라서 HttpMessageConverters를 사용하여 변환해야한다.
컴포지션 타입(객체 안에 여러가지 프로퍼티를 가질 수 있는 타입)일 경우 기본적으로 jsonMessageConverter가 사용된다.
컴포지션 타입이 아닌 일반 String 객체나 int객체를 예로 들면
StringMessageConverter가 사용된다.(int도 toString을 사용하여 문자열로 변환할 수 있기때문)
클래스에 @RestController가 붙어있으면 public 뒤에 @ResponseBody를 생략할 수 있다.
일반 @Controller를 사용할 시 @ResponseBody를 써줘야한다.
컴포지션 객체를 만들어 HttpMessageConverters 사용해보기
User를 생성하는 Controller를 만들어보겠다.
먼저 Test파일을 만들어준다.
@Test 코드
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
MockMvc mockMvc; // @WebMvcTest를 사용하면 자동으로 Bean으로 등록됨
@Test
public void createUser_JSON() throws Exception {
String userJson = "{\"username\": \"junseo\", \"password\": \"1234\"}";
mockMvc.perform(post("/users/create") // 요청을 만드는 단계
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.content(userJson))
// 응답을 확인하는 단계
.andExpect(status().isOk())
.andExpect(jsonPath("$.username",is(equalTo("junseo"))))
.andExpect(jsonPath("$.password",is(equalTo("1234"))));
}
}
User 객체를 만들어준다. getter / setter가 있어야한다.(자바 Bean 규약에 의해)
User 객체 코드
public class User {
private Long id;
private String username;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
/users/create 요청을 처리하는 handler를 만들어준다.
UserController 코드
@RestController
public class UserController {
@PostMapping("/users/create")
public User create(@RequestBody User user) {
return user;
}
}
그리고 테스트를 실행하면 정상작동함을 볼 수 있다.