From d6785d3d580377992efeaafc9293757b3fc5d490 Mon Sep 17 00:00:00 2001 From: SangBeom Park Date: Sun, 28 Apr 2024 17:34:05 +0900 Subject: [PATCH] =?UTF-8?q?=EC=83=81=EB=B2=94=207=EC=9E=A5=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\354\203\201\353\262\224.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 "\354\261\225\355\204\260_7/\354\203\201\353\262\224.md" diff --git "a/\354\261\225\355\204\260_7/\354\203\201\353\262\224.md" "b/\354\261\225\355\204\260_7/\354\203\201\353\262\224.md" new file mode 100644 index 0000000..3f261f9 --- /dev/null +++ "b/\354\261\225\355\204\260_7/\354\203\201\353\262\224.md" @@ -0,0 +1,28 @@ +# 7장 - 신뢰할 수 없는 코드를 쓰면서 불변성 지키기 + +방어적 복사 : 안전하지 않은 코드(서드파티 or 레거시 코드)를 사용하기 전 / 후에 데이터를 복사해서 사용 + +## 깊은 복사는 얕은 복사보다 비싸다 + +![image](https://github.com/muhandojeon/Grokking-Simplicity/assets/43921054/53396dcf-78eb-4151-8ab3-43bf6573cb2a) + +![image](https://github.com/muhandojeon/Grokking-Simplicity/assets/43921054/94bcc75b-09a7-4885-afff-b015f2927de2) + + +tanstack/query 에서 구조적 공유(structural share)는 어떻게 동작될까? + +- 해당 코드 : https://github.com/TanStack/query/blob/2aca521a882e54b01ee6a070cb4a38f38bfa4bcf/packages/query-core/src/utils.ts#L210-L253 + - 코드 해석: + + **입력으로 `a`와 `b` 두 매개변수를 받으며, 이 두 매개변수가 완전히 동일할 경우 `a`를 반환** + + **만약, `a`와 `b`가 배열이거나 객체인 경우, 각 항목 또는 속성을 순회하며 다음을 수행:** + + - **배열 또는 객체의 모든 항목(또는 속성)을 비교** + - **동일한 항목은 `a`에서 가져옴** + - **`a`와 `b` 사이에 동일하지 않은 항목이 있다면, 그 항목에 대해 재귀적으로 `replaceEqualDeep` 함수를 호출하여 깊은 비교를 수행** + - **만약 `a`와 `b`의 크기가 같고, 모든 항목이 동일하다면 원본 `a`를 반환** + - **그렇지 않다면, 변경된 사본을 반환** + + **이 코드의 핵심은, 깊은 동일성(deep equality) 검사를 통해 불필요한 데이터 복사를 방지하고, 가능한 경우 원본 데이터 구조를 재사용하여 메모리 사용을 최적화하는 것. + ⇒ 큰 JSON 구조에서 데이터를 효율적으로 다루기 위함일 듯, 최적화 굿**