[2팀 김우정] Chapter 4-2. 코드 관점의 성능 최적화 #20
Open
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.
과제 체크포인트
배포 링크
과제 요구사항
Promise.all이해)과제 셀프회고
1. SearchDialog API 호출 최적화
(1) 직렬 호출 → 병렬 호출
기존에는 각 API 호출 함수 내부에서 await을 사용해 직렬로 요청이 수행되고 있었습니다.
이를 Promise.all을 사용해 병렬 호출로 변경하여 초기 로딩 시간을 단축했습니다.
(2) 클로저를 활용한 캐싱
최초 구현에서는 async/await으로 응답을 받은 뒤 캐싱했지만, 이 방식은 병렬 호출 상황에서는 중복 요청을 막지 못했습니다.
클로저 내부에 Promise 자체를 캐싱하는 방식으로 변경하여, 동일 요청에 대해 하나의 Promise를 공유하도록 개선했습니다.
결과적으로 동일 API의 중복 호출을 제거할 수 있었고, 체감 성능이 크게 개선되었습니다.
2. 불필요한 연산 최적화
검색 조건이 변경되지 않는 한 필터링 연산이 반복되지 않도록 개선하였습니다.
3. 불필요한 렌더링 방지 (검색 결과 테이블)
스크롤 시 tbody 하위 컴포넌트 전체가 다시 렌더링되는 문제가 있었고, 페이지가 뒤로 갈수록 누적된 아이템들로 인해 점점 더 느려지는 현상이 있었습니다.
4. 드래그 시 렌더링 최적화
드래그 중 모든 시간표 테이블이 리렌더링되고 있어서 현재 드래그 대상이 되는 테이블만 영향을 받도록 개선 시도하였습니다.
그런데 아직 드래그 중 테이블 내부의 다른 아이템들과 popover까지 계속 리렌더링되는 문제가 존재했습니다.
👉 이 과정에서 함수 props의 참조 안정성이 렌더링에 미치는 영향을 명확히 확인할 수 있었습니다.
5. 드롭 시 렌더링 최적화
Context가 변경되면 결국 모든 구독 컴포넌트가 영향을 받는 구조적 한계 개선
👉 이 과정에서, “하나라도 리렌더링을 유발하는 요소가 있으면 성능 개선이 어렵다”는 걸 체감하고, 준일 코치님이 모든 것을 메모이제이션하는 것도 좋은 방법이라고 하셨던 이유를 몸소 이해하게 됐습니다.
👉 또 useCallback으로 감싼 함수더라도, 자식 컴포넌트로 넘겨줄 때 파라미터를 포함한 함수로 인라인 작성하면 매번 새롭게 생성되어 리렌더링이 발생하는 걸 확인했습니다.
리뷰 받고 싶은 내용
React.memo, useCallback, useMemo를 적용해도 여전히 리렌더링이 발생하는 경우가 많았는데요.
코치님은 이런 상황에서 “메모이제이션을 더 할지, 구조를 바꿀지”를 어떻게 판단하시나요?