반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링
- 기술공부
- DDD
- 스프링 공부
- JPA 공부
- nestjs공부
- JPA예제
- 스프링부트
- JPA스터디
- 플러터 공부
- 자료구조공부
- Kafka
- JPA공부
- 카프카
- 스프링공부
- 프로그래머스
- nestjs
- K8S
- querydsl
- 기술면접공부
- 스프링부트공부
- 알고리즘공부
- Axon framework
- JPA
- nestjs스터디
- 자바공부
- 코테공부
- 플러터 개발
- Flutter
- 코테준비
Archives
- Today
- Total
DevBoi
[Spring] ObjectMapper 사용 본문
반응형
쉽게 json과 ObjectMapper를 많이 쓴다.
이유는 String <-> Object간의 자유로운 이동과 변환을 위해서 많이 사용한다.
내가 주로 사용하는것 외에도 다른 기능들이 존재할 것 같아서, 해당 기능들을 사용하면서 포스팅해보자
1. 의존성 추가
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'
2. 간단한 사용 예제
(Object -> String, writerValue)
package com.example.demo;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class BookController {
private final ObjectMapper mapper;
@RequestMapping("/test2")
public String test() throws Exception{
MemberDto dto = new MemberDto("test1","test2","test3");
String result = mapper.writeValueAsString(dto);
return result;
}
}
(String -> Object,readValue)
package com.example.demo;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class BookController {
private final ObjectMapper mapper;
@RequestMapping("/test2")
public String test() throws Exception{
MemberDto dto = new MemberDto("test1","test2","test3");
String result = mapper.writeValueAsString(dto);
MemberDto returnDto = mapper.readValue(result,MemberDto.class);
return returnDto.getAddress();
}
}
이렇게 하면 우선 String <-> Object간의 변환이 자유로워 진다.
추가로, Map,List에 대해서도 다양한 기능을 지원한다. Map,List둘다 비슷비슷하게 사용되기 때문에
해당 내용은 리스트만 테스트해서 작성해보도록 하자
List -> String
package com.example.demo;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequiredArgsConstructor
public class BookController {
private final ObjectMapper mapper;
@RequestMapping("/test2")
public String test() throws Exception{
MemberDto dto = new MemberDto("test1","test2","test3");
MemberDto dto1 = new MemberDto("test1","test2","test3");
MemberDto dto2 = new MemberDto("test1","test2","test3");
List<MemberDto> dtos = List.of(dto,dto1,dto2);
String result = mapper.writeValueAsString(dtos);
return result;
}
}
String -> List
package com.example.demo;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequiredArgsConstructor
public class BookController {
private final ObjectMapper mapper;
@RequestMapping("/test2")
public int test() throws Exception{
MemberDto dto = new MemberDto("test1","test2","test3");
MemberDto dto1 = new MemberDto("test1","test2","test3");
MemberDto dto2 = new MemberDto("test1","test2","test3");
List<MemberDto> dtos = List.of(dto,dto1,dto2);
String result = mapper.writeValueAsString(dtos);
List<MemberDto> returnDto= mapper.readValue(result, new TypeReference<>() {});
return returnDto.size();
}
}
TypeReference의 개념이 처음으로 등장한다.
해당 내용에 대해서 조금 자세히 이해하려면, 제네릭 Type Eraser와 Type Cast의 런타임 개념이 필요하니 참고하자.
3. 변환 정책 설정 ( Null은 제외 하거나, 모르는 속성은 제외 하거나 등등)
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT,false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES,false);
4. 별도의 Deserializer와 결합하여 생성할 수도있다.
package com.example.demo;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.lang.reflect.Member;
@Configuration
@RequiredArgsConstructor
public class SmithCustomSerializer{
private final ObjectMapper objectMapper;
public String deserializer(MemberDto dto) throws JsonProcessingException {
return objectMapper.writeValueAsString(dto);
}
}
package com.example.demo;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequiredArgsConstructor
public class BookController {
private final SmithCustomSerializer serializer;
@RequestMapping("/test2")
public String test() throws Exception{
MemberDto dto = new MemberDto("test1","test2","test3");
MemberDto dto1 = new MemberDto("test1","test2","test3");
MemberDto dto2 = new MemberDto("test1","test2","test3");
List<MemberDto> dtos = List.of(dto,dto1,dto2);
return serializer.deserializer(dto);
}
}
위와 같이 결합해서 사용할 수도있다.
이외, DateFormat 정책을 런타임 중에 변경할수도있다고 한다.
이는 실제로 해보지는 않고, 그냥 알아만 두자(실제로는 많이 안쓰일듯ㅋ)
반응형
'Develop > [Spring]' 카테고리의 다른 글
[Spring] 좋은 공통화된 Response를 만들어볼까? (0) | 2023.07.28 |
---|---|
[Spring] Springboot 3.2 Swagger 설정 (0) | 2023.07.22 |
[Spring] ObjectProvider + FuntionalInterface (0) | 2023.06.22 |
[Spring] ObjectProvider에 대해서. (0) | 2023.06.20 |
[Spring] 멀티모듈의 개념 (0) | 2023.06.18 |