> For the complete documentation index, see [llms.txt](https://leehyokyun.gitbook.io/openbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://leehyokyun.gitbook.io/openbook/1-6..md).

# 1-6. 직렬화

단순 통신이 아닌 이기종 간 의사소통의 방식, 직렬화와 역직렬화에 대하여

### 직렬화는 단순히 메모리 안의 객체 구조를 변환하는 과정이 아닌, 이기종 시스템과 통신하고 그에 맞게 변환, 나아가호환성까지 의미하는 하나의 체계이다.

### 1. Serializable 인터페이스의 역할과 분산 환경에서의 필요성

* JPA 엔티티에서 Serializable 인터페이스를 구현한 것과 구현하지 않은 것은 일반적인 상황에서 차이가 거의 없다.
* 생성, 조회, 수정, 삭제와 같은 기본적인 CRUD 트랜잭션 역시 정상적으로 동작한다.
* 분산 환경에서의 예외 발생: 애플리케이션 환경이 WAS 클러스터와 같은 분산 환경으로 바뀌거나, 특히 엔티티를 메시지 큐 기반의 외부 체계(RabbitMQ, Redis, Kafka 등)에 페이로드로 담아 전송해야 할 경우 구현하지 않았다면 예외가 발생한다.
* 프록시 객체 기반의 제어: 환경이 변경되었을 때 특히 프록시 객체 기반의 직렬화 및 역직렬화가 필요하다면, Serializable을 구현한 엔티티에 대해서만 안전하게 연산 처리가 가능하다.
* 직렬화 활용의 핵심 경계: JPA의 핵심은 직렬화가 아니다. 데이터베이스와 JVM 메모리 사이에서의 영속성 컨텍스트 관리가 본질적 핵심이다.
  * 1차 캐시: 영속성 컨텍스트 내부에서 관리되므로 직렬화가 수행되지 않는다.
  * 2차 캐시: JVM 간의 공유, 디스크 저장, 혹은 외부 캐시 체계와 연동되므로 직렬화 명세가 필수적으로 요구된다.
* 결론적으로 외부 체계로의 데이터 직렬화가 필요할 때, 혹은 HTTP 세션에 세션 복제 및 엔티티 저장이 필요할 때 이 인터페이스의 구현이 필연적으로 수반된다.

### 2. 직렬화(Serialization)와 역직렬화(Deserialization)의 정의 및 연산 기준

* 직렬화와 역직렬화 연산의 절대적인 판정 기준은 JVM 메모리다.
* 직렬화: JVM 메모리 공간 안에 존재하는 객체 구조를 외부로 전달 가능한 형태로 변환하는 메커니즘을 의미한다.
  * 객체(Object)를 파일(CSV, JSON) 및 보통은 바이너리 코드인 바이트 배열(byte\[])로 변환하는 연산이다.
  * 네트워크 통신(Kafka, HTTP) 및 외부 체계(Redis, 데이터베이스)와의 통신 과정에 쓰이는 변환 제어가 모두 이에 포함된다.
* 역직렬화: 외부 시스템의 데이터를 JVM 메모리 안에서 실행 가능한 객체 형태로 변환하는 메커니즘을 의미한다.
* 방향성 매커니즘:
  * JVM 메모리에서 외부 데이터 방향으로 나아가면 직렬화다.
  * 외부 데이터에서 JVM 메모리 방향으로 들어오면 역직렬화다.

### 3. 객체 변환 API 및 직렬화 과정에서의 유의사항

* 직렬화 및 역직렬화 연산 시 자바 내부적으로는 ObjectOutputStream, ObjectInputStream 등의 표준 API 스트림 클래스를 활용하여 데이터를 물리적으로 변환하고 전달한다.
* 변환 과정의 본질적 유의사항: Object에서 String으로 변환되거나, String에서 최종적인 byte\[] 바이트 배열로 변환되는 각각의 개별적인 변환 과정들 역시 모두 직렬화와 역직렬화 체계의 파편이자 일부라는 사실을 명확히 인지하고 설계해야 한다.

### 4. 직렬화 방안 - JSON & Protobuf

* 이기종 시스템 간 직렬화 시 가장 많이 사용하는 형태이지만, 메모리 사용률 및 파싱 속도 관점에서 큰 차이가 발생하는 직렬화 방안이다.
* JSON은 사람이 읽기 쉬운 문자열 형태의 데이터로, 필드명과 데이터가 특수문자("")를 포함한 문자열 형태로 저장하는 방식이다.
* ```
  {
  "id" : 1
  "name" : Lee
  "age" : 30
  }
  ```
  * 물론 xml보다는 가볍고 단순하며 읽기 쉬울 수 있지만, 숫자 형태를 불필요하게 문자열 형태로 변환해야 하며, 데이터와 필드명의 한 쌍으로 표기가 되어야 하므로 약간의 비효율적인 면이 존재한다.
  * 그럼에도 불구하고, 가장 범용적이고 가장 간편하며 가독성이 강력하기도 한 표기 방안이다.
* Protobuf의 경우 문자열 형태가 아닌 바이너리 포맷으로 변환하며, 스키마를 지정하여 별도의 필드명을 표기하지 않고 바로 인덱스 번호 및 데이터만을 전달한다.
* ```
  1 : 1
  2 : Lee
  3 : 30
  ```

  * JSON에 비해 매우 가볍고효율적이며, 사람이 추구하는 가독성이 아닌 컴퓨터가 읽기 쉬운 형태로 전달하는 것을 목표로 직렬화를 하기에 메모리 사용량 및 파싱 속도가 JSON에 비해 월등히 높다(30\~70% 정도 경감 가능).
  * 필드명이 아닌 번호를, 문자열로 변환한 형태가 아닌 바이너로 포맷 그대로(숫자의 경우 숫자를 직접) 전송하므로 불필요한 메모리 사용이 없고 데이터 전송 용량을 그만큼 크게 줄일 수 있다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://leehyokyun.gitbook.io/openbook/1-6..md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
