화면에서 데이터 어떻게 넘오는가?(MappingJackson2HttpMessageConverter, HttpMessageConverters, Json)

Better late than never·2022년 9월 15일
0

?

개발하면서 데이터 type을 처리해주면서 문득 궁금한 것이 UI와 JAVA와 개발언어와 데이터 타입이 다른데 어떻게 Java에 맞게 데이터가 넘어오고 type이 맞는지 궁금해서 검색

JSON 바인딩

웹 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);
	}

0개의 댓글