카테고리 없음

자바 JSON 핸들링의 두 거물: Jackson vs Gson, 당신의 선택은?

미니임 2026. 3. 8. 21:55

자바 JSON 핸들링의 두 거물: Jackson vs Gson, 당신의 선택은?

현대 소프트웨어 아키텍처에서 JSON은 데이터를 주고받는 '표준 언어'나 다름없습니다. 마이크로서비스 간의 통신부터 프론트엔드와의 API 연동까지, 자바 개발자에게 JSON 파싱 능력은 생존과 직결된 기술이죠. 하지만 막상 프로젝트를 시작하려 하면 고민에 빠집니다. "성능의 Jackson인가, 편의성의 Gson인가?" 오늘은 이 두 라이브러리의 내부 동작 원리와 실무 적용 팁을 깊이 있게 파헤쳐 보겠습니다.


1. 핵심 개념 설명 (Deep Dive)

왜 이 라이브러리들이 필요한가?

자바 객체와 JSON 문자열은 구조 자체가 다릅니다. 객체는 메모리상의 주소를 가진 복합적인 구조체인 반면, JSON은 단순한 텍스트죠. 이 사이를 연결하는 과정을 **직렬화(Serialization)**와 **역직렬화(Deserialization)**라고 부릅니다.

작동 원리와 비유

이 과정을 **'이케아(IKEA) 가구 배송'**에 비유해 볼까요?

  • 직렬화(Object → JSON): 완성된 가구(객체)를 배송하기 위해 분해하여 박스에 담는 과정입니다.
  • 역직렬화(JSON → Object): 배송받은 박스 안의 부품들과 설명서(클래스 정의)를 보고 다시 가구로 조립하는 과정입니다.

Jackson은 마치 자동화된 대형 공장 같습니다. 초기 설정은 조금 까다롭고 덩치가 크지만, 한 번 가동되면 엄청난 속도로 물건을 찍어냅니다. 반면 Gson숙련된 목수의 도구함 같습니다. 가볍고 직관적이며, 복잡한 설정 없이도 바로 작업을 시작할 수 있는 유연함을 자랑합니다.


2. 풍부한 실전 예제 (Hands-on)

실제 이커머스 시스템에서 결제 주문(Order) 데이터를 처리하는 시나리오를 가정해 보겠습니다.

Jackson: 어노테이션 기반의 강력한 제어

Jackson은 ObjectMapper를 중심으로 동작하며, 어노테이션을 통해 세밀한 제어가 가능합니다.

Java
 
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonIgnore;

public class OrderService {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // 실무 데이터 객체 생성
        OrderRequest order = new OrderRequest("ORD-1029", "MacBook Pro", 3500000);

        // 1. 객체를 JSON 문자열로 직렬화
        String jsonResult = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(order);
        System.out.println("Jackson Serialization:\n" + jsonResult);

        // 2. JSON 문자열을 객체로 역직렬화
        OrderRequest decodedOrder = mapper.readValue(jsonResult, OrderRequest.class);
    }
}

class OrderRequest {
    @JsonProperty("order_id") // JSON 키 이름을 별도로 지정
    private String orderId;
    
    private String productName;
    
    @JsonIgnore // 보안상 민감한 정보는 JSON 포함 제외
    private int internalPrice;

    // Jackson은 기본 생성자가 반드시 필요합니다 (역직렬화 시 사용)
    public OrderRequest() {}

    public OrderRequest(String orderId, String productName, int internalPrice) {
        this.orderId = orderId;
        this.productName = productName;
        this.internalPrice = internalPrice;
    }
    
    // Getter/Setter 생략 (Jackson은 프로퍼티 접근을 위해 필요함)
}

Gson: 코드 한 줄로 끝내는 간결함

Gson은 Gson 인스턴스 하나로 대부분의 작업을 처리하며, 클래스 수정이 어려운 외부 라이브러리 객체를 다룰 때 유리합니다.

Java
 
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;

public class SimplePayment {
    public static void main(String[] args) {
        // Pretty Printing 설정을 포함한 생성
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        PaymentInfo payment = new PaymentInfo("CARD_PAY", 50000);

        // 1. 직렬화: 아주 간결한 API
        String jsonText = gson.toJson(payment);
        System.out.println("Gson Serialization:\n" + jsonText);

        // 2. 역직렬화
        PaymentInfo recovered = gson.fromJson(jsonText, PaymentInfo.class);
    }
}

class PaymentInfo {
    @SerializedName("pay_type") // Jackson의 @JsonProperty와 동일 기능
    private String type;
    private int amount;

    public PaymentInfo(String type, int amount) {
        this.type = type;
        this.amount = amount;
    }
    // Gson은 Reflection을 사용하므로 기본 생성자나 Getter가 필수는 아닙니다.
}

3. 트러블슈팅 (Troubleshooting)

개발 중 가장 자주 마주치는 벽은 **"날짜 형식"**과 **"순환 참조"**입니다.

  • 날짜가 숫자로 나올 때: Jackson 사용 시 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) 설정을 추가하세요. 그렇지 않으면 날짜가 [2024, 5, 20] 같은 배열 형식으로 출력될 수 있습니다.
  • No suitable constructor 오류: Jackson으로 역직렬화할 때 클래스에 기본 생성자가 없는지 확인하세요. Jackson은 빈 바구니(기본 생성자)를 먼저 만들고 내용을 채우는 방식을 선호합니다.

4. 장단점 및 고려사항 (Trade-offs)

비교 항목 Jackson Gson
성능 압도적. 대용량 데이터 처리 시 훨씬 빠름 보통. 소규모 데이터에 적합
의존성 여러 모듈(Core, Databind 등)로 나뉨 단일 라이브러리로 매우 가벼움
유연성 어노테이션이 매우 다양하고 강력함 설정 없이도 웬만한 객체는 다 처리함
Spring 환경 기본 라이브러리로 채택되어 있음 별도 설정이 필요함

5. 결론 및 제언

결론적으로, 스프링 부트(Spring Boot) 기반의 대규모 프로젝트라면 Jackson을 사용하는 것이 표준입니다. 프레임워크와의 통합성이 높고 성능상 이점이 크기 때문입니다. 반면, 안드로이드 앱이나 가벼운 유틸리티성 프로젝트, 혹은 복잡한 설정 없이 빠르게 JSON을 다뤄야 한다면 Gson이 훌륭한 대안이 됩니다.

단순히 "남들이 쓰니까" 선택하기보다는, 현재 내 프로젝트의 트래픽 규모와 유지보수 편의성 중 어디에 무게를 둘 것인지 고민해 보시기 바랍니다.

반응형