API 관련 폴더 구조 논의 #16
bbearcookie
started this conversation in
프론트
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
개요
최근에 논의했던 query-key-factory의 아이디어를 바탕으로 API에 관한 소스 코드를 어떻게 구조화할지 정리해봤어요! (#2 #4)
queryKeys
라는 디렉토리에 해당 내용을 정리했어요.queryKeys
디렉토리에서 처리가 될 것이기 때문에 커스텀 훅을 만드는 경우가 잦은 현상은 아닐 것 같지만, 그래도 정말 공통화가 필요한 부분에만 유연하게 대응할 수 있을 것 같아요!invalidateQuery
처리를 해야 한다던가 하는 로직이 있겠어요!요약하자면, 기본적으로
functions
나queryKeys
에 정의된 내용을 컴포넌트가 직접 불러오는 방법을 사용하되, 정말 공통화가 필요한 부분이 있다면 그 부분에 대해서만 적절하게 커스텀 훅으로 묶어내자는 아이디어입니다!예시
예시 레포지토리 로 작성해봤는데요!
몇 가지 레이어로 고민했던 내용을 적어볼게요!
1. axios 인스턴스
baseURL 정보를 담아서 사용하는 인스턴스를 생성하고, HTTP 헤더에 공통적인 옵션을 사용해야 하는 경우에는 인터셉터를 정의할 수 있어요!
/api/instance.ts
2. API 요청 함수
생성했던 인스턴스를 바탕으로 실제로 API 요청을 처리하는 함수를 만들어요!
예시로
/api/functions/postAPI.ts
입니다.위 코드에서 게시글을 등록하는 API인
addPost
로 예시를 들자면:/posts
{ data: post }
{ message: string }
이렇게 API에 연관 있는 핵심 정보를 관리하고 있어요
이 정보는 이후에
useQuery
나useMutation
을 사용할 때에도 자동 추론하는 정보로 사용되어요!컨벤션
get??
: 데이터 가져오는 함수 (GET)post??
: 데이터 추가하는 함수 (POST)put??
: 데이터 수정하는 함수 (PUT)delete??
: 데이터 삭제하는 함수 (DELETE)접두사는 이렇게 동작이 들어가게 하는 것 어떨까요!?
3. queryKey 매핑
tanstack-query가 데이터를 캐싱하고 패칭하는 함수에 대한 매핑 정보를 적어줘요.
아래는
/api/queries/posts.ts
예시예요.4. 공통화가 필요한 경우에는 커스텀 훅 정의
만약 query나 mutation에 공통 로직이나 공통 옵션을 사용해야 한다면, 이 부분은 훅으로 묶는 방법도 좋을 것 같아요!
예시 1. 홀수ID의 포스트 목록
공통 옵션이라던가, 홀수만 필터링하는 공통 로직을 묶어서 훅으로 작성했어요.
(좋은 예시인지는 모르겠네요! 캐싱된 데이터는 queryFn 자체의 반환값이긴 해서..)
컨벤션은
use~~Query()
로 접미사에Query
를 붙히는 것 어떨까요?예시 2. 게시글 수정에 낙관적 업데이트 적용
공식 문서 를 참고해서 예시 훅을 작성했어요.
컨벤션은 mutationFn의 이름 앞에
use
만 붙인 형태로 하면 어떨까요?5. 실제로 컴포넌트에서 사용
요약
쓰다보니 너무 길어졌네요 ㅜㅜㅜ 죄송해요!!
요약하자면 레이어를 여러 개 놓고 공통 로직이 꼭 필요한 경우에만 커스텀 훅으로 빼자는 취지였습니다!!
Beta Was this translation helpful? Give feedback.
All reactions