[4팀 김지혜] Chapter 4-2 코드 관점의 성능 최적화#42
Open
adds9810 wants to merge 22 commits into
Open
Conversation
- SearchItem 컴포넌트를 memo로 감싸서 개별 메모이제이션 적용
- ScheduleTableGrid 컴포넌트로 그리드 로직 분리 - ScheduleTableWrapper 컴포넌트로 시간표 래퍼 분리 - useAutoCallback으로 콜백 함수 참조 안정화 - DnD Provider를 개별 시간표로 이동하여 렌더링 최적화 - 타입 안정성 개선 및 코드 스타일 정리
- fetchAllLectures 함수를 클로저와 Map을 이용한 캐시로 최적화 - Promise.all에서 await 제거하여 병렬 실행 구현 - 중복 API 호출 제거 (majors, liberal-arts 각각 1회만 호출) -
- 컴포넌트를 폴더별로 분리하여 구조 개선 - SearchDialog, ScheduleTable, ScheduleTables를 각각의 폴더로 이동 - API 호출 최적화 - Promise.all에서 await 제거로 병렬 실행 구현 - 복잡한 캐시 로직을 간단한 구조로 변경 - import 경로를 새로운 폴더 구조에 맞게 수정
- API 호출 최적화 (Promise.all 병렬 실행) - SearchDialog 리렌더링 최적화 (memo, useMemo) - ScheduleTable 드래그 성능 개선 - 컴포넌트 구조 개선
- API 캐싱으로 중복 호출 방지 - Promise.all 병렬 실행으로 성능 향상
- 각 필터를 별도 컴포넌트로 분리 (QueryFilter, CreditsFilter, GradesFilter, DaysFilter, TimesFilter, MajorsFilter) - 각 필터 컴포넌트에 memo 적용하여 독립적인 리렌더링 보장 - 핸들러 함수들을 useCallback으로 메모이제이션하여 참조 안정화 - 개별 상태 관리로 변경되는 영역만 리렌더링되도록 최적화 - 불필요한 import 및 상수 제거로 코드 정리
- 분리된 6개 필터 컴포넌트를 SearchDialog로 통합 - 각 필터 섹션을 useMemo로 메모이제이션하여 독립적인 리렌더링 보장 - 핸들러 함수들을 useCallback으로 메모이제이션하여 참조 안정화 - 개별 상태 관리 유지로 변경되는 영역만 리렌더링되도록 최적화
- ScheduleTable, ScheduleTableGrid, DraggableSchedule 컴포넌트 메모이제이션 - ScheduleDndProvider 상태 업데이트 최적화 - 드래그 시 변경된 요소만 리렌더링되도록 개선
- 드래그 시 해당 블록만 리렌더링 - Drop 시 시간표 전체 리렌더링 방지 - Popover 조건부 렌더링으로 드래그 성능 향상 - Context 의존성 제거 및 메모이제이션 강화
- 각 테이블마다 독립적인 TableContext 생성 - 드롭 시 해당 시간표만 리렌더링되도록 최적화 - 파일 구조 정리 (ScheduleTables 이동)
- 독립적인 TableContext로 드롭 시 리렌더링 최적화 - Promise.all 병렬 실행 및 캐시 활용으로 API 성능 개선 - 폴더 구조 정리 및 빌드 에러 수정
- 절대 경로에서 상대 경로로 변경 - GitHub Pages에서 JSON 파일 로드 문제 해결
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://adds9810.github.io/front_6th_chapter4-2/
과제 요구사항
배포 후 url 제출
API 호출 최적화(
Promise.all이해)SearchDialog 불필요한 연산 최적화
SearchDialog 불필요한 리렌더링 최적화
시간표 블록 드래그시 렌더링 최적화
시간표 블록 드롭시 렌더링 최적화
과제 셀프회고
기술적 성장
API 호출 최적화 - Promise.all의 올바른 사용법
await 키워드를 제거하여 진정한 병렬 실행을 구현하는 방법을 학습했습니다. 이를 통해 API 호출이 6번에서 2번으로 66% 감소하고, 실행 시간이 101.6ms에서 56.8ms로 약 44.8ms 단축되는 성능 개선을 달성했습니다.
SearchDialog 불필요한 연산 최적화 - useMemo 활용
복잡한 필터링 로직이 매번 렌더링 될 때마다 실행되는 문제를 useMemo로 해결했습니다. 이를 통해 의존성 배열 값이 변경될 때만 필터링 로직이 재실행되도록 최적화했습니다.
SearchDialog 불필요한 리렌더링 최적화 - useCallback과 React.memo
이벤트 핸들러 함수들이 매 렌더링마다 새로 생성되어 자식 컴포넌트들이 계속 리렌더링되는 문제를 해결했습니다. useCallback으로 함수 참조를 안정화하고, 각 필터 섹션을 useMemo로 분리하여 독립적인 리렌더링을 보장했습니다.
시간표 블록 드래그시 렌더링 최적화 - isLazy prop과 메모이제이션
드래그 중에도 Popover 컴포넌트가 계속 리렌더링되는 문제를 해결했습니다. isLazy prop을 사용하여 PopoverContent가 실제로 열릴 때만 렌더링되도록 하고, React.memo의 커스텀 비교 함수를 통해 드래그하는 블록만 리렌더링되도록 최적화했습니다.
시간표 블록 드롭시 렌더링 최적화 - Context 분리 패턴
드래그 앤 드롭으로 스케줄을 이동할 때, 변경되지 않은 다른 시간표들도 모두 리렌더링되는 문제를 해결했습니다. 각 테이블마다 독립적인 TableContext를 생성하여 완전히 격리된 상태 관리로 해결했습니다. 이를 통해 드롭한 시간표만 리렌더링되고 다른 시간표는 영향받지 않는 최적화를 달성했습니다.
학습 효과 분석
과제 피드백
과제에서 좋았던 부분 : React DevTools를 활용해 성능 최적화를 눈으로 볼 수 있어서 좋았습니다. 드롭 시 해당 시간표만 리렌더링되는 것을 직접 확인하고, API 호출이 6번에서 2번으로 줄어드는 것을 네트워크 탭에서 확인할 수 있어서 최적화의 효과를 체감할 수 있었습니다. 또한 React Profiler로 렌더링 횟수와 시간을 직접 측정해보면서 React.memo, useMemo, useCallback 같은 메모이제이션의 효과를 실시간으로 확인할 수 있어서 이론으로만 알던 개념을 실제로 적용하고 검증하는 과정에서 깊게 이해하게 되었습니다.
리뷰 받고 싶은 내용