-
(2024-01-09 TIL) 직렬화 역직렬화TIL 2024. 1. 9. 21:49
이번 주제는 지난 프로젝트에서 꽤 많이 애 먹었던 에러의 원인인 직렬화와 역직렬화입니다.
기억을 되짚어 보면 직렬화와 역직렬화가 반복하는 에러였습니다.
이렇게 에러가 일어난 부분은 확실하고 명확하게 배우고 넘어가야 다음에 이런일이 있을때 시간낭비 하지 않을 수 있다고 생각합니다.
1. 직렬화와 역직렬화
직렬화는 객체를 바이트 스트림으로 변환하는 과정이고, 역직렬화는 바이트 스트림에서 객체로 변환하는 과정입니다.
2. 데이터 직렬화 포멧
주요한 데이터 직렬화 포멧에 대해 알려드리겠습니다.
JSON(JavaScript Object Notation)
- 특징:
- 가독성이 높고, 사람이 읽기 쉽습니다.
- 경량이며, 다양한 프로그래밍 언어에서 파싱이 용이합니다.
- 키-값 쌍으로 이루어진 데이터 구조를 사용합니다.
- 웹에서 주로 사용되며, RESTful API 등에서 데이터 교환에 많이 활용됩니다.
XML (eXtensible Markup Language):
- 특징:
- 계층 구조를 가진 마크업 언어로, 태그로 데이터를 표현합니다.
- 가독성이 좋으며, 특정 스키마에 따라 데이터를 정의할 수 있습니다.
- 웹 서비스, 설정 파일 등에서 널리 사용됩니다.
Protocol Buffers (protobuf):
- 특징:
- Google에서 개발한 이진 형식의 직렬화 형식입니다.
- JSON, XML보다 더 작은 크기로 효율적이며, 직렬화 및 역직렬화 속도가 빠릅니다.
- 스키마 정의를 통해 데이터 구조를 명시적으로 정의합니다.
MessagePack:
- 특징:
- 이진 직렬화 형식으로, JSON에 비해 더 적은 바이트를 사용합니다.
- 빠른 직렬화 및 역직렬화 속도를 제공합니다.
- 다양한 데이터 유형을 지원하며, 다양한 프로그래밍 언어 간에 상호 운용이 가능합니다.
YAML (YAML Ain't Markup Language):
- 특징:
- 사람이 읽기 쉽고 작성하기 편한 형식입니다.
- JSON과 유사하게 키-값 쌍을 사용하지만, 들여쓰기를 통해 계층 구조를 표현합니다.
- 설정 파일 등에서 사용됩니다.
3. 직렬화와 역직렬화가 필요한 이유?
객체 그자체는 disk나 네트워크 장비가 이해할 수 없기 때문에, 객체를 disk나 네트워크 장비가 해석할 수 있는 binary 형태로 바꿔어야만 가능합니다.
4. Spring에서 직렬화와 역직렬화
- 기본 직렬화 (Java Serialization): Spring에서는 객체가 Serializable 인터페이스를 구현하면 자동으로 기본 직렬화를 사용합니다. 그러나 이 방법은 여러 문제점을 가지고 있기 때문에, 특히 보안과 성능 측면에서 권장되지 않습니다.
- JSON 직렬화와 역직렬화 (Jackson, Gson 등): 주로 Spring에서는 JSON 형식을 사용하여 데이터를 주고받습니다. Jackson이나 Gson과 같은 라이브러리를 사용하면 객체를 JSON으로 직렬화하고, JSON을 객체로 역직렬화하는 것이 편리합니다.
5. 직렬화와 역직렬화와 관련된 어노테이션:
- @JsonSerialize 및 @JsonDeserialize: Jackson에서 제공하는 어노테이션으로, 각각 직렬화와 역직렬화에 사용되는 커스텀 시리얼라이저와 디시리얼라이저를 지정할 수 있습니다.
- @JsonProperty: Jackson에서 필드의 이름을 직렬화 및 역직렬화할 때 사용되는 이름으로 지정할 수 있는 어노테이션입니다.
- @JsonFormat: 날짜와 같은 특수한 형식의 필드를 직렬화 및 역직렬화할 때 사용되는 어노테이션입니다.
'TIL' 카테고리의 다른 글
- 특징: