자바스크립트에서 맞춤형 직렬화 라이브러리 구현
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- JavaScript 개발자
- 복잡한 데이터 구조를 직렬화/역직렬화해야 하는 개발자
- JSON의 한계를 극복하고자 하는 고급 프로그래머
- 난이도 관점: 중급~고급 (직렬화 원리, 재귀 구조, 성능 최적화 이해 필요)
핵심 요약
- JSON 한계 극복:
JSON.stringify
는 순환 참조와 비직렬화 가능한 값(함수,undefined
, 심볼)을 처리하지 못함. - 직렬화/역직렬화 구현:
CustomSerializer
클래스를 통해 객체/배열/특수 타입(날짜, 정규표현식)을 처리함. - 성능 고려사항:
- 메모리 최적화: WeakMap
사용으로 순환 참조 추적.
- 문자열 생성: join()
대신 배열을 사용해 성능 개선.
- 대규모 데이터: Base64 인코딩 또는 ArrayBuffer
직접 처리.
섹션별 세부 요약
1. 직렬화의 주요 도전 과제
- 순환 참조:
JSON.stringify
는TypeError
발생. - 비직렬화 가능한 값: 함수,
undefined
, 심볼은 직렬화 불가. - 날짜 처리: 날짜는 문자열로 직렬화되어 역직렬화 시 복잡함.
2. 기본 직렬화 라이브러리 구현
CustomSerializer
클래스:
```javascript
class CustomSerializer {
_serialize(value) {
if (value === null || value === undefined) return 'null';
if (typeof value === 'object') {
if (Array.isArray(value)) return '[' + value.map(item => this._serialize(item)).join(',') + ']';
return '{' + Object.entries(value).map(([key, val]) => "${key}":${this._serialize(val)}
).join(',') + '}';
}
return JSON.stringify(value);
}
}
```
- 역직렬화:
eval
사용 시 보안 취약점 발생. 대안으로JSON.parse()
사용 권장.
3. 순환 참조 해결
Map
활용:
```javascript
_serialize(value, map = new Map()) {
if (map.has(value)) return CircularReference(${map.get(value)})
;
const key = map.size + 1;
map.set(value, key);
return JSON.stringify(value);
}
```
- 중복 참조 추적: 각 객체에 고유 식별자 할당.
4. 특수 타입 처리
- 날짜/정규표현식:
```javascript
if (value instanceof Date) return Date(${value.getTime()})
;
if (value instanceof RegExp) return RegExp(${value.toString()})
;
```
5. 성능 및 안정성 고려사항
- 대규모 데이터: Base64 인코딩 또는
ArrayBuffer
직접 처리. - 메모리 최적화:
WeakMap
사용으로 순환 참조 추적. - 보안:
eval
사용 금지,JSON.parse()
와 엄격한 검증 사용.
6. 실무 적용 예시
- 게임 엔진: 게임 상태(플레이어 위치, 통계) 직렬화.
- 리액트 앱: 상태 관리 라이브러리와 직렬화 연동.
- 실시간 데이터 앱: 채팅 앱의 메시지 인코딩 최적화.
결론
- 보안 강화:
eval
대신JSON.parse()
사용. - 테스트 강화: 단위 테스트로 에지 케이스 커버.
- 성능 최적화:
WeakMap
,join()
활용. - 라이브러리 선택:
BSON
,msgpack
과 같은 타사 라이브러리 활용 시 의존성 관리 주의.