du.study기록공간

[Spring MVC] @ResponseBody 응답에 대하여 알아보자(2) 본문

스프링

[Spring MVC] @ResponseBody 응답에 대하여 알아보자(2)

du.study 2019. 11. 10. 23:30
728x90

저번 글에서 ResponseBody응답으로 간단한 Spring타입에 대해서 리턴받는 방식을 기록한 적이 있습니다.

(해당글은 여기에 :https://duooo-story.tistory.com/9)

 

이번에는 일반적으로 사용되는 Object를 json형태로 return 받는 방식에 대해서 살펴보려 합니다.

 

@RequestMapping("/jackson")
@ResponseBody
public TestDomain helloObject() {
    // 뭔가를 받아와서 도메인을 만들었다 가정하고..
    TestDomain tobj = new TestDomain("du",10);
    return tobj;
}

만약 @EnableWebMvc ,WebMvcConfigurer등에대한 기본 설정만 한 상태라면 다음과 같은 에러를 맞이하게 됩니다.

 

No converter found for return value of type: class du.study.domain.TestDomain

 

이는 TestDomain 의 converter 타입을 찾지 못하여 발생하는 에러로 jackson-databind 를 dependency에 추가해주면 에러는 피할 수 있습니다.

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
</dependency>

해당 maven dependency를 추가하면 깔끔하게 {"name":"du","id":10} 의 응답이 노출이 됩니다.

 

그럼 이게 왜? 이렇게 응답이 되는지 기록해 보겠습니다.

 

먼저 @EnableWebMvc선언을 통해서 호출되는 WebMvcConfigurationSupport를 살펴보겠습니다. 위의 dependency를 임포트 해주면, 먼저 해당 static 부분의 jackson2Present가 true가 됩니다.

 

static {
	......
	jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
						ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
	......
}

 

그리고 requestMappingHandlerAdapter의 getMessageConverters()를 실행하게 되면서 아래 코드블럭이 결과적으로 실행되어 jackson관련 메세지 컨버터가 추가로 등록이 되게 됩니다.

if (jackson2Present) {
	Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
	if (this.applicationContext != null) {
		builder.applicationContext(this.applicationContext);
	}
	messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}

 

그리고 요청을 받게되면 일반적인 @ResponseBody, String return 타입리턴 방식과 동일하게 흘러가지만, writeWithMessageConverters() 에서 messageConverters리스트엔 jackson관련 converter가 추가되어있습니다.

MappingJackson2HttpMessageConverter 가 추가되어 있는 모습

해당 Converter를 통해서 Object는 json으로 변환이 되고 응답 본문에 실려서 결과를 리턴받게 해줍니다.

 

jackson을 이용함으로써, json으로 데이터를 주고받을 수 있기에, 쉽게 ajax등 통신을 하여 도메인에 매핑 또는 결과를 리턴받을 수 있습니다.

 

 

 

728x90
Comments