티스토리 뷰

백기선 - 스프링 부트 개념과 활용

HttpMessageConverters

HttpMessageConverters는 스프링 프레임워크에서 제공하는 인터페이스이다.

HTTP 요청 본문을 객체로 변경하거나, 객체를 HTTP 응답 본문으로 변경할 때 사용한다. 사용하는 HttpmessageConverter는 여러가지가 있고, 우리가 어떤 요청을 받았는지, 응답을 보내는지에 따라서 메세지컨버터가 달라진다.

{"username":"keesun", "password":"123"} <-> User
  • @RequestBody

  • @ResponseBody

    • 아래에서 User(객체)를 리턴할 때는 기본적으로 JsonMessageConverter가 사용이되고, String타입을 이턴할 때는 StringMessageConverter가 사용이 된다. int도 마찬가지로 StringMessageConverter이다.

    • @RestController면 @ResponseBody는 생략해도 된다.

      • MessageConverter를 타고 객체를 응답 본문으로 바꾼다.

    • 그냥 @Controller를 사용할 경우에는 @ResponseBody를 넣어야 MessageConverter가 적용이된다.

      • @Controller에서 @ResponseBody를 선언하지 않으면 BeanNameViewResolver에 의해서 ViewName에 해당하는 뷰를 찾으려고 시도한다.

    @PostMapping("/user")
    public @ResponseBody User create(@RequestBody User user) {
    ...
     return new User( ... );
    }
  • 테스트

    • MockMvc를 사용해서 post요청에 대한 응답을 확인하기 위한 테스트코드이다.

    • 요청을 @RestController에서 @RequestBody가 json을 파싱해서 User 객체로 만들고, JsonMessageConverter에 의해 User가 JSON 형태로 만들어져서 return 된다.

    • 테스트코드에서는 jsonPath를 사용해서 결과로 받은 status와 JSON의 프로퍼티를 검증한다.

    • POST요청의 요청 타입은 JSON이고, 응답을 원하는 타입을 의미하는 accept 헤더도 JSON으로 세팅한다.

package io.namjune.springbootconceptandutilization.user;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

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.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

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

   @Autowired
   MockMvc mockMvc;

   @Test
   public void createUser_JSON() throws Exception {
       String userJson = "{\"username\":\"namjune\", \"password\":\"123\"}";
       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("namjune"))))
          .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;
}








댓글