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

카피-온-라이트와 방어적 복사 모두 데이터의 불변성을 유지하도록 한다.

  • 방어적 복사
    • 신뢰할 수 없는 레거시 코드는 어떤 일이 일어날 지 정확히 알 수 없어 데이터가 바뀌는 것을 완벽히 막아주는 원칙
    • 사용 시기: 신뢰할 수 없는 코드(ex. 레거시 코드)와 데이터를 주고받아야 할 때
    • 규칙:
      1. 데이터가 안전한 코드에서 나갈 때 복사하기
      2. 안전한 코드로 데이터가 들어올 때 복사하기
    • 복사 방식: 깊은 복사
      • 위에서 아래로 모든 계층에 있는 중첩된 데이터 구조를 복사하는 것
      • 활용 방법 : structuredClone(obj), JSON.parse(JSON.stringify(obj)), lodash 라이브러리의 .cloneDeep()
  • 카피-온-라이트
    • 사용 시기: 통제할 수 있는 데이터를 바꿀 때
    • 규칙:
      1. 데이터의 복사본 만들기
      2. 복사본 변경하기
      3. 복사본 리턴하기
    • 복사 방식: 얕은 복사
      • 중첩 데이터에서 최상위 데이터 구조만 복사하는 것 (필요한 부분만 최소한으로 복사)

keyPoint

  • 방어적 복사는 불변성을 구현하는 원칙이다. 데이터가 들어오고 나갈 때 복사본을 만다.
  • 방어적 복사는 깊은 복사를 한다. 그래서 카피-온-라이트보다 비용이 더 다.
  • 카피-온 라이트와 다르게 방어적 복사는 불변성 원칙을 구현하지 않은 코드로부터 데이터를 보호해준다.
  • 복사본이 많이 필요하지 않기 때문에 카피-온-라이트를 더 많이 사용한다. 방어적 복사는 신뢰 할 수 없는 코드와 함께 사용할 때만 사용한다.
  • 깊은 복사는 위에서 아래로 중첩된 데이터 전체를 복사한다. 얕은 복사는 필요한 부분만 최소한으로 복사한다.

Question

p.156 모듈이 서로 통신하기 위해 방어적 복사를 구현한다면 비공유 아키텍처(shared nothing architecture)라고 합니다. 모듈이 어떤 데이터의 참조도 공유하고 있지 않기 때문입니다.

→ 비공유아키텍처와 방어적 복사

비공유 아키텍처

  • 모듈 간의 상태를 공유하지 않고 독립적으로 유지하는 아키텍처

  • 방어적 복사를 사용해 이를 구현

    ← 어떤 데이터의 참조도 공유하고 있지 않기 때문

⇒ 시스템 아키텍처를 더 견고하고 유지보수가 가능하게 함