[8팀 김민지] Chapter 1-3. React, Beyond the Basics #18
Open
annkimm wants to merge 9 commits intohanghae-plus:mainfrom
Open
[8팀 김민지] Chapter 1-3. React, Beyond the Basics #18annkimm wants to merge 9 commits intohanghae-plus:mainfrom
annkimm wants to merge 9 commits intohanghae-plus:mainfrom
Conversation
unseoJang
reviewed
Jul 28, 2025
| import { Toast } from "./Toast"; | ||
| import { createActions, initialState, toastReducer, type ToastType } from "./toastReducer"; | ||
| import { debounce } from "../../utils"; | ||
| import { useAutoCallback } from "@hanghae-plus/lib"; |
There was a problem hiding this comment.
useAutoCallback은 구현체가 명확하지 않아서 안정성을 떨어뜨릴 수 있어요!
React 내장객체를 사용하기를 권장드립니다!
| return result; | ||
| } | ||
|
|
||
| export const deepEquals = (a: unknown, b: unknown) => { |
There was a problem hiding this comment.
이런식으로 비교하게되면 성능은 확실히 빠르지만 배열 비교 정확도 낮아지는 단점이 있어요, React가 생각보다 성능이 좋은 프레임워크는 아니라서 재귀를 기반으로한 깊은 비교를 하도록 권유드리고 싶어요
다른분들의 코드를 보면서 복습해보면 이러한 방법도 있구나 라고 많은 공부가 될것 같아요
| } | ||
|
|
||
| if (typeof a === "object" && typeof b === "object" && a && b) { | ||
| const aKeys = Object.keys(a).sort(); |
There was a problem hiding this comment.
해당 방식은 얕은 비교를 추천드립니다.
sort()로 비교하게 되면 이후 인덱스마다 키를 비교하는 방식은 퍼포먼스 측면에서 손해를 볼수 있어요
const aKeys = Object.keys(a);
const bKeys = Object.keys(b);
if (aKeys.length !== bKeys.length) return false;
for (const key of aKeys) {
if (!(key in b) || a[key] !== b[key]) return false;
}
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
과제 체크포인트
배포 링크
https://annkimm.github.io/front_6th_chapter1-3/
기본과제
equalities
hooks
High Order Components
심화 과제
hooks
context
과제 셀프회고
기존에 너무 AI에 의존한 것에 대해서 어떻게 하면 개선할 수 있을까 고민하다가
대신에 AI에게 코드 없이 구현해야하는 함수를 어떻게 하면
짤 수 있을지 순서를 정하고 흐름을 알려주는 방식으로 바꿨다.
이른바 AI를 튜터처럼 쓰기 개시...!
가끔 너무 많은 흐름을 알려줄 때도 있었지만,
두번째 과제보다는 이번 과제를 해보면서
과제를 스스로 구현할 수 있는 힘을 좀 더 기르고 있다는 생각이 들었다.
기술적 성장
다른 훅들도 의외로 useState와 useRef를 기반으로 구현
이를 통해 useState와 useRef가 훅의 근간을 이루는 필수 개념임을 깨달았다.
useAutoCallback과 useCallback의 차이점에 대한 이해
그동안 useCallback을 너무 무지성으로 썼다는 것을 알 수 있었던 지점 중에 하나였다.
useCallback은 의존성 배열에 따라 값이 바뀌면 새로 참조된다는 것을 새롭게 알 수 있었고,
useAutoCallback은 한번만 참조하기 때문에 특히나 성능 최적화에 유리하다는 것까지 이번에 알 수 있었다.
useShallowSelector와 useShallowState 차이
useShallowSelector -> 얕은 비교를 하는 함수의 역할, (useSyncExternalStore 같은 store가 없기 때문에 구독을 할 수 없다)
useShallowState -> context api, useState 같은 데에서 불필요한 리렌더링을 줄일 때 사용하는 역할
useStorage, useStore 차이
useStorage -> localStorage 같은 Storage에서 값이 변경되면 컴포넌트를 재리렌더링 역할
useStore -> 구독해서 바뀌는 것, 즉 zustand같은 라이브러리 역할
생각보다 deepEqual은 사용하지 않는다는 점을 봤을 때, 연산에 대한 성능을 위해 쓰지 않는걸까라는 생각이 들었다.
자랑하고 싶은 코드
없다...
개선이 필요하다고 생각하는 코드
shallowEquals에서 객체로 비교한 구문과 배열로 비교한 구문을 따로 함수로 뺐으면 좋았을 것 같다.
학습 효과 분석
기술적 성장으로 대체
과제 피드백
저는 2주차 과제보다
이번주차 과제가 더 재밌었어요...
회사에서 아무 생각없이 훅을 쓰게 되는데
여기서 구현해봄으로써 이건 굳이 필요할까?
라는 생각을 더 해보게 되었습니다.
학습 갈무리
리액트의 렌더링이 어떻게 이루어지는지 정리해주세요.
메모이제이션에 대한 나의 생각을 적어주세요.
컨텍스트와 상태관리에 대한 나의 생각을 적어주세요.
ToastContext부분을 함수 부분과 변수부분으로 나눠서 관리하는 방법을 보고 아 저런 방법이 있겠구나 생각이 들었습니다. 오...너무 무거워지지 않게 분산 투자는 중요하구나..(유레카...?!)리뷰 받고 싶은 내용
이번에 useCallback와 useAutoCallback에 대해서 구현하면서 생각이 든건데 useCallback은 의존성 배열에서 따라서 새로 참조한다고 이번에 알게 되었는데, 그냥 드는 생각은 의존성 배열 대신에 매개변수로 받아서 useAutoCallback으로 하먄 될 꺼 같은데 왜 useCallback가 생겨났는지에 대한 이해가 잘 되지 않더라구요. 이렇게 함으로써 장점이 있나요? 성능 최적화의 부분으로써는 최악? 이라는 생각이 드는데.. 의존성 배열에 값이 바뀌면 다시 계속 새로 참조해야 하잖아요.
deepEquals에서 배열 부분을 짤 때 flat을 이용해서 평탄화시킨 다음에
JSON.stringify를 사용해서 짰는데요..역시 이렇게 짜면 안좋은걸까요? for문이나 이런 걸로 하나씩 다 비교하는 게 맞는 걸까요? (과제는 다 통과하긴 했지만...)
뭔가 더 간단한 방법이 없을까 싶어서 해보긴 했지만 틀린건가라는 생각이 들더라구요.