---
description: 직렬화와 역직렬화
---

# Serialization and Deserialization

## 직렬화: 데이터의 전송 및 저장

직렬화는 객체 상태를 저장하거나 전송하기 위해 객체를 이진 데이터나 문자열 형태로 변환하는 과정입니다. 직렬화된 객체는 파일 시스템, 데이터베이스, 네트워크 등을 통해 전송되거나 저장될 수 있습니다.

Java에서는 Serializable 인터페이스를 통해 가능하며, 객체의 모든 필드와 그에 대한 메타데이터가 직렬화됩니다.



## 역직렬화: 직렬화된 데이터를 다시 사용

역직렬화는 직렬화된 데이터를 다시 원래의 객체로 변환하는 과정입니다. 이 과정에서 직렬화된 데이터가 다시 원본 객체 상태로 복원됩니다.



## 필요성

### 데이터 영속화: 데이터베이스에 저장할 수 있도록 합니다.&#x20;

객체를 데이터베이스에 저장할때도 직렬화를 사용할 수 있습니다. 일반적으로 데이터베이스에 객체를 저장할 떄는 객체의 필드를 데이터베이스의 각 열에 매핑하여 저장합니다(ORM). 하지만 복잡한 객체나 상태 정보를 그대로 저장해야 할 떄는 객체를 직렬화하여 BLOB(Biinary Large Object)나 TEXT 필드에 저장할 수 있습니다.

예): 세션관리: 사용자의 세션 데이터를 파일이나 데이터베이스에 직렬화하여 저장하고, 사용자가 재접속 할떄 이를 역직렬화하여 세션을 복원할 수 있습니다. (조건이 포함된 쿼리가 필요없기떄문에)

### 분산 시스템: 직렬화하여 객체를 전송합니다.

분산 시스템이나 클라이언트-서버 아키텍처에서 ㅅ허로 다른 시스템 간의 데이터 전송이 필요할때 유용하게 사용됩니다.

서로 다른 플랫폼이나 언어를 사용하는 경우, 데이터를 JSON, XML, 또는 이진 형식으로 직렬화하여 전송합니다. 수신 측에서는 이 직렬화된 데이터를 역직렬화하여 다시 객체로 변환합니다. (스프링에서 Jackson)



## 장점

* 데이터 전송의 유용성: 직렬화는 네트워크 간의 객체 전송을 가능하게하여 분산 시스템에서 데이터 교환이 용이합니다.
* 데이터 일관성 유지: 객체의 상태를 저장할 수 있습니다.
* 상호 운용성: 서로 다른 시스템 간에 데이터를 쉽게 전송할 수 있도록 JSON이나 XML과 같은 형식으로 직렬화할 수 있습니다.

## 단점

* 데이터 검색의 어려움: SQL 쿼리로 검색하거나 수정하기 어려우며, 역직렬화가 필요합니다.
* 성능 문제: 대규모 데이터를 직렬화 및 역직렬화할 때 성능 저하가 발생할 수 있습니다.
* 버전 불일치: 직렬화된 객체와 클래스 간의 버전이 일치하지 않으면 역직렬화 시 오류가 발생할 수 있습니다.









