메가마트는 블랙 프라이데이 행사를 준비하기로 했다
지금까지 장바구니에 관련된 코드는 카피-온-라이트를 적용해 불변성을 유지했지만, 블랙 프라이데이 행사 코드는 많은 곳에서 장바구니 데이터를 변경한다
레거시 코드에 쓸 수 있는 안전한 인터페이스가 필요하다
function add_item_to_cart(name, price) {
let item = make_cart_item(name, price),
shopping_cart = add_item(shopping_cart, item);
let total = calc_total(shopping_cart);
set_cart_total_dom(total);
update_shipping_icons(shopping_cart);
update_tax_dom(total);
black_friday_promotion(shopping_cart); // 장바구니 값을 바꾸는 코드
추가된 black_friday_promotion
함수를 호출하면 카피-온-라이트 원칙이 깨어지며, 이 함수를 고치기도 애매하다
이럴 때 방어적 복사 원칙을 사용하면 안전하게 함수를 사용할 수 있다
black_friday_promotion
함수는 카피-온-라이트를 적용한 코드가 아니기 때문에 신뢰할 수 없고, 불변성을 지킬 수 없다
앞서 카피-온-라이트를 지켜 만든 코드들은 안전지대 안에 놓여있으며, 안전지대 안에 있는 코드는 걱정 없이 사용할 수 있다
블랙 프라이데이 함수는 안전지대 밖에 있으나, 요구한 블랙 프라이데이 이벤트를 구현하려면 안전하지 않은 함수를 사용할 수밖에 없다 ⇒ 블랙 프라이데이 함수의 입출력을 통해 안전지대에 있는 코드와 데이터를 주고받아야 한다
문제는 안전지대 밖으로 나가는 데이터는 잠재적으로 바뀔 여지가 있다는 것
신뢰할 수 없는 코드는 데이터를 바꿀 수 있고, 신뢰할 수 없는 코드에서 안전지대로 들어오는 데이터 역시 바뀔 수 있다
불변성을 지키면서 데이터를 주고받는 방법을 찾아야 한다