영주의 개발노트
당신은 Serialize와 Deserialize의 기본 원리에 대해 아는가? 본문
최근 이미지 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의 원칙에서 벗어난다.
- Deserialize는 원본 데이터를 복원하는 과정인데, 데이터를 변경하고 있다.
- Deserialize의 목적은 데이터를 원래의 상태로 되돌리는 것이지만, URL을 변경하면서 원본과 다르게 복원된다. 즉, deseiralize 후 데이터가 원본과 달라지는 상황이 발생한다.
- Serialize된 데이터가 예상과 다르게 동작할 수 있다.
- 만약 같은 serialize된 데이터를 다른 시스템에서 deserialize하면 URL이 변경되지 않고 원본 그대로 사용될 가능성이 있다. 이렇게 되면 데이터의 일관성을 깨뜨릴 수 있게 된다.
- 불변성 원칙을 위반하게 된다.
- Serialize된 데이터는 불변해야 하지만, deserialize 단계에서 변경이 이루어진다. Deserialize를 수행하는 위치마다 다른 결과가 나올 수 있기 때문에 유지보수에 문제가 생길 수도 있다.
Serialize & Deserialize 원칙을 지켜가며 변환하는 방법 💡
Serialize와 Deserialize 과정 내부에서 데이터를 변환하는 것이 문제였다. 그러므로, 데이터 변환과 serialize / deserialize 과정을 분리하면 위 문제는 해결된다.
- 직렬화 전: 데이터 변환 후 직렬화 진행
- 직렬화 후: 데이터 그대로 유지 & 필요할 때만 별도의 로직에서 변환
이와 같이 개발한다면 직렬화된 데이터는 변경없이 보존되고, 역직렬화 후 원본 데이터를 그대로 복원할 수 있다. 또한, 필요할 때만 URL을 변환하여 데이터 일관성을 유지할 수도 있게 되는 것이다.
즉, Serialize와 Deserialize는 데이터 보존 원칙을 따라야 한다. 항상 원본 데이터가 변경되면 안 된다는 점을 인지하고 있어야겠다는 생각을 하게 되었다. 혹시 나처럼 기본 원리를 몰랐던 사람에게 도움이 되었으면 한다.
'STUDY 📖' 카테고리의 다른 글
Elasticsearch 데이터 타입에 대해 알아보자 (0) | 2025.02.15 |
---|---|
gRPC와 Protocol Buffers에 대해 알아보자 (2) - Protocol Buffers (1) | 2025.01.14 |
gRPC와 Protocol Buffers에 대해 알아보자 (1) (2) | 2024.12.04 |
🏦 기술 부채 상환 | git merge 와 rebase에 대해 알아보자 (2) (1) | 2024.11.20 |
🏦 기술 부채 상환 | git merge 와 rebase에 대해 알아보자 (0) | 2024.11.06 |