Files
java-examples/docs/Jackson Streaming API.md

162 lines
5.8 KiB
Markdown

# **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를 사용하자!**