[1팀 이의찬] Chapter 4-2 코드 관점의 성능 최적화#26
Open
Legitgoons wants to merge 18 commits into
Open
Conversation
모든 table이 같은 provider 내부에 있어서 하나의 table의 값만 변경되어도 모두 리랜더링이 일어남 provider를 분리해서 상태를 격리하고, 리랜더링이 각 테이블만 일어나도록 수정
DraggableSchedule React.memo 처리 onDeleteButtonClickCallback useCallback 처리
context에서 TableWrapper로 상태를 주입하고, 그 다음부터는 각 테이블별로 상태를 관리하도록 구현
DnD 시스템개선
Chakra UI의 isLazy 속성 활용
LectureTableRow 분리 및 메모이제이션 addSchedule 메모이제이션
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://legitgoons.github.io/front_6th_chapter4-2
과제 요구사항
배포 후 url 제출
API 호출 최적화(
Promise.all이해)SearchDialog 불필요한 연산 최적화
SearchDialog 불필요한 리렌더링 최적화
시간표 블록 드래그시 렌더링 최적화
시간표 블록 드롭시 렌더링 최적화
과제 셀프회고
기술적 성장
1. 캐시를 구현해보기
2. props에는 가능한 원시값을 넘겨주기
컴포넌트는 랜더링 될 때 마다 내부에서 새로운 선언이 이뤄진다.
근데 리액트는 Object.is()를 사용해서 원시값은 값만 비교하는데, 객체는 참조를 비교한다
고로 부모에서 매번 리랜더링이 일어나는 상태에서 참조값을 자식 컴포넌트에 props로 넘겨주면?
memo해봤자 props가 계속 바뀌니까 자식 컴포넌트도 계속 리랜더링된다!
그렇기에, props에는 가능한 원시값을 넘겨주는 것이 권장된다.
3. 메모이제이션을 적절하게 잘 사용하는 방법
그럼에도 불구하고 참조값을 props로 넘기고 싶다면 두 가지 방법이 있다.
Note
메모이제이션 기법 중 나머지 하나인 useMemo의 경우, 비용이 큰 계산을 최적화 할 때 사용된다.
feat: 필터링된 강의 목록과 전공 목록 메모이제이션 참조
Context의 Provider를 사용해서 상태를 격리하기
<ScheduleDndProvider>의 경우 모든 table이 같은 provider 내부에 있어서 하나의 table의 값만 변경되어도 모두 리랜더링이 일어나고 있었다. 이를 provider를 분리해서 상태를 격리하고, 리랜더링이 각 테이블만 일어나도록 수정했다.이후 Drop 시 전체 리렌더링이 일어나는
ScheduleContext도 비슷한 문제가 있었는데, 이는 아래와 같은 방법으로 해결했다.코드 품질
가장 기억에 남는 부분: Drop 시 렌더링 최적화
ScheduleContext는 모든 테이블의 스케줄 데이터를 하나의schedulesMap으로 관리한다. 고로 Drop 시schedulesMap가 다시 업데이트되고, 이를 구독하는 모든 컴포넌트들에서 리랜더링이 일어나고 있었다.생각한 해결방안은 다음과 같았다.
다만 메모리측면에서 같은 상태를 context와 state 양쪽에서 가지고 있어야 한다는 점, 그리고 전역 상태가 아닌 로컬 상태로 만들어서 관리하는 방법인데 전역상태가 필요하다면 골치아파지기에 실제 프로덕트였다면 zustand를 사용했을 것 같다.
학습 효과 분석
가장 아쉬운 점은 지난 회사에서 대용량 데이터로 차트를 그릴 일이 많았는데, 그때는 이런 성능 최적화 기법들을 알고 있지 못했다는 점이다. 그 당시에는 메모이제이션 기법 조차도 명확하게 이해하지 못해서 사용을 꺼려했었다.
이제는 어떤 최적화 기법들이 있고, 왜 사용해야 하는지와 언제 사용해야하는지를 익혔기에 조금씩이나마 사용할 수 있을 것 같다.
as-is
to-be
과제 피드백
리뷰 받고 싶은 내용
이번 과제를 진행하면서 이제 useCallback과 React.memo의 경우에는 감이 잡히는 것 같습니다. 하지만 useMemo의 경우에는 아직 좀 아리송한데요. useMemo는 그냥 단순히 계산이 큰 값을 메모이제이션 하는 것 외에는 사용방법이 없는지가 궁금합니다.
또, react 공홈에서는 useMemo의 경우 계산에 1ms이상이 걸릴 때, useMemo를 사용하는 것을 권장한다는데, 실제로 코치님의 경우에는 이걸 측정하면서 사용하시나요...?