영주의 개발노트

당신은 Serialize와 Deserialize의 기본 원리에 대해 아는가? 본문

STUDY 📖

당신은 Serialize와 Deserialize의 기본 원리에 대해 아는가?

0JUUU 2025. 2. 26. 01:03

최근 이미지 url을 일괄 변환하는 작업을 진행했었다. 이 과정에서 Serialize(직렬화)와 Deserialize(역직렬화)를 이용하여 URL을 변경하였다. 만약 당신이 직렬화와 역직렬화에 대해 잘 알고 있다면 해당 작업이 '뭔가 이상한데? 🤔'라고 생각할지도 모른다. 역시나 팀 내 코드 리뷰에서 "해당 방법은 직렬화/역직렬화의 원칙에서 벗어난다"는 피드백을 받았다. 

여기서 당신은 나

리뷰를 받은 후 Serialize와 Deserialize의 원리를 다시 고민하게 되었고, 왜 내가 개발한 방법이 원칙에서 벗어난다고 했던것인지 정리해보고자 한다. 

 

Serialize와 Deserialize의 기본 원리

serialize와 deserialize가 어떤 것인지에 대해 아주 간략하게만 짚고 넘어가겠다. 

개념 설명
Serialize 데이터를 특정 포맷(JSON, XML, ...) 으로 변환하여 저장하거나 전송하는 과정
Deserialize 직렬화된 데이터를 다시 원래의 객체로 복원하는 과정

 

여기서 serialize와 deserialize에서 중요한 키워드는 불변성(Immutability)이다. 

직렬화된 데이터는 항상 동일한 형태로 유지되어야 한다. 직렬화는 데이터를 변형하지 않고 보존하는 것이 목적이며, 역직렬화 후에도 동일한 데이터가 복원되어야 한다. 만약 역직렬화 시 데이터가 변경된다면, 동일한 직렬화된 데이터를 사용해도 서로 다른 결과를 얻게 되어 데이터 일관성이 깨질 수 있다. 

 

serialize와 deserialize의 목적은 다음과 같다.

  • serialize의 목적
    • 데이터 저장: 데이터를 파일, 데이터페이스, 캐시 등에 저장할 수 있도록 변환
    • 네트워크 전송: JSON, Protocol Buffers 등을 이용하여 데이터를 효율적으로 전송
    • 데이터 유지보수: 원본 객체 그대로 직렬화하여 필요한 시점에 동일한 데이터로 복원
  • deserialize의 목적
    • 데이터 복원: 직렬화된 데이터를 원래의 객체와 동일하게 재구성
    • 예측 가능한 데이터 구조 유지: 원본과 같은 형태로 복원되어야 일관성 보장 가능함
    • 보안 및 무결성 유지: 예기치 않은 데이터 변경 없이 원본을 그대로 복원해야 함

내가 개발한 방식의 문제점 ⚠️

내가 사용한 방식은 이렇다. Serialize 과정에서는 이미지 URL 변경 없이 원본 데이터를 직렬화하여 저장하였다. 문제는 Deserialize이다. 데이터를 복원하면서 이미지 URL을 새로운 값으로 변경하였다.

 

이는 Serialize와 Deserialize의 원칙에서 벗어난다. 

  1. Deserialize는 원본 데이터를 복원하는 과정인데, 데이터를 변경하고 있다.
    • Deserialize의 목적은 데이터를 원래의 상태로 되돌리는 것이지만, URL을 변경하면서 원본과 다르게 복원된다. 즉, deseiralize 후 데이터가 원본과 달라지는 상황이 발생한다.
  2. Serialize된 데이터가 예상과 다르게 동작할 수 있다.
    • 만약 같은 serialize된 데이터를 다른 시스템에서 deserialize하면 URL이 변경되지 않고 원본 그대로 사용될 가능성이 있다. 이렇게 되면 데이터의 일관성을 깨뜨릴 수 있게 된다.
  3. 불변성 원칙을 위반하게 된다.
    • Serialize된 데이터는 불변해야 하지만, deserialize 단계에서 변경이 이루어진다. Deserialize를 수행하는 위치마다 다른 결과가 나올 수 있기 때문에 유지보수에 문제가 생길 수도 있다. 

Serialize & Deserialize 원칙을 지켜가며 변환하는 방법 💡

Serialize와 Deserialize 과정 내부에서 데이터를 변환하는 것이 문제였다. 그러므로, 데이터 변환과 serialize / deserialize 과정을 분리하면 위 문제는 해결된다. 

  • 직렬화 전: 데이터 변환 후 직렬화 진행
  • 직렬화 후: 데이터 그대로 유지 & 필요할 때만 별도의 로직에서 변환

이와 같이 개발한다면 직렬화된 데이터는 변경없이 보존되고, 역직렬화 후 원본 데이터를 그대로 복원할 수 있다. 또한, 필요할 때만 URL을 변환하여 데이터 일관성을 유지할 수도 있게 되는 것이다.

 

즉, Serialize와 Deserialize는 데이터 보존 원칙을 따라야 한다. 항상 원본 데이터가 변경되면 안 된다는 점을 인지하고 있어야겠다는 생각을 하게 되었다. 혹시 나처럼 기본 원리를 몰랐던 사람에게 도움이 되었으면 한다.