직렬화(Serialization)와 역직렬화(Deserialization)

@Hudi · April 21, 2022 · 1 min read

학습 동기

우아한테크코스 레벨2로 넘어오면서, 본격적으로 스프링을 사용하기 시작했다. 레벨1 마지막 미션에서 Spark 기반으로 간단히 웹 어플리케이션을 작성했을 때는 JSON으로 통신하기 위해 GSON이라는 라이브러리를 사용하여, 요청으로 받은 JSON을 객체로 변환하고, 요청에 대한 응답으로 객체를 JSON으로 변환하는 과정을 직접 해주었다.

레벨2에서 학습 테스트를 통해 스프링을 찍먹해보며, @RequestBody@ResponseBody 등의 어노테이션을 사용하면 자동으로 객체를 JSON으로 직렬화하고, JSON을 객체로 역직렬화 해주는 과정이 신기했다.

이에 관하여 간단히 찾아보니 내부적으로 JSON 직렬화, 역직렬화를 위해 Jackson 이라는 라이브러리를 사용한다고 한다. 일단 스프링과 Jackson 라이브러리를 공부하기 전에 직렬화와 역직렬화에 대한 개념 먼저 확실히 짚고 넘어가고자 학습하게 되었다.

직렬화(Serialization)와 역직렬화(Deserialization)

출처 : https://www.geeksforgeeks.org/serialization-in-java/
출처 : https://www.geeksforgeeks.org/serialization-in-java/

Serial 은 '연속된' 이라는 뜻을 가지고 있다. 즉, Serialization은 객체를 '연속된' Byte 나 String 으로 변환하는 과정을 의미한다. Object는 메모리에 올라와 있지만 Byte 나 String 은 파일로 저장될 수 있거나 통신에 사용 될 수 있다.

즉, 직렬화는 객체를 파일의 형태 등으로 저장하거나, 통신하기 쉬운 포맷으로 변환하는 과정을 의미한다. 특정 포맷으로 직렬화된 데이터는 역직렬화라는 과정을 통해 다시 객체로 변환될 수 있다.

일반적으로 자바에서 직렬화라고 이야기하는 것은 객체를 Byte로 변환하는 과정을 의미한다. 하지만 Byte 외에도 표 형태로 직렬화 할때에는 CSV, 구조적인 데이터로 직렬화 할때는 JSON, XML 등 다양한 포맷으로 직렬화 할 수 있다. 특히 구조적인 데이터를 사용할 때에는 예전에는 XML 포맷을 사용했지만 최근에는 대부분 JSON 포맷을 사용한다.

자바 직렬화?

자바는 자바 시스템끼리의 객체 교환을 위해 Serializable 인터페이스를 구현하는 객체를 바이트 스트림으로 직렬화/역직렬화 하는 기능을 제공한다. 하지만 이펙티브 자바에서는 자바에서 제공하는 직렬화 기능을 사용하지 않을 것을 강력히 권장한다(아이템 85. 자바 직렬화의 대안을 찾으라). 자바에서 제공하는 직렬화는 여러가지 문제(특히 치명적인 보안 이슈)를 안고있다고 하며, 그 대안으로는 책에서는 JSON등의 포맷을 추천한다.

물론 이를 해결하기 위한 여러가지 기법도 책에 소개되어 있다. 다만, 개인적으로는 JSON이라는 훌륭한 대안이 있는 상황에서 굳이 자바 직렬화를 사용하며 불편과 위험을 감수하고 싶지는 않다는 것이 개인적인 생각이다. 따라서 자바 직렬화는 학습이 정말 필요하다고 생각될 때 따로 공부해볼 예정이다.

참고

@Hudi
꾸준히, 의미있는 학습을 기록하기 위한 공간입니다.