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

5.8 KiB

Jackson Streaming API 정리 및 예제

1. Jackson Streaming API란?

Jackson Streaming API는 대량의 JSON 데이터를 메모리 효율적으로 처리할 수 있도록 설계된 API다.
기본적으로 이벤트 기반 방식(push/pull 방식)을 사용하며, JSON을 한 번에 모두 로드하지 않고 스트림 방식으로 읽고 쓸 수 있다.

✔ 주요 특징:
대량의 JSON 데이터를 처리할 때 메모리 사용량이 적다
기존 ObjectMapper 방식보다 빠른 속도로 JSON을 처리 가능
JsonParserJsonGenerator를 사용하여 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 파일을 스트리밍 방식으로 읽어보자.

{
  "name": "홍길동",
  "age": 30,
  "isAdmin": false
}

🔹 JSON을 스트리밍 방식으로 읽는 코드

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을 스트리밍 방식으로 생성하는 코드

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 파일 내용

{
  "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를 사용하자!