Skip to content
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

[길수진] week20 #1083

Conversation

suzinxix
Copy link
Collaborator

@suzinxix suzinxix commented May 13, 2024

요구사항

기본

  • https://bootcamp-api.codeit.kr/docs/linkbrary/v1 문서를 참고해 https://bootcamp-api.codeit.kr/api/linkbrary/v1 api를 활용해 주세요. (주의: 응답 데이터 양식 일부 변경이 있어요!)
  • api 요청에 TanStack React Query를 활용해 주세요.
  • 로그인은 POST ‘/auth/sign-in’ 을 활용해 주세요.
  • 회원가입은 POST ‘/auth/sign-up’ 을
이메일 중복확인은 POST ‘/users/check-email’을
활용해 주세요.
  • 유효한 access token이 있는 경우 GET ‘/users’로 현재 로그인한 유저 정보를 받아 상단 네비게이션 유저 프로필을 보여 주세요.
  • 유효한 access token이 없는 경우 “로그인” 버튼을 보여 주세요.

폴더 페이지

  • 폴더 페이지에서 현재 유저의 폴더 목록 데이터는 GET ‘/folders’를 활용해 주세요.
  • 폴더 페이지에서 전체 링크 데이터를 받아올 때 GET ‘/links’, 특정 폴더의 링크를 받아올 때 GET ‘/folders/{folderId}/links’를 활용해 주세요.
  • 폴더 이름 변경은 ‘PUT /folders/{folderId}’를 활용해 주세요.
  • 폴더 삭제는 ‘DELETE /folders/{folderId}’를 활용해 주세요.
  • 폴더 생성은 ‘POST /folders’를 활용해 주세요.
  • 링크 삭제는 ‘DELETE /links/{linkId}’를 활용해 주세요.
  • 링크 생성은 ‘POST /links’를 활용해 주세요.

공유 페이지

  • 폴더의 정보는 GET ‘/folders/{folderId}’,
폴더 소유자의 정보는 GET ‘/users/{userId}’를 활용해 주세요.
  • 링크 공유 페이지에서 폴더의 링크 데이터는 GET ‘/folders/{folderId}/links’를 활용해 주세요.

주요 변경사항

  • api 요청을 커스텀 훅으로 처리했어요
  • access token은 전역 상태 관리 라이브러리 zustand로 관리하고 refresh token은 쿠키에 저장했어요
  • 쿼리키와 api 엔드포인트를 상수화 했어요.

스크린샷

멘토에게

  • 응답 데이터도 바뀌고 제가 전에 짜놓은 코드에서 수정할 부분이 아직 많은 것 같아서🥹 이번주차에 신경썼던 주요 변경사항 관련해서 코드리뷰해주시면 될 것 같습니다..!
  • 로딩과 에러처리를 하지 못했는데 이 부분 관련해서도 해주실 코멘트가 있으면 해주시면 감사하겠습니다..!!

Copy link

vercel bot commented May 13, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
4-weekly-mission ❌ Failed (Inspect) May 13, 2024 9:23am
4-weekly-mission-ursd ❌ Failed (Inspect) May 13, 2024 9:23am

@suzinxix suzinxix requested a review from hovelopin May 13, 2024 09:25
@suzinxix suzinxix self-assigned this May 13, 2024
@suzinxix suzinxix added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성 죄송합니다.. labels May 13, 2024
@suzinxix suzinxix changed the title Part4 길수진 week20 [길수진] week20 May 13, 2024
Copy link
Collaborator

@hovelopin hovelopin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📌 LGTM

수진님 답변이 늦어서 죄송해요 😭

전체적으로 수진님 코드보니까 hook으로 분리해서 api 호출하려는 부분이랑 react-query 사용한 부분이 정석적으로 잘 사용해주신 것 같아요! 너무 잘하셨습니다. 👍🏻

에러에 대한 처리와 로딩에 대한 처리는 앞으로 저랑도 계속해서 배워볼 예정인데 프론트 개발자로써 유저 경험에 직접적으로 해당하는 부분인 로딩과 에러는 앞으로도 계속 공부해나가야하는 부분이기에 하나하나씩 같이 배워보도록 하시죠!

고생하셨습니다. 😃

console.log(error);
}
const Navbar = () => {
const { data, isError, isPending } = useGetUser();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

api 요청을 hook으로 관리하려는 시도 너무 좋은 것 같아요👍🏻

<Link href={ROUTE_PATHS.home}>
<Profile email={user[0].email} imgUrl={user[0].image_source} />
<Profile email={data.email} imgUrl={data.image_source} />
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저 같은 경우에는 보통 data라는 값으로 반환하기 보다는 hook에서 꺼내올때 user에 관한 정보면 userInfo라던지 조금 더 명확한 네이밍을 쓰는데 참고해보시면 좋을 것 같아요!

Comment on lines 13 to 18
const fetchUser = async (): Promise<UserResponse> => {
const {
data: [user],
} = await instance.get("/users");
return user;
};
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 부분은 api 폴더를 활용해봐도 좋을 것 같아요!

Comment on lines +9 to +20
const useAuthStore = create<AuthState>()(
persist(
(set) => ({
accessToken: null,
setAccessToken: (token) => set({ accessToken: token }),
}),
{
name: "auth-storage",
getStorage: () => localStorage,
}
)
);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

zustand도 잘 활용해주셨네요 👍🏻

클라이언트 상태관리로 최근에 가장 관심받는 라이브러리가 하나가 zustand인데 특징들을 잘 파악해두면 좋을 것 같아요!

Comment on lines +26 to +31
if (error.isAxiosError) {
if (error.response?.status === 404) {
console.log("존재하지 않는 유저");
} else {
console.log("인증 오류");
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

404와 같은 에러는 범용적인 에러라서 존재하지 않는 유저와 같이 특정 api에서 나는 에러를 처리하기 위한 텍스트를 적용하기에는 어렵습니다. 따라서 쫌 더 범용적으로 에러 텍스트를 처리할 수 있으면 좋을 것 같고 500과 같은 에러 또한 여기서 같이 처리해주면 좋을 것 같아요!

Comment on lines 5 to 11
const deleteFolder = async (folderId: number) => {
try {
await instance.delete(`/folders/${folderId}`);
} catch (error) {
throw error;
}
};
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 부분도 api 폴더로 따로 빼서 관리해보면 좋을 것 같아요!

mutationFn: deleteFolder,
onSuccess: () =>
queryClient.invalidateQueries({
queryKey: ["folders"],
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tanstack query 메인테이너인 tkdodo 블로그를 보면 queryKey를 관리하는 방식에 대해서 설명해주고 있어요!

해당 부분 참고해서 보시면 좋을 것 같아요!

📌 참고
effective query key

Comment on lines +87 to +93
if (isPending) {
return <div>로딩 중 입니다.</div>;
}

if (isError) {
return <div>에러가 발생했습니다. 다시 시도해주세요.</div>;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앞으로 저랑 배워볼 개념중에 Suspense와 ErrorBoundary와 같은 친구들이 있는데 에러처리를 해당 컴포넌트에 위임해서 선언적으로 처리하는게 리액트에 패러다임이라고 볼 수 있어요! 해당 키워드들도 한번 살펴보시면 좋을 것 같습니다!

Comment on lines +2 to +5
USER: ["user"] as const,
FOLDERS: ["folders"] as const,
LINKS: (folderId?: number | null) =>
folderId ? (["links", folderId] as const) : (["links"] as const),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앞에 key 관리에 대한 리뷰를 달았었는데 key 관리를 잘하고 계셨군요!?!? 👍🏻👍🏻👍🏻👍🏻👍🏻

@hovelopin hovelopin merged commit 045d481 into codeit-bootcamp-frontend:part3-길수진 May 27, 2024
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성 죄송합니다..
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants