개발하면서 데이터 type을 처리해주면서 문득 궁금한 것이 UI와 JAVA와 개발언어와 데이터 타입이 다른데 어떻게 Java에 맞게 데이터가 넘어오고 type이 맞는지 궁금해서 검색
웹 POST 요청 바디의 JSON객체가 ItemCreateDto에 제대로 바인딩되는지 확인하고 싶을 시
@RequestBody 사용하게 되면 요청 바디의 데이터가 파리미터에 전달되기 전에 HttpMessageConverter를 거친다
HttpMessageConverter 안에는 아래와 같은 로직으로 동작하는데
@SpringBootTest
public class ItemRestControllerTest {
@Autowired
private HttpMessageConverters converters;
@Test
public void notNull() {
assertThat(converters).isNotNull();
converters.getConverters().stream()
.forEach(c -> System.out.println(c.getClass()));
}
}
class org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$ResourceSupportHttpMessageConverter
class org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration$ResourceSupportHttpMessageConverter
class org.springframework.data.rest.webmvc.convert.UriListHttpMessageConverter
class org.springframework.http.converter.ByteArrayHttpMessageConverter
class org.springframework.http.converter.StringHttpMessageConverter
class org.springframework.http.converter.StringHttpMessageConverter
class org.springframework.http.converter.ResourceHttpMessageConverter
class org.springframework.http.converter.ResourceRegionHttpMessageConverter
class org.springframework.http.converter.xml.SourceHttpMessageConverter
class org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter
class org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
class org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter
class org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
class org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter
위와 같은 컨버터들이 등록되어 있음, 위의 내용으로 JSON 데이터를 객체에 바인딩할 때 MappingJackson2HttpMessageConverter 객체가 사용한다는 것을 알 수 있음
MappingJackson2HttpMessageConverter가 사용된다는 걸 알았으니 전체 MVC 흐름 위에서 테스트를 작성하는게 아닌, 고립된 범위에서 테스트를 작성
@Test
public void create_bindingTest() throws Exception {
List<ItemDetailDto> details = new ArrayList<>();
details.add(new ItemDetailDto("tag","content"));
ItemCreateDto createDto = ItemCreateDto.builder()
.name("name")
.price(1000)
.stockQuantity(1000)
.details(details).build();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(new ObjectMapper());
Object ret = converter.read(ItemCreateDto.class, new MockHttpInputMessage(gson.toJson(createDto).getBytes()));
ItemCreateDto bindedDto = (ItemCreateDto) ret;
assertThat(bindedDto.getName()).isEqualTo("name");
assertThat(bindedDto.getPrice()).isEqualTo(1000);
assertThat(bindedDto.getStockQuantity()).isEqualTo(1000);
assertThat(bindedDto.getDetails()).isEqualTo(details);
}