[java] Gson 라이브러리의 성능 개선 방법은?

Gson은 Google에서 개발한 자바용 JSON 라이브러리로, 객체와 JSON 간의 직렬화(Serialization)와 역직렬화(Deserialization)를 지원합니다. Gson은 인기있는 라이브러리이지만, 대용량 데이터를 다룰 때 성능 문제가 발생할 수 있습니다. 이번 포스트에서는 Gson 라이브러리의 성능을 개선하는 몇 가지 방법을 알아보겠습니다.

1. 객체의 필드에 transient 키워드 사용하기

Gson은 기본적으로 객체의 모든 필드를 직렬화하고 역직렬화합니다. 하지만, 일부 필드를 직렬화에서 제외하고자 할 때 transient 키워드를 사용할 수 있습니다. 이렇게 하면 해당 필드는 Gson에 의해 무시됩니다. 대용량 데이터를 다룰 때는 직렬화할 필요가 없는 필드를 transient로 선언하여 성능을 개선할 수 있습니다.

public class MyData {
    private transient String sensitiveData;
    // ...
}

2. transient 필드를 직접 처리하기

transient 필드를 무시하지 않고 직접 처리하려면, ExclusionStrategy 인터페이스를 구현하여 Gson에 전달해야 합니다. 이 인터페이스를 사용하면 특정 필드를 직렬화에서 제외하거나 특별한 방식으로 처리할 수 있습니다.

public class MyExclusionStrategy implements ExclusionStrategy {
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        return f.getAnnotation(Transient.class) != null;
    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }
}

이후, Gson을 생성할 때 ExclusionStrategy를 등록합니다.

Gson gson = new GsonBuilder()
    .addSerializationExclusionStrategy(new MyExclusionStrategy())
    .create();

3. @SerializedName 어노테이션 사용하기

Gson은 기본적으로 객체의 필드 이름을 JSON의 키로 사용합니다. 하지만, JSON과 필드 이름이 다를 경우 @SerializedName 어노테이션을 사용하여 매핑할 수 있습니다. 이렇게 하면 Gson은 해당 어노테이션이 있는 필드를 직렬화 및 역직렬화할 때 사용할 key를 지정할 수 있습니다. 이 방법을 사용하면 필드 이름을 변경하거나 JSON과 개발자 사이에 언어 호환성을 지정할 수 있습니다.

public class MyData {
    @SerializedName("json_key")
    private String myField;
    // ...
}

4. fromJson 메서드를 사용해 대용량 데이터 처리하기

Gson은 대용량 데이터를 처리할 때 오버헤드가 발생할 수 있습니다. 이때는 fromJson() 메서드를 직접 사용하여 메모리 사용량을 최적화할 수 있습니다. JsonReader를 직접 생성하고 필요한 만큼의 데이터만 처리할 수 있도록 조정할 수 있습니다.

JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
reader.beginArray();
while (reader.hasNext()) {
    MyData data = gson.fromJson(reader, MyData.class);
    // 처리 로직 추가
}
reader.endArray();
reader.close();

이렇게 함으로써 Gson은 모든 데이터를 한 번에 메모리에 로드하지 않고 필요한 만큼씩 처리할 수 있습니다.

결론

Gson은 강력한 JSON 라이브러리로, 성능을 개선하기 위한 다양한 방법을 제공합니다. 이 포스트에서는 transient 키워드를 사용하여 필드를 제외하고, ExclusionStrategy 인터페이스를 사용하여 직접 처리하고, @SerializedName 어노테이션을 사용하여 필드 이름을 변경하며, fromJson() 메서드를 사용하여 대용량 데이터를 처리하는 방법을 알아보았습니다. 이러한 방법들을 사용하여 Gson의 성능을 향상시킬 수 있습니다.

참고 자료