Jackson은 Java의 JSON 처리 라이브러리로, Java 8 이상의 기능들과 통합하여 더욱 다양한 기능을 제공합니다. Optional 및 LocalDateTime과 같은 Java 8의 새로운 데이터 타입을 Jackson과 함께 사용할 수 있으며, Stream을 활용하여 데이터 직렬화와 역직렬화를 처리할 수 있습니다.
Java 8 Optional과 Jackson의 연동
Java 8의 Optional 클래스는 null 처리에 안전한 코드 작성에 유용한 클래스입니다. Jackson은 기본적으로 Optional 필드를 무시하므로, ObjectMapper를 통해 Optional 타입을 JSON 데이터로 직렬화하거나 역직렬화할 수 있도록 설정이 필요합니다. Jackson의 jackson-datatype-jdk8 모듈을 추가하면 Optional을 더 쉽게 처리할 수 있습니다.
Optional 연동 예제
1. pom.xml 파일에 jackson-datatype-jdk8 의존성을 추가합니다.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.13.0</version>
</dependency>
2. ObjectMapper에 Jdk8Module 등록하여 Optional을 처리할 수 있도록 설정합니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
// Optional 필드가 있는 객체
Person person = new Person("김철수", Optional.of("서울"));
// 객체를 JSON으로 직렬화
String json = mapper.writeValueAsString(person);
System.out.println("JSON 직렬화: " + json);
// JSON 문자열을 객체로 역직렬화
Person deserializedPerson = mapper.readValue(json, Person.class);
System.out.println("역직렬화된 객체: " + deserializedPerson);
}
}
class Person {
private String name;
private Optional<String> city;
public Person(String name, Optional<String> city) {
this.name = name;
this.city = city;
}
// Getters and Setters
// ...
}
이 예제에서 Jackson은 Optional 필드를 처리하며, city 필드가 존재하는 경우에만 JSON에 포함됩니다. Optional 필드를 지원하는 설정을 통해 불필요한 null 체크를 줄일 수 있습니다.
Java 8 LocalDateTime 및 날짜 타입 처리 방법
Java 8부터 새롭게 도입된 LocalDateTime, LocalDate 등 날짜 관련 API는 Jackson과의 연동을 위해 jackson-datatype-jsr310 모듈이 필요합니다. Jackson은 이 모듈을 통해 Java 8의 날짜 타입을 JSON으로 직렬화하거나 역직렬화할 수 있습니다.
LocalDateTime 연동 예제
1. pom.xml에 jackson-datatype-jsr310 모듈을 추가합니다.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.0</version>
</dependency>
2. ObjectMapper에 JavaTimeModule을 등록합니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDateTime;
public class LocalDateTimeExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Event event = new Event("회의", LocalDateTime.of(2023, 11, 1, 10, 0));
// LocalDateTime을 포함하는 객체를 JSON으로 직렬화
String json = mapper.writeValueAsString(event);
System.out.println("JSON 직렬화: " + json);
// JSON 문자열을 객체로 역직렬화
Event deserializedEvent = mapper.readValue(json, Event.class);
System.out.println("역직렬화된 객체: " + deserializedEvent);
}
}
class Event {
private String title;
private LocalDateTime dateTime;
public Event(String title, LocalDateTime dateTime) {
this.title = title;
this.dateTime = dateTime;
}
// Getters and Setters
// ...
}
이 예제에서는 Jackson이 LocalDateTime을 ISO 8601 형식으로 직렬화하고, 이를 다시 역직렬화합니다. ObjectMapper에 JavaTimeModule을 등록하면, 다양한 날짜 형식의 데이터를 지원하며 코드의 유연성이 증가합니다.
Stream 데이터 직렬화와 역직렬화
Java 8의 Stream API는 대용량 데이터를 처리하는 데 유용하지만, Stream을 직렬화하거나 역직렬화하는 경우에는 Jackson이 기본적으로 이를 지원하지 않습니다. Stream을 리스트나 배열로 변환하여 처리할 수 있으며, 커스텀 직렬화/역직렬화 로직을 통해 Stream 타입 데이터를 다룰 수 있습니다.
Stream 데이터 직렬화와 역직렬화 예제
Stream 데이터를 List로 변환하여 직렬화합니다.
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Stream 데이터 생성
Stream<String> streamData = Stream.of("데이터1", "데이터2", "데이터3");
// Stream을 List로 변환 후 직렬화
List<String> dataList = streamData.collect(Collectors.toList());
String json = mapper.writeValueAsString(dataList);
System.out.println("Stream 직렬화된 JSON: " + json);
// JSON 데이터를 List로 역직렬화
List<String> deserializedList = mapper.readValue(json, new TypeReference<List<String>>() {});
System.out.println("역직렬화된 데이터: " + deserializedList);
}
}
이 코드에서 Stream 데이터를 직렬화하기 위해 Stream을 List로 변환하여 처리합니다. Stream을 직접 JSON으로 직렬화하는 기능은 없지만, Stream을 일단 컬렉션으로 변환하면 Jackson을 통해 간편하게 직렬화 및 역직렬화할 수 있습니다.
효율적인 JSON 처리 전략
- 필요한 모듈 등록: Jackson과 Java 8 기능 연동 시 jackson-datatype-jdk8과 jackson-datatype-jsr310 모듈을 활용해 Optional과 LocalDateTime을 원활하게 처리합니다.
- 스트림 데이터 처리: Stream은 직렬화가 기본적으로 지원되지 않으므로 컬렉션 변환 후 직렬화하는 방식으로 유연하게 처리합니다.
- 커스텀 직렬화기 활용: 고급 JSON 데이터 처리 시 JsonSerializer와 JsonDeserializer를 사용해 복잡한 데이터 형식을 효과적으로 다룰 수 있습니다.
참고 사이트
- Jackson 공식 가이드: https://github.com/FasterXML/jackson
'JAVA' 카테고리의 다른 글
[JAVA] Jackson과 Spring Boot 통합 (0) | 2024.11.15 |
---|---|
[JAVA] Jackson을 활용한 XML 데이터 처리 (0) | 2024.11.14 |
[JAVA] Jackson의 성능 최적화 전략 (0) | 2024.11.13 |
[JAVA] Jackson 커스텀 모듈 사용하기 (0) | 2024.11.12 |
[JAVA] Jackson의 Data Binding API와 Tree Model API 차이점 (0) | 2024.11.12 |
[JAVA] Jackson Tree Model API 활용하기 (1) | 2024.11.12 |
[JAVA] Jackson 컬렉션 및 배열 데이터 처리 (1) | 2024.11.12 |
[JAVA] Jackson 고급 직렬화와 역직렬화 설정 (0) | 2024.11.11 |