JAVA

[JAVA] Gson을 활용한 성능 최적화

인생아 2024. 12. 14. 21:14
반응형

Gson을 활용한 성능 최적화는 대용량 JSON 데이터를 효율적으로 처리하고 메모리 사용을 최소화하기 위한 방법을 제공합니다. 특히, 대규모 데이터 처리나 네트워크 스트리밍 환경에서 Gson의 스트리밍 API와 최적화 전략은 중요한 역할을 합니다. 아래에서는 Gson을 활용한 성능 최적화 방법을 단계별로 설명합니다.

대용량 JSON 데이터 처리
대용량 JSON 데이터를 처리할 때, 전체 데이터를 메모리에 로드하지 않고 분할 처리하거나 스트리밍 방식을 사용하는 것이 효율적입니다.

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

public class LargeJsonProcessing {
    public static void main(String[] args) {
        String filePath = "data.json";

        try (FileReader reader = new FileReader(filePath)) {
            Gson gson = new Gson();
            Type type = new TypeToken<List<Map<String, Object>>>() {}.getType();

            // 대량의 데이터를 읽어오는 예제
            List<Map<String, Object>> data = gson.fromJson(reader, type);

            System.out.println("총 데이터 수: " + data.size());
            // 첫 번째 데이터 확인
            System.out.println("첫 번째 항목: " + data.get(0));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 코드는 대량 JSON 데이터를 파일에서 읽고 필요한 데이터만 로드하여 처리합니다. TypeToken을 사용하여 제네릭 타입 데이터를 처리합니다.

반응형

스트리밍 API를 사용한 효율적인 JSON 읽기/쓰기
JsonReaderJsonWriter는 Gson에서 제공하는 스트리밍 API로, 대량의 데이터를 처리할 때 메모리를 효율적으로 사용합니다.

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class StreamingJsonExample {
    public static void main(String[] args) {
        String inputFile = "inputdata.json";
        String outputFile = "outputdata.json";

        try (JsonReader reader = new JsonReader(new FileReader(inputFile));
             JsonWriter writer = new JsonWriter(new FileWriter(outputFile))) {

            writer.beginArray();
            reader.beginArray();

            while (reader.hasNext()) {
                reader.beginObject();
                String name = null;
                int population = 0;

                while (reader.hasNext()) {
                    String fieldName = reader.nextName();
                    if (fieldName.equals("name")) {
                        name = reader.nextString();
                    } else if (fieldName.equals("population")) {
                        population = reader.nextInt();
                    } else {
                        reader.skipValue();
                    }
                }

                reader.endObject();

                // 특정 조건에 맞는 데이터만 쓰기
                if (population > 5000000) {
                    writer.beginObject();
                    writer.name("name").value(name);
                    writer.name("population").value(population);
                    writer.endObject();
                }
            }

            reader.endArray();
            writer.endArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이 코드는 JsonReader를 사용해 JSON 데이터를 순차적으로 읽고, 조건에 맞는 데이터를 JsonWriter를 통해 새로운 파일로 저장합니다. 메모리를 효율적으로 사용하는 방식입니다.

메모리 사용 최적화 전략

  1. Lazy Parsing: Gson은 필요할 때만 데이터를 파싱하므로 메모리를 절약할 수 있습니다.
  2. 스트리밍 사용: 전체 데이터를 메모리에 로드하지 않고 순차적으로 처리합니다.
  3. 필요한 필드만 파싱: JSON 데이터에서 필요한 필드만 읽고 나머지는 skipValue()로 건너뜁니다.
  4. 캐싱: 동일한 데이터를 반복적으로 파싱할 경우 캐싱을 활용하여 성능을 향상시킵니다.
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class MemoryOptimizedParsing {
    public static void main(String[] args) {
        String jsonData = """
            {
                "name": "서울",
                "population": 9733509,
                "details": {
                    "area": 605.21,
                    "density": 16075
                }
            }
        """;

        JsonObject jsonObject = JsonParser.parseString(jsonData).getAsJsonObject();

        // 필요한 필드만 파싱
        String name = jsonObject.get("name").getAsString();
        int population = jsonObject.get("population").getAsInt();

        System.out.println("City: " + name);
        System.out.println("Population: " + population);
    }
}

위 코드는 필요한 필드만 파싱하여 불필요한 메모리 사용을 줄입니다.

Gson의 공식 문서 및 가이드

반응형