본문 바로가기

개발/Java

직렬화

 

자바 직렬화와 직렬화 포맷 비교 정리


✅ 직렬화란?

직렬화란 객체를 바이트 형태로 변환하는 과정을 의미한다.
네트워크 전송, 파일 저장, 캐시 등에서 사용되며, 반대로 바이트 데이터를 객체로 되돌리는 것은 역직렬화라고 한다.


✅ 자바 기본 직렬화 (Serializable)의 특징과 문제점

자바의 기본 직렬화 방식은 implements Serializable을 붙이면 바로 사용할 수 있다.
ObjectOutputStream, ObjectInputStream 등을 통해 객체를 바이트 스트림으로 바꾸고 다시 복원한다.

하지만 이 방식에는 다음과 같은 문제점이 있다:

  • 클래스 이름, 필드 타입, 메타정보 등도 같이 저장되므로 파일 크기가 커진다
  • 클래스 구조가 바뀌면 역직렬화 실패가 발생할 수 있다
  • serialVersionUID를 수동으로 관리해야 버전 충돌을 방지할 수 있다
  • 외부 라이브러리처럼 내가 수정 불가능한 클래스는 직렬화에 취약하다
  • 자주 바뀌는 도메인 객체는 직렬화 대상에서 제외하는 것이 좋다

실제로 자바의 기본 직렬화는 보안 이슈와 성능 문제로 인해 실무에서는 거의 사용되지 않는다


✅ JSON도 직렬화 포맷이다

많은 사람들이 헷갈리지만, JSON도 직렬화 포맷이다.
객체를 문자열 형태로 변환해 전송하거나 저장할 수 있으며, 다양한 언어 간 통신에 적합하다.

예를 들어 다음과 같은 형태다:

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

장점

  • 사람이 읽기 쉽고 디버깅에 유리하다
  • Java, Python, JavaScript 등 다양한 언어에서 동일하게 사용할 수 있다

단점

  • key 이름 반복으로 인해 데이터 크기가 커짐
  • 문자열 기반 파싱이라 성능이 느림
  • 타입 정보가 없어 해석 시 타입 추론 필요

✅ "JSON보다 2~10배 더 효율적인 직렬화 포맷"의 의미

이 표현은 JSON과 같은 문자열 기반 직렬화 포맷보다
Protobuf, Avro, MessagePack 등 바이너리 직렬화 포맷이 더 작고 빠르다는 의미다.

포맷 데이터 크기 처리 속도

JSON 느림
Protobuf 작음 빠름
Avro 작음 빠름

바이너리 포맷은 사람이 읽을 수 없지만,
정의된 스키마를 기반으로 효율적인 파싱이 가능하고, 성능이 매우 뛰어나다.


✅ 두 설명은 관점이 다를 뿐, 모두 맞다

  1. Serializable 관련 설명은:
    • 자바 내부의 직렬화 방식이 위험하고 무겁다는 이야기
    • 클래스 변경 시 예외 발생 가능성, 메타데이터 과다 저장 등
  2. JSON vs 바이너리 포맷 성능 비교는:
    • JSON도 직렬화 포맷이지만, Protobuf/Avro와 비교하면 상대적으로 느리다는 이야기

즉, 둘 다 맞는 이야기지만, 하나는 자바 기본 직렬화의 단점에 대한 것이고
다른 하나는 직렬화 포맷 간 성능 비교에 대한 설명이다.


💬 정리 요약

  • 자바 기본 직렬화(Serializable)는 실무에서 잘 사용되지 않으며, JSON이나 다른 명시적 직렬화 포맷이 대체로 권장된다.
  • JSON은 직렬화 포맷이 맞지만, Protobuf나 Avro 같은 바이너리 포맷에 비해 느리고 용량이 크다.
  • 시스템 간 통신, 메시지 큐, 분산 캐시 등에서는 성능을 위해 바이너리 포맷 사용이 많아지고 있다.