카피-온-라이트와 방어적 복사

17__COLIN·2024년 2월 14일
0

BOOK-STUDY

목록 보기
2/9
post-thumbnail

공부를 하면서 개인적으로 궁금했던 부분을 해결하거나, 스터디를 통해 배운 내용을 정리합니다.

🔖 모던 자바스크립트 DeepDive

p.177

객체의 변경을 추적하려면 옵저버 패턴 등을 통해 객체를 참조를 공유하는 모든 이들에게 변경 사실을 통지하고 이에 대처하는 추가 대응이 필요하다

  • 옵저버 패턴(Observer Pattern) : 옵저버(관찰자)들이 관찰하고 있는 대상자의 상태가 변화가 있을 때마다 대상자는 직접 목록의 각 관찰자들에게 통지하고, 관찰자들은 알림을 받아 조치를 취하는 행동 패턴

⇒ 해결 방법 중 하나 : 객체를 불변 객체로 만들어 사용하는 것 (객체의 방어적 복사를 통해 깊은 복사를 진행해 새로운 객체를 생성하고 재할당을 통해 교체)

⇒ 부수 효과를 없앨 수 있음

복사본을 만들고 원본 대신 복사본을 변경하는 ‘카피-온-라이트’가 생각났음.

같은 개념이라고 생각했는데 둘이 비슷한 듯 다른 개념이라, 카피-온-라이트와 방어적 복사를 비교하고 이야기해보고자 함.


🔖 쏙쏙 들어오는 함수형 프로그래밍

  • 함수형 프로그래밍의 데이터 불변성
    1. 카피-온-라이트 : 변경할 때 복사본을 만든다.
    2. 방어적 복사 : 보관하려고 하는 데이터의 복사본을 만든다.

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

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

keyPoint

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

0개의 댓글