
방어적 복사는 데이터의 원본이 바뀌는 것을 완벽하게 막아주는 역할을 한다. 방어적 복사는 불변성이 지켜지는 안전지대로 데이터의 원본, 복사본을 이동시킴으로서 변하는 데이터에 대해서 안전하게 데이터를 주고 받을 수 있다.
데이터가 안전한 코드에서 나갈때 복사하기
변경 불가능한 데이터가 신뢰할 수 없는 코드로 나갈때 데이터를 깊은 복사로 복사본을 만들고, 해당 복사본을 전달한다.
안전한 코드로 데이터가 들어올 때 복사하기
신뢰할 수 없는 코드에서 변경 가능성이 있는 데이터가 들어올때 깊은 복사본을 만들어 안전한 코드로 전달한다.
// payrollCalcSafe() 방어적 복사가 적용된 함수 만들기
function payrollCalcSafe(employee) {
const employee_copy = deepCopy(employee);
const payRollChecks = payrollCalc(employee_copy);
return deepCopy(payRollChecks);
}
// 방어적 복사 적용하기
userChanges.subscribe(function(user) {
...
const user_copy = deepCopy(user);
processUser(user_copy);
// 나가는 데이터가 없기 때문에 추가로 복사할 필요가 없다.
})
깊은 복사는 모든 계층에 대해 중첩된 데이터를 모두 복사하기 떄문에 얕은 복사에 비해 비용이 많이든다. 안전지대 내에서는 모든 계층에 대한 복사가 필요없기 때문에 비교적 복사 비용이 많이 들지 않는 카피-온-라이트를 활용하는 것이 성능상 이점을 가질 수 있다. 그래서 카피-온-라이트와 깊은 복사 모두 적절하게 사용되어야 한다.
| 카피-온-라이트 | 깊은복사 | |
|---|---|---|
| 언제 | 통제할 수 있는 데이터를 바꿀 때 | 신뢰할 수 없는 코드와 데이터를 주고 받을 때 |
| 어디서 | 안전지대 내에서 | 안전지대의 경계에서 데이터가 오고가는 곳에서 |
| 복사방식 | 얕은 복사 | 깊은 복사 |
| 규칙 | 1. 바꿀 데이터의 복사본을 만든다.(얕은복사) 2. 복사본을 변경한다. 3. 복사본을 리턴한다. | 1. 안전지대로 들어오는 데이터의 복사본을 만든다. (깊은 복사) 2. 안전지대에서 나가는 데이터의 복사본을 만든다. |
정보 감사합니다.