-
Notifications
You must be signed in to change notification settings - Fork 0
리팩토링 필요성에 대한 회의
Ji Ho Jun edited this page Feb 19, 2026
·
1 revision
- 무한 스크롤 로직 통일
- 이미지 Lazy Loading 구현 등
- 리액트 컴포넌트의 내부 함수와 useEffect를 별도의 커스텀 훅으로 분리 => React Test Library 적극 활용, 컴포넌트 대상 혹은 커스텀 훅 대상으로 진행하는게 좋다고 생각합니다
- 커스텀 훅 같은 경우 의존성들이 복잡하게 엮여있기 때문에 의도한대로 구현되고 작동하고 있는지 검증하는 과정이 필요하다고 생각합니다.
https://testing-library.com/docs/react-testing-library/setup/?ref=blog.viewinterhr.com#custom-render
- Feature 단위로 재구조화, FSD
https://joong-sunny.github.io/react/react7/
저는 포트폴리오에서 사용자 경험(UX)을 가장 강조하고 싶어요. 그 기반 위에 코드 가독성과 성능 최적화를 부차적으로 고려하고 있습니다.
사용자가 서비스를 이용할 때 버벅임 없이 자연스럽게 흐름을 따라갈 수 있도록하고, 단순한 편의성을 넘어서 서비스를 사용하는 과정 자체가 즐겁게 느껴지도록 만드는 게 목표예요.
- 모든 API 호출을 Tanstack Query로 마이그레이션
- Prefetching으로 사용자 경험 개선
- API 호출 횟수 감소
- 코드량 감소 (try-catch 제거)
- 관심사 분리 명확: 기능(feature) 단위로 코드 격리
- 재사용성 향상: entities가 여러 features에서 사용
- 확장성: 새 기능 추가 시 영향 범위 최소화
- https://velog.io/@kksltv123/React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9D%98-%ED%8F%B4%EB%8D%94-%EA%B5%AC%EC%A1%B0-FSD
- 무한 스크롤 최적화: Intersection Observer API로 개선 + 성능 비교
- 낙관적 업데이트 (Optimistic Update): 좋아요/북마크 기능에 적용하여 즉각적인 피드백
- 이미지 최적화: Lazy Loading + IntersectionObserver 조합
- 리렌더링 최적화: React.memo + useMemo/useCallback 적용
- 번들 사이즈 최적화: React.lazy로 코드 스플리팅
1-1. 코드로부터의 최적화
- 원칙: 프로파일링 → 타겟팅 최적화(무작정 useMemo/useCallback 지양).
- 불필요 재렌더: props 참조 안정화, React.memo/키 안정화, 컨텍스트 범위 최소화.
- 무거운 리스트: 가상 스크롤(react-window 등), 무한 스크롤 로직 통일.
- 콜백/값 메모: “참조 동일성”이 실제 비용 절감일 때만 useMemo/useCallback.
1-2. 실제 서비스에서의 최적화
- 측정: Web Vitals(LCP/INP/CLS) 대시보드, Lighthouse 모빌 기준.
- 이미지: lazy, 크기 명시, srcset/sizes, 캐시 헤더.
- 번들: 코드 스플리팅/지연 로딩, 중복 의존 제거.
- 네트워크: prefetch/prerender 전략, CDN 캐싱 확인.
- 코드는 코드로 설명 — 주석에 어떤 것만을 작성할지 논의가 필요.
- 목표: any 제거로 타입 안전성·리팩토링 내성 강화.
- tsconfig: noImplicitAny, strict 활성화(점진적 디렉터리별 허용 가능).
- 유틸/훅에 제네릭 도입, 넓은 타입은 unknown + 내로잉으로 대체.
- 목표: console.error 위주 처리 → 중앙집중 에러 흐름으로 전환.
- 전역: ErrorBoundary + 전역 에러 버스(예: emitError(err, context)).
-
우선순위 정해서 같이 작업해나가는 방식으로 진행
-
리팩토링용 브랜치를 하나 만들어서 에픽 -> 이슈 + task -> dev 브랜치로 머지
브랜치 관리를 전략적으로 하지 못했던 부분이 아쉬웠음
- 팀원끼리 소통을 활발히 하며 집중력 있게 진행해야하는 작업들과 그렇지 않은 작업들을 구분
- 위 기준으로 학기 중 진행할 작업과 방학 중 진행할 작업으로 분류 (방학 중이 조금 더 밀도 있게 진행할 수 있다고 판단)
- 가시적으로 보기에는 우선순위라고 보이기는 함
- 구현량이 이미 있어서 바꿔도 복잡한건 그대로인데 지금 시점에서 굳이 개선을 해야할까…?
- 퍼포먼스를 올리는게 우선순위라고 생각
- 폴더구조 전체를 바꾸기보다 룰(프로젝트 상황에 맞게끔)을 정해서 필요한 부분을 바꾸는건 어떨지
- 일관성없는 애들을 가다듬자
- 코드에서 useEffect 의존성 복잡도 증가 → 불필요한 리렌더링을 확인하고 싶었다 → 페이지 코드를 훅 단위로 분리 → 테스트 코드로 훅 단위 동작 검사
- 에러 핸들링도 충분히 해결될 듯함
- 테스트가 필요함, 실제로 어느정도 개선이 되는지 눈에 지표로 보이면 좋겠음
- 코드가 줄어들고 캐싱으로 인한 사용자 경험의 개선(?)이 도입의 이유가 되지않을까
- 엣지 케이스(ex. 에러처리)에 대한 표준화
- 성능 최적화와 관련없는걸 먼저 해결하는게 어떨까
- 주석은 어떤 기준으로 써야하는가? 라는 의문이 들었으나…. 주석 제거하는걸로
- 서비스 완성도를 높이기 위한 과정이지 않을까~
학기 중이기 때문에 각자할 수 있는 부분과 비교적 간단한 리팩토링을 1차 개선으로 한다. 그리고 비교적 복잡한 작업이나 논의가 많이 필요한 작업들은 2차 개선으로 정한다.
- 문서화 → 리드미 먼저?
- 위키를 통해서 정리
- PR을 근거 기반으로 자세히 쓰면 좋곘다.
- 폴더 구조 개선
- 큰 단위 개선이 아닌 룰을 정해 작지만 유의미한 복잡도 개선
- any 타입 제거 → 타입안정성 강화
- 불필요한 주석 제거 (코드에 대한 설명)
- 이것도 룰이 필요함
- 없애자!
- Tanstack Query 도입
- 에러 핸들링 불충분
- 낙관적 업데이트 (Optimistic Update): 좋아요/북마크 기능에 적용하여 즉각적인 피드백
-
성능 최적화
- 이미지 최적화: Lazy Loading + IntersectionObserver 조합
- 무한 스크롤 최적화: Intersection Observer API로 개선 + 성능 비교
- 리렌더링 최적화: React.memo + useMemo/useCallback 적용
- 번들 사이즈 최적화: React.lazy로 코드 스플리팅
- 테스트 코드 (유닛 테스트 기준) 작성
- 1차 서비스 운영 기간인 26년 02월 안으로 마무리!
- 전체 팀 깃허브 https://github.com/THIP-TextHip
- Web 저장소 https://github.com/THIP-TextHip/THIP-Web