[Front-end] 개발자 공부

[개발 공부 86일차] 함수형 코딩 | 방어적 복사

MOLLY_ 2024. 8. 19. 20:04
728x90

<목차>
0. TL;DR
1.
방어적 복사는 원본이 바뀌는 걸 막아준다

2. 방어적 복사 구현하는 법
3. 방어적 복사를 사용하는 실제 사례
4.
카피-온-라이트 & 방어적 복사 비교

 

 

 

Ch7 | 신뢰할 수 없는 코드를 쓰면서 불변성 지키기

[들어가며] 이 챕터에서 배울 핵심 내용

  • *레거시 코드나 신뢰할 수 없는 코드로부터 내 코드를 보호하기 위해 방어적 복사 만들기
  • 얕은 복사, 깊은 복사의 차이
  • 카피-온-라이트 & 방어적 복사를 언제 사용하면 좋을지

 

🍯 레거시 코드 (legacy code): 오래 전에 만든 것으로, 지금 당장 고칠 수 없어서 그대로 사용해야 하는 코드

 

 

0. TL;DR

  1. 방어적 복사: 신뢰할 수 없는 코드 or 데이터가 안전한 코드로 들어오고 나갈 때마다 복사본을 만듦 → 들여보내거나 내보냄
    • 불변성을 구현하는 원칙으로, 데이터가 바뀌는 걸 막아줌
    • 깊은 복사를 하며 카피-온-라이트보다 비용이 더 듦
    • 불변성 원칙을 구현하지 않은 코드로부터 데이터를 보호
  2. 복사본이 많이 필요하지 않기 때문에 카피-온-라이트를 더 많이 사용하며, 방어적 복사는 신뢰할 수 없는 코드를 사용할 때에만 사용
  3. 깊은 복사: 위에서 아래로 중첩된 데이터 전체를 복사

 

 

1. 방어적 복사는 원본이 바뀌는 걸 막아준다

Q. 신뢰할 수 없는 코드와 데이터를 주고 받는 문제를 푸는 방법은?

A. 복사본을 만드는 것

 

 

신뢰할 수 없는 코드 or 데이터가 안전한 코드로 들어오고 나갈 때마다 복사본을 만듦 → 들여보내거나 내보냄

 

들어오고 나가는 데이터의 복사본을 만드는 게 *방어적 복사가 동작하는 방식임

[나의 해석] *깊은 복사본이 ‘중간 매개체’ 역할을 하는 느낌임

 

🍯 ‘방어적’이라고 하는 이유: 원본이 바뀌지 않도록 막아주기 때문

👾 깊은 복사 (deep copy): 위에서 아래로 모든 계층에 있는 중첩된 데이터 구조 복사

 

 

2. 방어적 복사 구현하는 법

들어오고 나가는 데이터의 복사본을 만드는 코드

 

 

 

자바스크립트에서 깊은 복사를 구현하려면 Lodash 라이브러리 사용하기

Lodash 라이브러리에 있는 깊은 복사 함수인 .cloneDeep() 함수를 사용하면 중첩된 데이터에 깊은 복사를 할 수 있다.

// Lodash 모듈 import
import _ from 'lodash';

// 복사할 원본 객체 생성
const original = {
  name: "John",
  age: 30,
  contact: {
    email: "john@example.com",
    phone: "123-456-7890"
  },
  hobbies: ["reading", "gaming", "hiking"]
};

// _.cloneDeep 함수를 사용하여 깊은 복사 수행
// 원본 객체의 모든 수준의 중첩된 객체까지 완전히 새로운 복사본 생성
const deepCopy = _.cloneDeep(original);

// 깊은 복사된 객체의 데이터 수정
deepCopy.contact.email = "john.newemail@example.com";
deepCopy.hobbies.push("cycling");

// 콘솔에 원본 객체와 깊은 복사된 객체를 출력하여 비교
console.log("Original:", original);
console.log("Deep Copy:", deepCopy);

// 이 코드를 실행하면 원본 객체는 수정되지 않고, 깊은 복사된 객체만이 수정된 것을 확인할 수 있음

 

 

3. 방어적 복사를 사용하는 실제 사례

웹 API는 방어적 복사를 사용한다.

방어적 복사로 서로 다른 코드와 원칙을 가진 서비스들이 문제 없이 통신할 수 있다.

 

👾 비공유 아키텍처 (shared nothing architecture): 모듈이 서로 통신하기 위해 방어적 복사를 공유한 것 (모듈이 어떤 데이터의 참조도 공유하지 않음)

 

 

4. 카피-온-라이트 & 방어적 복사 비교

 

 

 

728x90