일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- java
- Spring JPA
- HashMap
- Sleuth
- spring MVC
- map
- Spring Boot
- jpa
- b3-propagation
- spring
- traceasynccustomautoconfiguration
- @FunctionalInterface
- asyncconfigurer
- DeferredImportSelector
- EnableWebMvc
- asynccustomautoconfiguration
- java.util.list
- traceId
- list
- ResponseBody
- micrometer tracing
- CompletableFuture
- java lambda
- spring3 spring2 traceid
- java list
- awssecretsmanagerpropertysources
- elasticsearch
- kotlin
- aws secretmanager
- SpringMVC
- Today
- Total
du.study기록공간
[Spring MVC] @ResponseBody 응답에 대하여 알아보자(2) 본문
저번 글에서 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가 추가되어있습니다.
해당 Converter를 통해서 Object는 json으로 변환이 되고 응답 본문에 실려서 결과를 리턴받게 해줍니다.
jackson을 이용함으로써, json으로 데이터를 주고받을 수 있기에, 쉽게 ajax등 통신을 하여 도메인에 매핑 또는 결과를 리턴받을 수 있습니다.
'스프링' 카테고리의 다른 글
Customizing Validation Tasks (0) | 2019.11.16 |
---|---|
[Spring MVC] @Validated(@Valid) and BindingResult (0) | 2019.11.12 |
[Spring MVC] @ResponseBody 응답에 대하여 알아보자(1) (0) | 2019.11.10 |
[Spring MVC] Handler Interceptor (0) | 2019.11.10 |
[Spring MVC] @EnableWebMvc 활용하기 (0) | 2019.11.08 |