Skip to content

Conversation

@chen4023
Copy link

@chen4023 chen4023 commented Dec 8, 2025

과제 체크포인트 (토요일에 보완하겠습니다 ㅠㅠ)

배포 링크 : https://chen4023.github.io/front_7th_chapter3-3/

기본과제

목표 : 전역상태관리를 이용한 적절한 분리와 계층에 대한 이해를 통한 FSD 폴더 구조 적용하기

  • 전역상태관리를 사용해서 상태를 분리하고 관리하는 방법에 대한 이해
  • Context API, Jotai, Zustand 등 상태관리 라이브러리 사용하기
  • FSD(Feature-Sliced Design)에 대한 이해
  • FSD를 통한 관심사의 분리에 대한 이해
  • 단일책임과 역할이란 무엇인가?
  • 관심사를 하나만 가지고 있는가?
  • 어디에 무엇을 넣어야 하는가?

체크포인트

  • 전역상태관리를 사용해서 상태를 분리하고 관리했나요?
  • Props Drilling을 최소화했나요?
  • shared 공통 컴포넌트를 분리했나요?
  • shared 공통 로직을 분리했나요?
  • entities를 중심으로 type을 정의하고 model을 분리했나요?
  • entities를 중심으로 ui를 분리했나요?
  • entities를 중심으로 api를 분리했나요?
  • feature를 중심으로 사용자행동(이벤트 처리)를 분리했나요?
  • feature를 중심으로 ui를 분리했나요?
  • feature를 중심으로 api를 분리했나요?
  • widget을 중심으로 데이터를 재사용가능한 형태로 분리했나요?

심화과제

목표: 서버상태관리 도구인 TanstackQuery를 이용하여 비동기코드를 선언적인 함수형 프로그래밍으로 작성하기

  • TanstackQuery의 사용법에 대한 이해
  • TanstackQuery를 이용한 비동기 코드 작성에 대한 이해
  • 비동기 코드를 선언적인 함수형 프로그래밍으로 작성하는 방법에 대한 이해

체크포인트

  • 모든 API 호출이 TanStack Query의 useQuery와 useMutation으로 대체되었는가?
  • 쿼리 키가 적절히 설정되었는가?
  • fetch와 useState가 아닌 선언적인 함수형 프로그래밍이 적절히 적용되었는가?
  • 캐싱과 리프레시 전략이 올바르게 구현되었는가?
  • 낙관적인 업데이트가 적용되었는가?
  • 에러 핸들링이 적절히 구현되었는가?
  • 서버 상태와 클라이언트 상태가 명확히 분리되었는가?
  • 코드가 간결하고 유지보수가 용이한 구조로 작성되었는가?
  • TanStack Query의 Devtools가 정상적으로 작동하는가?

최종과제

  • 폴더구조와 나의 멘탈모델이 일치하나요?
  • 다른 사람이 봐도 이해하기 쉬운 구조인가요?

과제 셀프회고

이번 과제를 통해 이전에 비해 새롭게 알게 된 점이 있다면 적어주세요.

fsd에 대한 개념은 알고있었지만, 실제 적용해 본 경험은 없었습니다.
사실 이전까지 fsd는 폴더구조를 중점으로 UI나 관심사를 분리하는 관점으로만 생각했다가, 의존성 방향을 단방향으로 맞춰야 한다는 것은 처음 알게 되었습니다.

상위 레이어가 하위 레이어를 참조하는 규칙을 지키게 되면, 자연스럽게 하나의 도메인을 기반으로 사용자의 액션이나 흐름이 읽혀질 수 있다는 점을 깨달을 수 있었습니다. 그치만 하나의 도메인에만 속해있는 것이 아닌 다른 도메인과 집합형태로 사용되는 경우는 아직까지 경계가 모호한 것 같다는 생각이 들었습니다.
ex. PostTable -> product + user 와 같은 집합.

본인이 과제를 하면서 가장 애쓰려고 노력했던 부분은 무엇인가요?

건강 이슈로 이번주는 시간이 없어서 아직 많은 고민을 해보지 못했습니다 ㅠ

아직은 막연하다거나 더 고민이 필요한 부분을 적어주세요.

  • Widget vs Feature 경계: PostsTable을 widget으로 분류했지만, 더 복잡해지면 feature로 승격해야 할지 고민됩니다.

이번에 배운 내용 중을 통해 앞으로 개발에 어떻게 적용해보고 싶은지 적어주세요.

챕터 셀프회고

클린코드와 아키테쳑 챕터 함께 하느라 고생 많으셨습니다!
지난 3주간의 여정을 돌이켜 볼 수 있도록 준비해보았습니다.
아래에 적힌 질문들은 추억(?)을 회상할 수 있도록 도와주려고 만든 질문이며, 꼭 질문에 대한 대답이 아니어도 좋으니 내가 느꼈던 인사이트들을 자유롭게 적어주세요.

클린코드: 읽기 좋고 유지보수하기 좋은 코드 만들기

  • 더티코드를 접했을 때 어떤 기분이었나요? ^^; 클린코드의 중요성, 읽기 좋은 코드란 무엇인지, 유지보수하기 쉬운 코드란 무엇인지에 대한 생각을 공유해주세요

결합도 낮추기: 디자인 패턴, 순수함수, 컴포넌트 분리, 전역상태 관리

  • 거대한 단일 컴포넌트를 봤을때의 느낌! 처음엔 막막했던 상태관리, 디자인 패턴이라는 말이 어렵게만 느껴졌던 시절, 순수함수로 분리하면서 "아하!"했던 순간, 컴포넌트가 독립적이 되어가는 과정에서의 깨달음을 들려주세요

응집도 높이기: 서버상태관리, 폴더 구조

  • "이 코드는 대체 어디에 둬야 하지?"라고 고민했던 시간, FSD를 적용해보면서의 느낌, 나만의 구조를 만들어가는 과정, TanStack Query로 서버 상태를 분리하면서 느낀 해방감(?)등을 공유해주세요

리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문

  • Widget과 Feature의 경계: PostsTable처럼 entities와 features를 조합하는 컴포넌트를 widget으로 분류했는데, 이 기준이 적절한지 피드백 부탁드립니다.

  • Zustand Store 분리 단위: 현재 searchStore, filterStore, paginationStore, postDialogStore, userModalStore로 나눴는데, 너무 세분화된 건 아닌지 궁금합니다. 혹은 더 합치거나 나눠야 할 부분이 있을까요?

  • TanStack Query 키 설계: 계층적 키 구조가 실무에서도 일반적으로 사용되는 패턴인지, 혹시 더 나은 방법이 있다면 알려주시면 감사하겠습니다.

@chen4023 chen4023 changed the title chore: update deps and lockfile [6팀 현채은] Chapter 3-3 기능 중심 아키텍처와 프로젝트 폴더 구조 Dec 8, 2025
- @tanstack/react-query, @tanstack/react-query-devtools 추가
- axios dependencies로 이동
- tsconfig.app.json에 @/* path alias 설정
- vite.config.ts에 resolve alias 설정
- shared/api: axios 인스턴스 설정
- shared/ui: Button, Card, Dialog, Table, Select, Input, Textarea 분리
- shared/ui/layout: Header, Footer 분리
- shared/lib: highlightText 유틸리티 분리
- entities/post: types, dto, keys, api, hooks 분리
- entities/comment: types, dto, keys, api, hooks 분리
- entities/user: types, dto, keys, api, hooks 분리
- entities/tag: types, dto, keys, api, hooks 분리
- Query keys factory pattern 적용
- Request/Response DTO 분리
- features/post: add, edit, delete mutations
- features/comment: add, edit, delete, like mutations
- AddPostDialog, EditPostDialog 분리
- AddCommentDialog, EditCommentDialog 분리
- 낙관적 업데이트 적용
- widgets/posts-table: PostsTable 컴포넌트
- widgets/post-detail-dialog: PostDetailDialog, CommentsList
- widgets/user-modal: UserModal 컴포넌트
- pages/posts-manager: PostsManagerPage 재구성
- app/providers: QueryProvider 설정
- app/App.tsx: Provider 연결
- 기존 components, pages, App.tsx, index.tsx 삭제
- .github/workflows/deploy.yml 추가
- vite.config.ts에 production base path 설정
- production 환경에서 dummyjson.com 직접 호출
- Zustand store 추가 (usePostsFilterStore, usePostDialogStore, useUserModalStore)
- features/post/search: SearchInput 분리
- features/post/filter: TagFilter, SortFilter 분리
- features/post/pagination: Pagination 분리
- PostsManagerPage Props Drilling 제거 (7개 → 1개)
- widgets에서 직접 store 접근으로 결합도 감소
- features/post/search/model/store.ts: 검색 상태
- features/post/filter/model/store.ts: 필터 상태
- features/post/pagination/model/store.ts: 페이지네이션 상태
- features/post/dialog/model/store.ts: 다이얼로그 상태
- features/user/modal/model/store.ts: 사용자 모달 상태
- 기존 통합 store.ts 삭제
- 각 feature가 자체 상태를 관리하도록 응집도 향상
- Create features/post/list/api/usePostsData.ts
  - Encapsulate posts query selection logic (posts, tagPosts, searchPosts)
  - Move sorting logic from page to hook
  - Return posts, total, isLoading

- Simplify PostsManagerPage.tsx (124 lines → 63 lines)
  - Remove direct query calls and sorting logic
  - Use single usePostsData() hook for data

- Move PostsManagerPage.tsx from ui/ folder to root

Benefits:
- Single responsibility: Page handles layout, hook handles data
- Reusability: usePostsData can be used in other pages
- Testability: Hook can be tested independently
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant