딥 클론(Deep Clone), 즉 깊은 복사는 복사 대상 객체 내부에 존재하는 모든 중첩 객체까지 하나하나 새롭게 복제하는 작업을 의미합니다. 이렇게 만들어진 복사본과 원본 객체는 아무것도 공유하지 않기 때문에, 원본이 변경되어도 복사본에는 전혀 영향을 주지 않습니다.
가장 간단하고 널리 사용되는 방법은 객체를 JSON.stringify()로 문자열로 변환한 뒤, 다시 JSON.parse()로 JavaScript 객체로 되돌리는 것입니다. 다만 이 방식은 메서드(함수)는 복사할 수 없다는 한계가 있습니다.
예제
let obj = {
foo: 1,
bar: { baz: 'test' }
}
let newObj = JSON.parse(JSON.stringify(obj));
obj.bar.baz = 20;
console.log(obj);
console.log(newObj);출력 결과
{ foo: 1, bar: { baz: 20 } }
{ foo: 1, bar: { baz: 'test' } }위 예제에서 newObj는 원본 obj의 값이 변경되어도 그대로 유지되는 것을 확인할 수 있습니다. 즉, 두 객체가 완전히 독립적이므로 딥 클론이 성공적으로 수행된 것입니다.
JSON 방식의 주요 한계
- 객체 내부의 메서드(함수)는 복사되지 않고 사라집니다.
undefined,function,Symbol타입의 속성은 무시됩니다.Date객체는 문자열로 변환되며,Map,Set,RegExp등도 제대로 복원되지 않습니다.- 순환 참조(circular reference)가 있는 객체는 에러를 발생시킵니다.
현대적인 대안: structuredClone()
최신 브라우저와 Node.js 환경에서는 structuredClone() API를 사용하는 것이 권장됩니다. 이 함수는 순환 참조와 다양한 데이터 타입을 안전하게 처리할 수 있어 JSON 방식보다 훨씬 견고합니다.
const newObj = structuredClone(obj);
정리하면, 단순한 데이터 객체라면 JSON.parse(JSON.stringify()) 방식으로도 충분하지만, 복잡한 구조나 특수한 타입이 포함된 객체라면 structuredClone()을 사용하는 것이 더 안전하고 효율적인 선택입니다.