162 lines
5.8 KiB
Markdown
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를 사용하자!** |