[Client] 성능개선 리팩터링 - LeftSideBar 렌더링 리팩터링 #317
Merged
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.
이슈와 연결하기
Issue Number: #303
무엇이 추가 되었나요?
햄버거 클릭과 메뉴 호버 시 불필요한 렌더링이 너무 많았습니다(로고, 호버링이 되지 않은 메뉴 등...). 따라서 이를 해결하고자 리팩터링을 진행했습니다.
기존 코드에는
isMenuOpen
과hoverTarget
이 분리되지 않은 채로 LeftNav 에 존재했습니다. 따라서 호버링과 햄버거 클릭 시마다 상태가 업데이트 되어 컴포넌트가 전부 리렌더링이 발생했습니다. LeftSideBar의 경우 다행히 구조가 많이 복잡한 편은 아니어서, 컴포넌트의 구조를 재구성 하는 것만으로도 해결이 가능했습니다.이를 위해 햄버거 메뉴를 컴포넌트로 분리했습니다. 이렇게 로고의 리렌더링은 막을 수 있었습니다.
또한 개별 메뉴의 리렌더링을 막기 위해 각 메뉴를 LeftNavMenu라는 컴포넌트로 만들었고, 여기에서
hoverTraget
을 관리하도록 했습니다. LeftNavMenu는 el, i를 props로 받으며,hoverTarget
이 전달받은 el과 같다면LeftNavIcons
는 i를 props로 전달받아 렌더링합니다.LeftNavIcons
는 props로 받은 아이콘들의 배열icons
의 i번째 인덱스의 아이콘을 반환하는 컴포넌트입니다.컴포넌트의 스타일을 담당하는 로직을 style.ts로 분리했습니다. 기존엔 각 컴포넌트마다 스타일이 작성되어 있었는데, 파일 하나하나의 길이가 너무 길고, 가독성이 굉장히 떨어졌습니다. 따라서 style.ts에서 스타일 로직을 담당하도록 했으며, 각 스타일 위에 스타일을 사용하는 컴포넌트를 주석으로 작성했습니다. 요거보다 더 좋은 방식이 생각나시면 알려주세요!
기타 정보
불필요한 리렌더링을 방지하는 작업을 하면서, 코드의 가독성과 분리에 신경을 많이 썼습니다. 특히 하나의 컴포넌트는 이상적으로 하나의 일만 수행해야 한다는 단일 책임 원칙을 지키려고 노력했습니다. (참고: https://react.dev/learn/thinking-in-react)