-
Notifications
You must be signed in to change notification settings - Fork 46
[7팀 윤지훈] Chapter 3-3 기능 중심 아키텍처와 프로젝트 폴더 구조 #35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
Jihoon-Yoon96
wants to merge
52
commits into
hanghae-plus:main
Choose a base branch
from
Jihoon-Yoon96:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
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.
과제 체크포인트
링크 : https://jihoon-yoon96.github.io/front_7th_chapter3-3/#/?limit=10&sortOrder=asc
기본과제
목표 : 전역상태관리를 이용한 적절한 분리와 계층에 대한 이해를 통한 FSD 폴더 구조 적용하기
체크포인트
심화과제
목표: 서버상태관리 도구인 TanstackQuery를 이용하여 비동기코드를 선언적인 함수형 프로그래밍으로 작성하기
체크포인트
최종과제
과제 셀프회고
이번 과제를 통해 이전에 비해 새롭게 알게 된 점이 있다면 적어주세요.
->구조 설계 : 편연함과 익숙함에 지나쳐왔던 과거를 돌아보며
FSD의 단점인 높은 자유도와 모호함은, 팀원 간의 의견을 조율하는 장치를 통해 걷어내고 장점만 취할 수 있기 때문입니다.
이번 과제에서 docs/architecture.md와 같은 레이어 정의 가이드 문서를 작성해 본 것이 그 시작이었습니다. 초반에는 레이어의 경계에 있는 애매한 기능들을 정의하는 것이 어렵고 시간도 걸리지만, 한 번 기준이 확립되고 나면 팀원 모두의 이해도가 통일되어 이후에는 불필요한 고민 시간을 획기적으로 단축할 수 있다는 것을 알게 되었습니다. 결과적으로 FSD가 모든 상황의 정답은 아닐지라도, 우리가 개발하는 서비스의 핵심 기능(Feature)들을 응집도 있게 모아두는 방식이 장기적인 유지보수와 협업 관점에서는 훨씬 효율적이고 편리한 구조라는 확신을 갖게 되었습니다.
본인이 과제를 하면서 가장 애쓰려고 노력했던 부분은 무엇인가요?
이 코드가 어느 레이어에 속해야 하는가?를 판단하는 데 가장 많은 공을 들였습니다. 특히 entities와 features의 경계를 나누는 것이 어려웠는데, 다양한 FSD관련 문서들을 참고해가면서 AI와 함께 나름의 레이어 정의 문서를 작성해보고, 이를 토대로 분리작업을 해봤습니다.
아래는 문서 내용 중 일부인데, 아래 내용을 그대로 따르기 보다는 개발 과정에서 그때그때 필요하다 "이게 맞다" 싶은 방향대로 작업했습니다.
특히, "단방향 의존성 규칙"을 지키기 위해 리팩토링 순서도 [shared -> entities -> features -> widgets] 순으로 작업한다 정의내렸지만, 작업 과정에서 중간중간 수정이 필요하거나 다음 작업에 필요하다 생각되는 것들은 우선적으로 작업하기도 했습니다.
1.
sharedui/: 재사용 가능한 UI 컴포넌트 (e.g.,Button,Input,Modal)api/: API 클라이언트 인스턴스, 공통 요청/응답 처리 함수 등lib/: 순수 헬퍼 함수, 유틸리티 (e.g.,formatDate,cn)assets/: 이미지, 폰트 등 정적 자원2.
entitiespost,user,commentmodel/: 데이터 타입(*.types.ts), 상태 관리 로직(store), 정규화 로직 등ui/: 해당 데이터를 표현하는 순수 UI 컴포넌트 (e.g.,PostCard,UserAvatar)api/: 해당 데이터를 다루는 API 함수 (e.g.,getPostById,updateUser)shared레이어만 참조할 수 있습니다.3.
featuressort-posts,add-to-cart,authenticate-userui/: 기능을 수행하기 위한 UI 컴포넌트 (e.g.,SortPostsButton,AddToCartForm)model/: 기능과 관련된 상태 관리 로직api/: 기능을 수행하기 위한 API 연동 코드shared,entities레이어를 참조할 수 있습니다.4.
widgetsentities와features를 조합하여 만드는, 독립적으로 작동하는 대규모 UI 블록입니다. 페이지의 특정 구역을 담당하며, 여러 페이지에서 재사용될 수 있습니다.Header,Footer,PostsList,Sidebarshared,entities,features레이어를 참조할 수 있습니다.5.
pageswidgets와features를 조립하여 최종 화면을 만듭니다.PostsManagerPage,HomePage,UserProfilePageshared,entities,features,widgets레이어를 참조할 수 있습니다.6.
appproviders/: 라우터, 전역 상태 관리자(Store Provider), 테마 등 앱 전체를 감싸는 컴포넌트styles/: 전역 CSS, reset.css 등main.tsx/App.tsx: 애플리케이션의 진입점추가로,
features 레이어를 분리하는 과정에서 수많은 기능이 평면적으로 나열되어 가독성이 떨어지는 문제를 발견했습니다(ex. 게시글 추가를 수정하려면 /post/api도 가고 /post/ui도 가야하고..). 이를 해결하기 위해 /features/{도메인}/{세부기능}/{세그먼트} (예: features/comment/add/ui) 형태로 뎁스를 한 단계 더 추가하여 구조화했습니다. 덕분에 CRUD 등 연관된 기능들이 흩어지지 않고 응집도 있게 관리되어, 파일 탐색과 유지보수가 훨씬 수월해졌습니다.
아직은 막연하다거나 더 고민이 필요한 부분을 적어주세요.
FSD가 대규모 프로젝트에는 유용해 보이지만,
작은 기능 하나를 추가할 때도 여러 폴더를 오가며 파일을 생성해야 하는 점이 오버헤드처럼 느껴지기도 했습니다.
또한, shared/ui의 컴포넌트들이 비즈니스 로직에 전혀 의존하지 않도록 완벽하게 순수하게 유지하는 것이 생각보다 까다로웠습니다.
(공통 소스로 분리하고 싶은 것들이 정말 많았지만, 고민의 과정이 너무 길어져 시간도 부족했고.. 아직 FSD구조에 적응 중이라 어느 레이어에 각각의 기능들을 배치시켜야할지 감이 안와 진행하지 못했습니다.. (ex. 팝업 공통화 너무 하고 싶었습니다 ㅠ..))
프로젝트 규모에 따라 FSD의 규칙을 얼마나 엄격하게 적용해야 할지, 혹은 유연하게 가져갈지에 대한 고민이 더 필요할 것 같습니다.
이번에 배운 내용 중을 통해 앞으로 개발에 어떻게 적용해보고 싶은지 적어주세요.
챕터 셀프회고
클린코드: 읽기 좋고 유지보수하기 좋은 코드 만들기
결합도 낮추기: 디자인 패턴, 순수함수, 컴포넌트 분리, 전역상태 관리
응집도 높이기: 서버상태관리, 폴더 구조
리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문
낙관적 업데이트를 적용해보긴 했는데, 제대로 한게 맞나 싶긴 하네요.. 낙관적 업데이트 프로세스대로 UI 선 반영하고 목록API 다시 받아와서 그리는 로직을 구현했습니다. 근데 확인한 바로는 CRUD를 해도 API 리스폰스에는 반영되지 않는 문제가 있어서 화면 상으로는 제대로 반영되지 않은 것 처럼 보이고 있습니다..! (그나마 local에서 실행하면 깜빡거리기는 함..) 리스폰스가 정상적으로 반환된다는 전제 하에, 이렇게 처리하는게 낙관적 업데이트가 맞는지 궁금합니다!
시간이 없어 직접 구현하진 못했지만, 팝업 호출부를 공통화하여 글로벌하게 관리하고 싶다는 생각을 했습니다. 이와 관련하여 막연하게 계획한 내용에 대해 피대븍 주시면 감사하겠습니다..!
(두서없이 적어 이해하기 힘드실 수도 있지만.. 최대한 자세히 적어보겠습니다..!)
이런 식으로 특정 컴포넌트에서 useModals의 상태값이 변경됨.
--> 진짜 딱 여기까지 밖에 구상이 안되고.. 이거를 FSD로 쪼갠다면 어떻게 해야할지 감이 잘 안오더라구요..! 두서없이 적었지만 이해하신대로 피드백 주시면 감사하겠습니다!!