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.
작업 관련 링크
과제를 하며
느낀 점 및 배운 점
React.memo와useMemo를 단순히 느릴 것 같으면 쓰는 도구가 아니라, 컴포넌트의 렌더링 비용과 props 변경 빈도를 함께 따져보고 적용해야 한다는 것을 체감했습니다. 무분별하게 사용하면 오히려 오버헤드가 될 수 있다는 점도 함께 고려하게 되었습니다.Set으로 O(1)에 조회하는 식으로, 작은 선택들이 성능에 미치는 영향을 직접 고민해볼 수 있었습니다.zustand persist를 도입하면서 기본 어댑터로는 모든 채팅 데이터가 하나의 키에 통째로 직렬화되는 구조가 부담스럽게 느껴져, 채팅방 ID별로 스토리지 키를 분리하는 커스텀 어댑터를 구현했습니다. 데이터 규모가 커질수록 저장,복원 비용이 선형적으로 증가하는 기본 방식의 한계를 직접 고민해볼 수 있었고, 스토리지 설계도 성능의 일부라는 걸 느꼈습니다.구현한 기능 및 고려사항
1. 스플래시
/) 경로에 스플래시 페이지를 구현했습니다.onUpdate콜백에서 x 좌표를 추적해 비행기가 화면 밖으로 벗어나는 시점에/chat으로 자동 이동하도록 구현했습니다.useRef(hasNavigated)로 애니메이션 진행 중navigate가 중복 호출되는 것을 방지했습니다.2. 채팅 리스트
/chat/:id)으로 동적 라우팅됩니다.3. 채팅방
3주차 과제에 구현하지 않은 부분 위주로 기술합니다.
FileReader로 Data URL로 변환 후 이미지 메시지로 전송됩니다. 이미지 버블도 텍스트 말풍선과 동일한cornerClass로직을 공유하여, 시간 그룹의 첫 메시지 여부에 따라 말풍선 꼭짓점이 동일하게 처리됩니다.Zustand persist로 새로고침 후에도 유지됩니다. 기본 어댑터 대신 채팅방 ID별로 localStorage 키를 분리하는 커스텀 스토리지 어댑터를 구현해, 전체 상태를 단일 키에 직렬화하는 방식의 비효율을 개선했습니다.friendUserId를friendUserIds배열로 변경하고,perspective를 문자열 타입에서 실제 사용자 ID로 변경했습니다. 메시지 그룹핑 로직도type기준에서userId기준으로 수정해 단체방에서도 동일하게 동작하도록 했습니다.4. 연락처
/profile)로 이동합니다.5. 프로필
Zustand persist로 새로고침 후에도 유지됩니다.6. 설정
7. 공통
React.memo를 활용해 불필요한 리렌더링을 방지했습니다.Message,ProfileImage,ChatListItem,ContactListItem,TextField,ChatTime,MessageDate,ToggleTap총 8개 컴포넌트에 적용했습니다.이미지 파일이 아닌 색상과 이름 첫 글자를 기반으로 렌더링하는 방식으로 직접 구현했습니다.
PublicLayout을 유지한 채로 404 페이지를 렌더링했습니다.react-router-dom의
path: "*"catch-all 라우트를 활용했습니다.피드백 반영 사항
vite-plugin-svgr의svgrOptions: { dimensions: false }설정을 추가해, 사용처에서 className으로 크기를 자유롭게 지정할 수 있도록 했습니다.Review Questions
1. React Router의 동적 라우팅(Dynamic Routing)이란 무엇이며, 언제 사용하나요?
개념
핵심 장점
예시 코드
라우트 설정
실제 컴포넌트
사용
/post/1,/product/2)/users/:id,/orders/:orderId)2. 네트워크 속도가 느린 환경에서 사용자 경험을 개선하기 위해 사용할 수 있는 UI/UX 디자인 전략과 기술적 최적화 방법은 무엇인가요?
물리적 속도를 제어할 수 없는 환경에서 체감 대기 시간을 줄여 심리적 안정감을 제공하는 방법이 있음
리소스 크기를 줄이고 로딩 우선순위를 전략적으로 배분하는 방식이 있음
React.lazy와Suspense를 활용React Query등을 사용해 이전 데이터를 메모리에 저장함WebP,AVIF등 고효율 포맷을 도입함srcset을 사용하여 디바이스 해상도에 최적화된 리소스만 전송함Gzip또는Brotli압축을 적용함3. React에서 useState와 useReducer를 활용한 지역 상태 관리와 Context API 및 전역 상태 관리 라이브러리의 차이점을 설명하세요.
특정 컴포넌트 내부에서만 유효한 상태를 관리하며, 부모-자식 간에는 Props로 데이터를 전달함
useState
가장 기본적인 상태 관리 훅으로, 컴포넌트 내에서 독립적인 상태 값을 가질 때 사용
[상태값, 업데이트 함수]형태의 배열을 반환하며, 비동기적으로 상태를 업데이트함useReducer
상태 업데이트 로직을 컴포넌트 외부로 분리하여, 여러 가지 분기에 따른 복잡한 상태 변화를 처리할 때 사용
dispatch를 통해action을 발생시키면reducer함수가 새로운 상태를 반환하는 구조임여러 컴포넌트가 공유해야 하는 데이터를 관리하며, Props Drilling 문제를 해결함
Context API
종속성 주입(Dependency Injection) 도구에 가까우며, 단계별 Props 전달 없이 데이터를 하위 트리로 쏴주는 방식임
useContext로 꺼내 씀전역 상태 관리 라이브러리
외부 스토어에 상태를 저장하고, 필요한 컴포넌트만 정밀하게 상태를 구독하여 성능과 로직을 모두 잡는 방식임
Zustand
Redux Toolkit
Recoil
Atom(상태 단위)과Selector(파생 상태) 기반임Jotai