카피 온 라이트를 적용할 수 없는 코드를 함께 사용해야 할 때, 어떻게 불변 데이터를 전달할 수 있을까?
레거시 코드에 쓸 수 있는 안전한 인터페이스가 필요하다.
블랙 프라이데이 행사 코드를 위해 한 줄 추가
function add_item_to_cart(cart, name, price) {
var item = make_cart_item(name, price)
shopping_cart = add_item(cart, item)
var total = calc_total(shopping_cart)
set_cart_total_dom(total)
update_shipping_icons(shopping_cart)
update_tax_dom(total)
black_friday_promotion(shopping_cart) // 이 코드가 필요하지만 이 코드는 장바구니를 바꿈
}
카피 온 라이트 원칙을 지키면서 안전하게 함수를 사용할 수 있는 원칙을 방어적 복사defensive copy라 한다.
안전지대 밖에서 들어오는 데이터와 밖으로 나가는 데이터 모두 바뀔 수 있다. 따라서 불변성을 지키면서 데이터를 주고받아야 한다. 방어적 복사는 데이터가 바뀌는 것을 완벽히 막아주는 원칙이다.
핵심은 들어오고 나가는 데이터의 깊은 복사본을 만드는 것이다.