과제 체크포인트
배포링크
https://suhyeon57.github.io/front_6th_chapter2-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가 정상적으로 작동하는가?
최종과제
- 폴더구조와 나의 멘탈모데일이 일치하나요?
- 다른 사람이 봐도 이해하기 쉬운 구조인가요?
과제 셀프회고
- search-filter-bar -> 내가 이해한 바로는 검색 필터 바는 재사용 가능성이 있고, 도메인 관련이 없기 때문에 widget으로 구현했습니다. -> types를 model 슬라이스로 분리
- pagination -> 어디서든 재사용 가능하고, 비지니스 로직을 가지고 있지 않다고 생각해서 shared로 구현했습니다.
- button ui -> 어디서든 재사용 가능, shared로 구현 -> interface를 types로 빼지 않음 why? .. button ui에 의존적이기 때문, 재사용이 될 가능성이 없기 때문
- 댓글 좋아요 기능 분리 회고 처음에는 댓글 좋아요 기능 전체를 features 내 api, model로만 구분해서 관리하려고 했습니다. 하지만 도메인과 기능의 역할 분리를 고민한 결과, API 호출은 댓글이라는 핵심 도메인에 속하는 행위로 보고 entities에 분리하는 것이 더 적절하다고 판단했습니다.
API 호출 (likeCommentApi)는 댓글 도메인의 핵심 행위로, 서버에 좋아요 수를 1 증가시켜 달라는 요청을 담당합니다. → 도메인 로직의 순수한 행위 함수로서 entities/comment/api에 위치
export const likeCommentApi = async (id: string, likes: number) => {
try {
const response = await fetch(`/api/comments/${id}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
likes: likes + 1,
}),
})
return await response.json()
} catch (error) {
console.error('댓글 좋아요 오류:', error)
}
}
반면, 상태 업데이트 및 UI와의 연동, 사용자 인터랙션 처리 등은 기능 단위의 구체적 구현이므로 features/comment/like/model에 두었습니다. → API 호출 결과를 받아 댓글 좋아요 수 상태를 갱신하고, 상태 관리를 포함하는 영역 이렇게 역할을 분리하니, 도메인과 기능 사이의 책임이 명확해져 코드 유지보수성과 확장성이 향상되었습니다.
// features/comment/like/model/useLikeComment.ts
import { likeCommentApi } from '@/entities/comment/api/likeComment'
import { CommentsByPost } from '@/entities/comment/model/types'
export const useLikeComment = (
comments: CommentsByPost,
setComments: React.Dispatch<React.SetStateAction<CommentsByPost>>
) => {
return async (id: string, postId: string) => {
try {
const comment = comments[postId].find((c) => c.id === id)
if (!comment) return
const data = await likeCommentApi(id, comment.likes)
setComments((prev) => ({
...prev,
[postId]: prev[postId].map((c) =>
c.id === data.id ? { ...c, likes: c.likes + 1 } : c
),
}))
} catch (error) {
console.error('댓글 좋아요 오류:', error)
}
}
}
==> 관련 comment / post 전부 이런식으로 기능 분리를 완료했습니다.
children처리 / type처리에 대해..
이번 과제를 통해 이전에 비해 새롭게 알게 된 점이 있다면 적어주세요.
본인이 과제를 하면서 가장 애쓰려고 노력했던 부분은 무엇인가요?
지난 주차 과제를 하면서 AI 활용에 대해 많은 고민을 했습니다.
이번 주차에는 코치님의 피드백을 반영해 코드 로직을 직접 분리하며 진행했습니다. 그 과정에서 *“아, 이렇게 구조를 잡는 게 맞구나”*라는 확신을 많이 얻었고, 이전 주차에서 잘못된 방식으로 진행했던 부분이 아쉽게 느껴졌습니다.
특히 기능을 분리할 때는 API, UI, Model 등 하나의 도메인 단위로 묶는 것에 집중했습니다. 아직 features와 entities의 경계가 명확하지는 않지만,
상태를 변화시키는 로직 → features 상태 관리와 관계없는 도메인 핵심 행위 → entities 라는 기준을 세워 구현을 진행했습니다.
아직은 막연하다거나 더 고민이 필요한 부분을 적어주세요.
이번에 배운 내용 중을 통해 앞으로 개발에 어떻게 적용해보고 싶은지 적어주세요.
챕터 셀프회고
클린코드와 아키테쳑 챕터 함께 하느라 고생 많으셨습니다! 지난 3주간의 여정을 돌이켜 볼 수 있도록 준비해보았습니다. 아래에 적힌 질문들은 추억(?)을 회상할 수 있도록 도와주려고 만든 질문이며, 꼭 질문에 대한 대답이 아니어도 좋으니 내가 느꼈던 인사이트들을 자유롭게 적어주세요.
클린코드: 읽기 좋고 유지보수하기 좋은 코드 만들기
- 더티코드를 접했을 때 어떤 기분이었나요? ^^; 클린코드의 중요성, 읽기 좋은 코드란 무엇인지, 유지보수하기 쉬운 코드란 무엇인지에 대한 생각을 공유해주세요
결합도 낮추기: 디자인 패턴, 순수함수, 컴포넌트 분리, 전역상태 관리
- 거대한 단일 컴포넌트를 봤을때의 느낌! 처음엔 막막했던 상태관리, 디자인 패턴이라는 말이 어렵게만 느껴졌던 시절, 순수함수로 분리하면서 "아하!"했던 순간, 컴포넌트가 독립적이 되어가는 과정에서의 깨달음을 들려주세요
응집도 높이기: 서버상태관리, 폴더 구조
- "이 코드는 대체 어디에 둬야 하지?"라고 고민했던 시간, FSD를 적용해보면서의 느낌, 나만의 구조를 만들어가는 과정, TanStack Query로 서버 상태를 분리하면서 느낀 해방감(?)등을 공유해주세요
리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문
1. entities/comment/model/types.ts의 분리 기준
과제 피드백
안녕하세요 수현님! 6주차 과제 잘 진행해주셨네요 ㅎㅎ 다만 심화과제까지는 시간이 부족해서 진행하지 못한 것 같군요 ㅠㅠ
entities/comment/model/types.ts의 분리 기준
사람마다 기준이 다르겠지만... 저는 분리하지 않아도 된다고 생각해요! 해당 type은 react에 의존적이지도 않고 어디서든 쓰일 수 있기 때문에 일단 보존하면 어떨까요!?
분리하고 싶은 이유가 있는지가 궁금하네요!
구체적인 내용에 대해 이야기를 나눠보고 싶다면 문의채널에 한 번 더 남겨주세요! 지금은 맥락이 많이 없어서 답변드릴 수 있는 내용이 많지 않네요 ㅠㅠ
고생하셨습니다!!