[SpringBoot][WebMVC] HttpMessageConverters

2022. 11. 8. 12:00JAVA/Spring

HttpMessageConverters란 무엇인가?

HTTP 요청 본문을 객체로 변경하거나, 객체를 HTTP 응답 본문으로 변경할 때 사용하는 컨버터

{”username” : “yonghwan”, “password” : “123”} ↔ User

@RequestBody

  • HTTP 요청 본문을 객체로 변환

@ResponseBody

  • 객체를 HTTP 요청 본문으로 변환
  • 컨트롤러에 @RestController가 붙어있으면 리턴 타입에 @ResponseBody를 생략할 수 있음
// before
@PostMapping("/users/create")
public @ResponseBody User create(@RequestBody User user){
    return user;
}

// after
@PostMapping("/users/create")
public User create(@RequestBody User user){
    return user;
}

 

@RestController

  • @RestController는 @Controller에 @ResponseBody가 추가된 형태
  • @RestController의 주목적은 Json 형태로 객체 데이터를 반환하는 것
  • @RestController를 붙이게 되면 각 매핑 메서드의 반환값들은 뷰 네임 리졸버(ViewNameResolver)를 타지 않고 HttpMessageConverters를 타게되어 Response 본문으로 나가게 됩니다.
  • @Controller를 붙이게 되면 각 매핑 메서드의 반환값들은 뷰 네임 리졸버를 타게되어 templates/ 아래에 해당하는 뷰 네임이 있는지 탐색하게 됩니다.

 

실습, @RestController + @RequestBody + @ResponseBody

  • @ResponseBody 애노테이션 같은 경우 @RestController이 붙어있기 때문에 생략이 가능함
@WebMvcTest(UserController.class)
public class UserControllerTest {
    @Autowired
    MockMvc mockMvc;
    
    @Test
    public void testCreateUser_JSON() throws Exception {
        String userjson = "{\\"username\\" : \\"yonghwan\\", \\"password\\" : \\"123\\"}";
        mockMvc.perform(post("/users/create")
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON)
                    .content(userjson))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.username",
                        is(equalTo("yonghwan"))))
                .andExpect(jsonPath("$.password",
                        is(equalTo("123"))));
    }
}
@RestController
public class UserController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }

    @PostMapping("/users/create")
    public User create(@RequestBody User user){
        return user;
    }
}
@Getter
@Setter
public class User {
    private Long id;
    private String username;
    private String password;
}

 

References

source code : https://github.com/yonghwankim-dev/springboot_study/tree/main/springboot_webmvc/src/test/java/kr/yh/user
[인프런] 스프링 부트 개념과 활용
[Spring] @Controller와 @RestController 차이