Jackson 라이브러리는 자바에서 JSON 데이터를 처리하기 위한 라이브러리다.
Jackson의 ObjectMapper는 자바 객체와 JSON 데이터 사이의 직렬화와 역직렬화를 담당하는 클래스다.
직렬화(Serialization)
일반적으로 직렬화는 객체의 상태를 저장하거나 다른 환경으로 전송 가능한 형태로 변환하는 과정을 의미
직렬화된 형태는 바이트 스트림, JSON, XML 등이 될 수 있다
역직렬화(Deserialization)
직렬화된 데이터(바이트 스트림, JSON, XML 등)를 원래의 데이터 형태(객체, 데이터 구조 등)로 복원하는 과정을 의미
기본적으로 스프링부트는 실행이 될 때 ObjectMapper가 설정되어 있는지 확인을 하고 없다면 default 설정으로 ObjectMapper를 만들어준다.
데이터를 송수신하는 과정에서 default설정으로 모든 경우를 커버할 수 있을까? 예를 들어 두 가지의 경우를 생각해 보자.
Case(1) 특정 회사와 JSON 통신할 때는 snake_case인데, 내부적으로 camelCase을 사용한다.
Case(2) 객체가 Java 8의 새로운 날짜 및 시간 타입들(LocalDate, LocalTime, LocalDateTime)을 사용하고 있다.
default설정으로는 데이터 송수신(직렬화, 역직렬화)을 할 수 없다. 이러한 경우 ObjectMapper를 Custom 하여 사용하면 된다.
@JsonFormat(pattern = "yyyyMMddHHmmss")
private LocalDateTime enrDtm;
⇒ ObjectMapper에 설정을 추가하여 중복 및 반복되는 소스를 제거한다.@Component
public class JacksonConfig {
private String dateFormat = "yyyyMMdd";
private String timeFormat = "HHmmss";
private String datetimeFormat = "yyyyMMddHHmmss";
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy());
//사용자정의
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat)));
simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(datetimeFormat)));
simpleModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat)));
simpleModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(timeFormat)));
simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(datetimeFormat)));
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy());
//사용자정의
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat)));
simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(datetimeFormat)));
simpleModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat)));
simpleModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(timeFormat)));
simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(datetimeFormat)));
objectMapper.registerModule(simpleModule);
각자 상황을 고려하여 ObjectMapper를 설정하면 된다.
다음글에서 ObjectMapper를 이용하여 직렬화, 역직렬화 과정을 테스트해 보고자 한다.
그 과정에서 readValue(), writeValue(), JsonNode, ObjectNode의 사용법에 대해서 정리해 보겠다.
ObjectMapper 사용법 (readValue, writeValue, JsonNode, ObjectNode)
ResponseBodyAdvice 인터페이스 파해치기 (37) | 2024.12.27 |
---|---|
Jackson - ObjectMapper 사용법 (readValue, writeValue, JsonNode, ObjectNode) (42) | 2024.12.26 |
ImmutableList에 대한 고찰 (1) | 2024.10.13 |
SpringBoot CSV Read / Write (opencsv) (8) | 2024.09.12 |
REST API Response Format에 대한 고찰 (ResponseEntity, JSend, ResponseBodyAdvice) (0) | 2024.09.09 |
댓글 영역