[6팀 이지현] Chapter 4-2 코드 관점의 성능 최적화 🧦 - #21
Open
j2h30728 wants to merge 13 commits into
Open
Conversation
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.
과제 체크포인트
과제 요구사항
배포 후 url 제출 : https://j2h30728.github.io/front_6th_chapter4-2/
API 호출 최적화(
Promise.all이해)SearchDialog 불필요한 연산 최적화
SearchDialog 불필요한 리렌더링 최적화
시간표 블록 드래그시 렌더링 최적화
시간표 블록 드롭시 렌더링 최적화
과제 셀프회고
API 호출 최적화
1. Promise.all
문제 점
해결 방법
2. 캐싱
첫 호출시와 두 번째 호출 사이의 시간이 줄어듬을 확인할 수 있습니다.
불필요한 연산 방지
이번 과제로 프로파일러를 사용하고 어떤것이 다른지 확인하게 되었는데, 필터 로직을 최적화하고 나서는 어떤 부분을 봐야할지 잘 모르겠더라구요.
그래서 최적화 전후의 프로파일러를 찍어서 확인 해보니 아래의 부분에서 시간이 줄어드는 것을 확인했습니다.
(이걸 측정하는 것이 맞는가는 아직도 잘 모르겠습니다 ㅋㅋ)
불필요한 렌더링 방지
이 부분은 발제코치인 준일 코치님이 QnA에서 잘 설명해주셔서 쉽게 진행했습니다!
그래도 과제를 하면서 직접 프로파일러로 메모이제이션이 유효한가? 에 대해서 확인했습니다.
많은 수의 강의 목록의 아이템들을 메모이제이션을 진행했기 때문에, 스크롤을 내려 다음페이지를 렌더링할때는 이전 페이지 요소들은 리렌더링이 되지않습니다.
해당 목록의 아이템 displayName을 SearchItem으로 설정했습니다.
SearchItem : Did not client render
Drop을 했을 때 렌더링 최적화
이 부분이 생각보다 오래걸려서 놀랬습니다. ㅋㅋ
그래도 전역상태라이브러리를 쓰지않고싶다는 생각하면서 진행했어요.
사실 문제를 해결하기위해서 어떤 도구를 쓰던 상관없지만, 학습하는 차원에서 이유를 분석하고 리액트의 네이티브 기능으로 해결하고 싶었습니다.
제가 생각하는 useCallback, useMemo, memo를 해도 drop 에서의 리렌더링최적화가 잘 안되더라구요.
과제 요구사항을 잘 읽었더라면 시간을 좀 더 아낄 수 있지않았을까 반성과 회고를 합니다. ㅠㅠ
코드 분석 내용
위와 같이 분석했었습니다.
contextAPI + useState조합으로 state와 setter가 혼재해서 사용됨
3번의 해결법이 제일 간단하기 때문에 ScheduleProvider 에서 state와 action를 분리하는하여 두개의 context프로바이더를 생성했습니다.
schedulesMap 를 수정할 때 데이터 전체를 업데이트 하는 로직
contextAPI에서 state와 action을 분리한다해도 리렌더링은 해결되지 않았습니다.
그이유는 action이 일어날 때, schedulesMap 전체가 변경되기 때문에 memo를 해두어도 각 필드의 데이터값은 다른 참조값을 가지고 있기 때문입니다.
최대한 현재 코드를 유지하면서 수정작업을 하기위해, update하는 로직에서 변경되는 필드만 변경하게끔 설정했습니다.
업데이트 할 경우에 파라메터로 들어오는 값과 이전의 값을 비교해서 동일할 경우에는 이전 상태값 (prev)을 반환하는 로직을 만들었습니다.
기술적 성장
프로파일러
프로파일러를 직접 녹화하고 측정된 값을 비교 분석해본 것은 처음이었습니다.
처음이었기에 어떤걸 봐야할지 잘 몰랐기도 하고 사실 검색도 많이 안하고 징징댔습니다.ㅋㅋㅋ
지금 보니 학습의 자세가 잘 안되어있네요. 시정하겠습니다ㅋㅋㅋㅋㅋ
친구에게 물어보기도 하고 준일코치님이 실습을 많이 진행해주셔서 프로파일러 사용법과 다양한 케이스를 학습하게 되어서 좋았습니다.
메모이제이션
프로파일러도 모르고 메모이제이션을 안하고 살고있었는데 발제와 과제덕분에 재밌는 경험했습니다.
memo, useCallback과 useMemo에 대한 개념은 알지만 실제로 유효하게 사용하고 있지는 않았어요.
취업을 한다면 메모이제이션을 효용성있게 쓰는 곳에 가보고싶다고 했었기도하구요.
그런데 그냥 그런 쪽으로 취업을 했었더라도 이 프로세스를 거치지않았으면 몰랐을 것 같습니다.
알았던 내용이지만, 프로파일러를 통해 확인했던 경험이 큰것 같스빈다.
최적화 지점
그리고 저는 준일코치님이 배포된 페이지가 정말 도움이 돠었었어요. 시작이나 마무리에서도요.
코치님이 어떤 부분이 힌트가 되냐는 질문을 했었는데 나의 무지함이 조금 엿보여서 혼자서 막 이상한 소리를 했습니다.
사실....'힌트라고 해서 만든 배포페이지가 아닌데 힌트라고 하는거시냐' 라는 것인가라고 혼자 판단( 또 판단!! 또!또!)했습니다. 그러다보니 혼자 부끄러워서 더 그랬던 것 같아요.
준일코치님이 이 글을 보시지는 않겠지만 죄송합니다. 죄송할...일은 아닌가? 아무튼 제 마음은 그래요.
이번 과제를 하면서 제일 고민했던 건 어떤 부분에 최적화를 해야하는 가? 였어요.
추가기능? 그런거 생각도 못했어요. (사실 ,생각은 했는데 못했어요. 다시하기 스터디 때 해보려구요! 저번에 rxjs 말씀해주신건 잊지않고 있습니다.)
그래서 배포된 페이지를 엄청 뜯어보기도하고, 제가 작업한뒤에도 그것을 비교 많이 했었습니다.
아참, 지금 분리된 컴포넌트에서 FormInput과 FormSelect 컴포넌트는 메모이제이션이 과한 것이라 판단하고있습니다. 수정해야지 수정해야지하면서 출근해버렸네요. 언제 고치지? 히히
코드 품질
위 회고글 포함!
학습 효과 분석
가장 큰 배움이 있었던 부분
추가 학습이 필요한 영역
실무 적용 가능성
과제 피드백
아쉬운 점이 있었다해도 발제 코치님이 다 커버 해주셨어요 ㅋㅋㅋ
정말 감사합니다.
리뷰 받고 싶은 내용
schedulesMap 최적화하는 방법은 되게 많다고 생각합니다. 코치님은 schedulesMap 최적화를 진행한다고 하면 어떤 방식으로 진행하실 것 같나요?
사실 제 방식은 모든 필드의 값들을 조회하고 있기 때문에 정말 좋은가? 라고 생각하면, 잘 모르겠습니다.
어쩌면 외부라이브러리를 설치해서 최적화가 잘되어있고 검증된 로직을 가져다 쓴다면 더 좋은 최적화가 되었을 수도 있겠죠.
이런 생각이 들면서, 경험이 많고 최적화 작업을 많이 해봤을 코치님은 이러한 작업에서 어떤 방법을 채택할까 궁금했습니다.