본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/CS(ComputerScience)

[CS] 직렬화(Serializable) 이해하기

by 미노드 2024. 10. 2.

직렬화(serialize)란?

컴퓨터 과학의 데이터 스토리지 문맥에서 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다.
오브젝트를 직렬화하는 과정은 오브젝트를 마샬링한다고도 한다

조금 더 쉽게 풀어보면, Object 또는 Data를 바이트 스트림(stream of bytes) 형태로 연속전인(serial) 데이터로 변환하는 것을 직렬화(serialize) 라고 한다.
그 반대 개념인 역직렬화는(Deserialize)는 바이트로 변환된 데이터를 원래대로 Object 또는 Data로 변환하는 기술이다.

[ 바이트 스트림 이란? ]
스트림은 클라이언트나 서버 간에 출발지 목적지로 입출력하기 위한 데이터가 흐르는 통로를 말한다.
자바는 스트림의 기본 단위를 바이트로 두고 있기 때문에, 네트워크, 데이터베이스로 전송하기 위해 최소 단위인 바이트 스트림으로 변환하여 처리한다.

이펙티브 자바 에서도 다뤘던 내용인데 직렬화 는 되도록이면 피하는게 좋다고 했었다.
다만 직렬화를 사용해야 하는 경우가 있는데, 어떤 경우일까?
다른 컴퓨터의 시스템에서도 사용 할수 있도록 전송하기 위해 데이터 화 시켜야 할 경우(json으로 변환, xml로 변환, 기타 포멧의 파일로 변환) 직렬화를 사용한다.

--------------------------

출처 : infa dev

직렬화가 사용되는 경우

직렬화가 언제 필요하여 사용되는 것일까?

- 세션 클러스터링 처럼, 세션이 공유되어야 할 경우 (세션 데이터를 저장, 공유하려면 이를 데이터 화 해야 한다.)
- 캐시 DB (redis) 같이 데이터 화 시켜 저장해야 할 경우
- DB에 저장시켜야 할 경우
- 특정 format 파일로 변환하여 저장 할 경우 (json, csv, xml 등)

자바에서 직렬화 사용하면 장점

위의 작업들을 수행하려면 직렬화가 필요하다.
그렇다면 직렬화를 사용함으로 써 느낄 수 있는 장점은 어떤 것들이 있을까?

1.레퍼런스 타입에 대해 제약 없이 외부에 내보낼 수 있다.

이는 자바로 개발하는 프로그램이 다른 언어로 만들어진 어플리케이션과 호환이 가능하도록 해준다.
수신/송신 측면에서 모두 가능하다.

2. 자바 시스템에서 개발에 최적화 되어있다.

자바는 객체 지향 개발을 지향하며 개발하는데 최적화 되어있다.
프리미티브 타입(byte short int long float double char boolean)은 왠만한 프로그래밍 언어가 공통적으로 사용하는 타입이기 때문에, 이러한 값들을 JSON 으로도 충분히 상호 이용이 가능하다.

 

하지만 자바의 온갖 컬렉션이나 참조 타입(String), 클래스, 인터페이스 타입들은 어떨까?
사용자가 커스텀하게 값 타입을 만들어 사용하는 경우, 단순 파일 포맷만으로는 타입 갯수가 한계가 있다.
그래서 이들을 외부에 내보내기 위해선 각 데이터를 매칭시키는 별도의 파싱(parsing)이 필요하다.

여기서 직렬화를 이용하면, 비록 파이썬이나 자바스크립트와 같은 다른 시스템에서는 사용하지 못할 수도 있으나,
직렬화 기본 조건만 지킨다면 그냥 바로 외부에 보낼수가 있다.
그리고 역직렬화를 통해 읽어들이면 별도 파싱 작업 없이 데이터 타입이 자동으로 맞춰지도록 할 수 있다.
즉, 직렬화, 역직렬화를 통해 파일을 만들어 외부로 보내고, 다시 읽어들이는 과정에서 별도 파싱 작업 없이
자바 클래스로 만들어 기능들을 곧바로 다시 이용할 수 있는다.

그러나 결론만 이야기 한다면, 요즘은 범용적인 JSON을 이용하는 추세가 점점 늘고 있다.
자바 객체를 JSON으로 변경해서 파일로 써버리면 되고, 읽을 때 에도 이에 맞춰 받도록 하면 되는데 굳이 직렬화를 할 필요가 없을 수 있다.
따라서 JSON 이냐 직렬화 이냐 에 대한 명확한 정답은 없고 '목적에 따라 적절히 써야 한다' 정도로 정리한다.
이펙티브 자바 책에서도 직렬화의 대안을 찾으라고 나오기도 하니...
그리고 업무를 수행하면서 implements Serializable 를 보게 되었는데, 이거때문에 이 글을 쓰게 되었다.

참고 블로그

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A7%81%EB%A0%AC%ED%99%94Serializable-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0