자바 직렬화와 직렬화 포맷 비교 정리
✅ 직렬화란?
직렬화란 객체를 바이트 형태로 변환하는 과정을 의미한다.
네트워크 전송, 파일 저장, 캐시 등에서 사용되며, 반대로 바이트 데이터를 객체로 되돌리는 것은 역직렬화라고 한다.
✅ 자바 기본 직렬화 (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 | 작음 | 빠름 |
바이너리 포맷은 사람이 읽을 수 없지만,
정의된 스키마를 기반으로 효율적인 파싱이 가능하고, 성능이 매우 뛰어나다.
✅ 두 설명은 관점이 다를 뿐, 모두 맞다
- Serializable 관련 설명은:
- 자바 내부의 직렬화 방식이 위험하고 무겁다는 이야기
- 클래스 변경 시 예외 발생 가능성, 메타데이터 과다 저장 등
- JSON vs 바이너리 포맷 성능 비교는:
- JSON도 직렬화 포맷이지만, Protobuf/Avro와 비교하면 상대적으로 느리다는 이야기
즉, 둘 다 맞는 이야기지만, 하나는 자바 기본 직렬화의 단점에 대한 것이고
다른 하나는 직렬화 포맷 간 성능 비교에 대한 설명이다.
💬 정리 요약
- 자바 기본 직렬화(Serializable)는 실무에서 잘 사용되지 않으며, JSON이나 다른 명시적 직렬화 포맷이 대체로 권장된다.
- JSON은 직렬화 포맷이 맞지만, Protobuf나 Avro 같은 바이너리 포맷에 비해 느리고 용량이 크다.
- 시스템 간 통신, 메시지 큐, 분산 캐시 등에서는 성능을 위해 바이너리 포맷 사용이 많아지고 있다.
'개발 > Java' 카테고리의 다른 글
불변 객체(immutable object)의 개념과 사용 (0) | 2025.05.24 |
---|---|
Java의 스레드와 콜스택 (0) | 2025.05.23 |
원시타입(Primitive type)과 참조타입(Reference type) (0) | 2025.05.22 |
Java GC(Garbage Collector) (1) | 2024.12.04 |
TaskScheduler를 이용한 주문 취소 구현해보기 (0) | 2024.11.27 |