본문 바로가기
Coding Study/Javascript 내장함수

structuredClone()

by bell_one 2026. 1. 15.

MDN 스타일 요약 structuredClone() 전역 메서드는 주어진 값의 **깊은 복사(Deep Copy)**를 생성합니다.

기존에는 깊은 복사를 위해 JSON.parse(JSON.stringify(obj))를 사용했으나, 이 방식은 Date 객체를 문자열로 바꾸거나 undefined를 누락시키는 등의 치명적인 단점이 있었습니다. structuredClone()은 자바스크립트의 표준 알고리즘을 사용하여 Date, Set, Map, ArrayBuffer 등을 포함한 복잡한 데이터 구조를 원본의 훼손 없이 완벽하게 복제합니다.


React 실무 예시 React에서 다중 레벨로 구성된 객체(예: 복잡한 폼 데이터, 설정 값)를 업데이트할 때, 원본 상태를 직접 수정하지 않고 안전하게 복사본을 만들어 변경할 수 있습니다.

import React, { useState } from 'react';

const UserProfile = () => {
  const [user, setUser] = useState({
    name: "김민수",
    details: {
      hobbies: ["독서", "등산"],
      address: { city: "서울", district: "강남구" }
    }
  });

  const updateCity = () => {
    // 기존 방식: 전개 연산자(...)를 중첩해서 써야 함 (매우 번거로움)
    // const newUser = { ...user, details: { ...user.details, address: { ...user.details.address, city: "부산" } } };

    // 최신 방식: structuredClone으로 전체를 복사한 뒤 수정
    const newUser = structuredClone(user);
    newUser.details.address.city = "부산"; // 이제 깊은 복사본이므로 안전하게 수정 가능
    
    setUser(newUser);
  };

  return (
    <div className="p-4 bg-white border rounded-lg shadow">
      <h2 className="text-xl font-bold">{user.name}님의 프로필</h2>
      <p>도시: {user.details.address.city}</p>
      <p>취미: {user.details.hobbies.join(", ")}</p>
      
      <button 
        onClick={updateCity}
        className="mt-4 px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition"
      >
        도시를 부산으로 변경
      </button>
    </div>
  );
};

export default UserProfile;

실무 활용 포인트:

  • 참조 무결성: 중첩된 배열이나 객체를 수정할 때 의도치 않게 원본 데이터가 바뀌는 사이드 이펙트를 원천 차단합니다.
  • 성능과 호환성: 외부 라이브러리(Lodash의 cloneDeep 등)를 설치하지 않아도 브라우저 내장 기능을 사용하여 번들 크기를 줄일 수 있습니다.
  • 주의사항: 함수(Function)나 DOM 요소는 복사할 수 없으니, 데이터 위주의 객체를 복사할 때 사용하세요.

'Coding Study > Javascript 내장함수' 카테고리의 다른 글

Set.prototype.has()  (0) 2026.01.15
Intl.NumberFormat()  (0) 2026.01.15
Array.prototype.findLast()  (0) 2026.01.15
Array.prototype.with()  (0) 2026.01.15
Array.prototype.at()  (0) 2026.01.15