728x90
<목차>
0. TL;DR
1. 방어적 복사는 원본이 바뀌는 걸 막아준다
2. 방어적 복사 구현하는 법
3. 방어적 복사를 사용하는 실제 사례
4. 카피-온-라이트 & 방어적 복사 비교
Ch7 | 신뢰할 수 없는 코드를 쓰면서 불변성 지키기
[들어가며] 이 챕터에서 배울 핵심 내용
- *레거시 코드나 신뢰할 수 없는 코드로부터 내 코드를 보호하기 위해 방어적 복사 만들기
- 얕은 복사, 깊은 복사의 차이
- 카피-온-라이트 & 방어적 복사를 언제 사용하면 좋을지
🍯 레거시 코드 (legacy code): 오래 전에 만든 것으로, 지금 당장 고칠 수 없어서 그대로 사용해야 하는 코드
0. TL;DR
- 방어적 복사: 신뢰할 수 없는 코드 or 데이터가 안전한 코드로 들어오고 나갈 때마다 복사본을 만듦 → 들여보내거나 내보냄
- 불변성을 구현하는 원칙으로, 데이터가 바뀌는 걸 막아줌
- 깊은 복사를 하며 카피-온-라이트보다 비용이 더 듦
- 불변성 원칙을 구현하지 않은 코드로부터 데이터를 보호
- 복사본이 많이 필요하지 않기 때문에 카피-온-라이트를 더 많이 사용하며, 방어적 복사는 신뢰할 수 없는 코드를 사용할 때에만 사용
- 깊은 복사: 위에서 아래로 중첩된 데이터 전체를 복사
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
'[Front-end] 개발자 공부' 카테고리의 다른 글
[프로그래머스 Lv.2] 피보나치 수 | 개념 및 풀이 (JS) (0) | 2024.08.20 |
---|---|
[개발 공부 87일차] replace(), JWT, 유닛 테스트와 에러 모니터링 (0) | 2024.08.20 |
[개발 공부 85일차] 함수형 코딩 | 더 좋은 액션 만들기 (0) | 2024.08.05 |
[개발 공부 84일차] ~(Bitwise NOT), ~~, >>> 연산자 (2) | 2024.07.24 |
[개발 공부 83일차] 함수형 코딩 | 액션과 계산, 데이터의 차이 알기 (0) | 2024.07.21 |