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

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

레거시 코드와 불변성

방어적 복사 : 카피-온-라이트 원칙을 지키면서 안전하게 함수를 사용할수 있는 다른 원칙

우리가 만든 카피-온-라이트 코드는 신뢰할 수 없는 코드와 상호작용해야 합니다

모든 코드는 불변성이 지켜지는 안전지대에 있다

안전지대 밖으로 나가는 데이터는 바뀔수도 있다. 신뢰할 수 없는 코드가 데이터를 바꿀수 있기 때문이다
불변성을 지키면서 데이터를 주고 받는 법을 찾아야된다

레거시 코드를 바꿀수 없을때 방어적 복사를 사용할수도 있다

방어적 복사는 원본이 바뀌는 것을 막아 줍니다

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

방어적 복사 구현하기

복사할때는 깊은 복사를 사용해야 된다

방어적 복사 규칙

  • 데이터가 안전한 코드에서 나갈 때 복사하기
    • 불변성 데이터를 위한 깊은 복사본을 만든다
    • 신뢰할 수 없는 코드로 복사본을 전달한다
  • 안전한 코드로 데이터가 들어올 때 복사하기
    • 변경될 수도 있는 데이터가 들어오면 바로 깊은 복사본을 만들어 안전한 코드로 전달한다
    • 복사본을 안전한 코드에서 사용한다

신뢰할 수 없는 코드 감싸기

방어적 복사 코드를 분리해 새로운 함수로 만들어 두면 좋다

방어적 복사가 익숙할 수도 있습니다

  • 웹 API속에 방어적 복사
    • JSON 으로 데이터를 주고 받을 때
  • 얼랭과 엘릭서에서 방어적 복사
    • 서로 메시지를 주고 받을때

카피-온-라이트와 방어적 복사를 비교해 봅시다

카피-온-라이트

언제 쓰나요?

  • 통제할수 있는 데이터를 바꿀때

어디서 쓰나요?

  • 안전지대 어디에서나?

복사방식

  • 얕은복사

규칙

  • 바꿀 데이터의 얕은 복사를 만든다
  • 복사본을 변경한다
  • 복사본을 리턴한다

방어적 복사

언제 쓰나요?

  • 신뢰할 수 없는 코드와 데이터를 주고받아야 할때
    어디서 쓰나요?
  • 안전지대의 경계에서 데이터가 오고 갈 때
    복사방식
  • 깊은 복사
    규칙
  • 안전지대로 들어오는 데이터에 깊은 복사를 만듬
  • 안전지대에서 나가는 데이터에 깊은 복사를 만듬

깊은 복사는 얕은 복사보다 비쌉니다

깊은 복사는 원본과 어떤 데이터 구조도 공유하지 않는것이 얕은 복사와 차이점

참조