# **Jackson Streaming API 정리 및 예제** ## **1. Jackson Streaming API란?** **Jackson Streaming API**는 대량의 JSON 데이터를 메모리 효율적으로 처리할 수 있도록 설계된 API다. 기본적으로 **이벤트 기반 방식**(push/pull 방식)을 사용하며, JSON을 한 번에 모두 로드하지 않고 **스트림 방식으로 읽고 쓸 수 있다**. **✔ 주요 특징:** ✅ 대량의 JSON 데이터를 처리할 때 **메모리 사용량이 적다** ✅ 기존 `ObjectMapper` 방식보다 **빠른 속도로 JSON을 처리 가능** ✅ `JsonParser`와 `JsonGenerator`를 사용하여 **JSON을 읽고 쓸 수 있다** --- ## **2. Jackson Streaming API 주요 메서드 정리** ### **📌 JSON 읽기 (`JsonParser`)** | 메서드 | 설명 | |--------|------| | `nextToken()` | 다음 JSON 토큰으로 이동 | | `getCurrentToken()` | 현재 위치의 JSON 토큰 가져오기 | | `getText()` | 현재 위치의 JSON 문자열 값 가져오기 | | `getIntValue()` | 현재 위치의 JSON 정수 값 가져오기 | | `getBooleanValue()` | 현재 위치의 JSON 불리언 값 가져오기 | | `getDoubleValue()` | 현재 위치의 JSON 실수 값 가져오기 | | `getCurrentName()` | 현재 JSON 필드명 가져오기 | --- ### **📌 JSON 쓰기 (`JsonGenerator`)** | 메서드 | 설명 | |--------|------| | `writeStartObject()` | JSON 객체 시작 (`{` 추가) | | `writeEndObject()` | JSON 객체 종료 (`}` 추가) | | `writeStartArray()` | JSON 배열 시작 (`[` 추가) | | `writeEndArray()` | JSON 배열 종료 (`]` 추가) | | `writeFieldName(String name)` | JSON 필드명 작성 | | `writeString(String text)` | JSON 문자열 값 작성 | | `writeNumber(int value)` | JSON 숫자 값 작성 | | `writeBoolean(boolean value)` | JSON 불리언 값 작성 | | `writeNull()` | JSON `null` 값 작성 | --- ## **3. Jackson Streaming API 예제** ### **✔ JSON 읽기 (`JsonParser`) 예제** 아래 JSON 파일을 스트리밍 방식으로 읽어보자. ```json { "name": "홍길동", "age": 30, "isAdmin": false } ``` **🔹 JSON을 스트리밍 방식으로 읽는 코드** ```java import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import java.io.File; public class JsonParserExample { public static void main(String[] args) throws Exception { JsonFactory factory = new JsonFactory(); JsonParser parser = factory.createParser(new File("data.json")); String fieldName = null; while (!parser.isClosed()) { JsonToken token = parser.nextToken(); if (token == null) break; if (token.isStructStart() || token.isStructEnd()) { // JSON의 {, } 같은 기호는 스킵 continue; } if (token == JsonToken.FIELD_NAME) { fieldName = parser.getCurrentName(); } else if (fieldName != null) { switch (fieldName) { case "name": System.out.println("이름: " + parser.getText()); break; case "age": System.out.println("나이: " + parser.getIntValue()); break; case "isAdmin": System.out.println("관리자 여부: " + parser.getBooleanValue()); break; } fieldName = null; } } parser.close(); } } ``` **🔹 실행 결과** ``` 이름: 홍길동 나이: 30 관리자 여부: false ``` ✅ **JSON을 한 줄씩 읽으면서 처리하는 방식이라 메모리 사용량이 적다!** --- ### **✔ JSON 쓰기 (`JsonGenerator`) 예제** **🔹 JSON을 스트리밍 방식으로 생성하는 코드** ```java import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import java.io.File; public class JsonGeneratorExample { public static void main(String[] args) throws Exception { JsonFactory factory = new JsonFactory(); JsonGenerator generator = factory.createGenerator(new File("output.json"), com.fasterxml.jackson.core.JsonEncoding.UTF8); generator.writeStartObject(); generator.writeStringField("name", "홍길동"); generator.writeNumberField("age", 30); generator.writeBooleanField("isAdmin", false); generator.writeEndObject(); generator.close(); System.out.println("JSON 파일 생성 완료!"); } } ``` **🔹 생성된 `output.json` 파일 내용** ```json { "name": "홍길동", "age": 30, "isAdmin": false } ``` ✅ **한 줄씩 JSON을 생성하는 방식이라 메모리 사용량이 적다!** --- ## **4. Jackson Streaming API vs 일반 Jackson API** | 비교 항목 | Jackson Streaming API | 일반 Jackson (`ObjectMapper`) | |------------|------------------|----------------| | 데이터 처리 방식 | **스트리밍 방식 (한 줄씩 처리)** | **전체 로딩 방식 (객체 매핑)** | | 메모리 사용량 | **적음 (대량 데이터에 적합)** | 많음 (작은 데이터에 적합) | | 속도 | 빠름 | 비교적 느림 | | 사용 예시 | **대량의 JSON 데이터를 읽고 쓸 때** | **소규모 JSON 데이터를 객체로 변환할 때** | --- ## **5. 정리** ✔ **Jackson Streaming API**는 JSON을 한 줄씩 읽고 쓰는 방식이라 **대량의 JSON 데이터를 처리할 때 매우 유용**하다. ✔ `JsonParser`를 사용하면 JSON을 **이벤트 기반으로 파싱 가능**하다. ✔ `JsonGenerator`를 사용하면 JSON을 **메모리 효율적으로 생성 가능**하다. ✔ 일반 `ObjectMapper`보다 **메모리 사용량이 적고, 속도가 빠르다!** ✅ **대량의 JSON 데이터를 처리해야 한다면, Jackson Streaming API를 사용하자!**