공부를 하면서 개인적으로 궁금했던 부분을 해결하거나, 스터디를 통해 배운 내용을 정리합니다.
🔖 모던 자바스크립트 DeepDive
p.177
객체의 변경을 추적하려면 옵저버 패턴 등을 통해 객체를 참조를 공유하는 모든 이들에게 변경 사실을 통지하고 이에 대처하는 추가 대응이 필요하다
옵저버 패턴(Observer Pattern)
: 옵저버(관찰자)들이 관찰하고 있는 대상자의 상태가 변화가 있을 때마다 대상자는 직접 목록의 각 관찰자들에게 통지하고, 관찰자들은 알림을 받아 조치를 취하는 행동 패턴
⇒ 해결 방법 중 하나 : 객체를 불변 객체로 만들어 사용하는 것 (객체의 방어적 복사를 통해 깊은 복사를 진행해 새로운 객체를 생성하고 재할당을 통해 교체)
⇒ 부수 효과를 없앨 수 있음
복사본을 만들고 원본 대신 복사본을 변경하는 ‘카피-온-라이트’가 생각났음.
같은 개념이라고 생각했는데 둘이 비슷한 듯 다른 개념이라, 카피-온-라이트와 방어적 복사를 비교하고 이야기해보고자 함.
🔖 쏙쏙 들어오는 함수형 프로그래밍
- 함수형 프로그래밍의 데이터 불변성
- 카피-온-라이트 : 변경할 때 복사본을 만든다.
- 방어적 복사 : 보관하려고 하는 데이터의 복사본을 만든다.
카피-온-라이트와 방어적 복사 모두 데이터의 불변성을 유지하도록 한다.
- 방어적 복사
- 신뢰할 수 없는 레거시 코드는 어떤 일이 일어날 지 정확히 알 수 없어 데이터가 바뀌는 것을 완벽히 막아주는 원칙
- 사용 시기: 신뢰할 수 없는 코드(ex. 레거시 코드)와 데이터를 주고받아야 할 때
- 규칙:
- 데이터가 안전한 코드에서 나갈 때 복사하기
- 안전한 코드로 데이터가 들어올 때 복사하기
- 복사 방식:
깊은 복사
- 위에서 아래로 모든 계층에 있는 중첩된 데이터 구조를 복사하는 것
- 활용 방법 : structuredClone(obj), JSON.parse(JSON.stringify(obj)), lodash 라이브러리의 .cloneDeep()
- 카피-온-라이트
- 사용 시기: 통제할 수 있는 데이터를 바꿀 때
- 규칙:
- 데이터의 복사본 만들기
- 복사본 변경하기
- 복사본 리턴하기
- 복사 방식:
얕은 복사
- 중첩 데이터에서 최상위 데이터 구조만 복사하는 것 (필요한 부분만 최소한으로 복사)
keyPoint
- 방어적 복사는 불변성을 구현하는 원칙이다. 데이터가 들어오고 나갈 때 복사본을 만다.
- 방어적 복사는 깊은 복사를 한다. 그래서 카피-온-라이트보다 비용이 더 크다.
- 카피-온 라이트와 다르게 방어적 복사는 불변성 원칙을 구현하지 않은 코드로부터 데이터를 보호해준다.
- 복사본이 많이 필요하지 않기 때문에 카피-온-라이트를 더 많이 사용한다. 방어적 복사는 신뢰 할 수 없는 코드와 함께 사용할 때만 사용한다.
- 깊은 복사는 위에서 아래로 중첩된 데이터 전체를 복사한다. 얄은 복사는 필요한 부분만 최소한으로 복사한다.