From 1fbef9936ec4e3acfb03ff248274a2c2fe62dbb6 Mon Sep 17 00:00:00 2001 From: aken-you Date: Sun, 7 Sep 2025 23:59:46 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=EC=A0=84=EC=97=AD=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/error.tsx | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 app/error.tsx diff --git a/app/error.tsx b/app/error.tsx new file mode 100644 index 00000000..ae1b52c9 --- /dev/null +++ b/app/error.tsx @@ -0,0 +1,32 @@ +'use client'; + +import Button from '@/shared/ui/button'; + +export default function ErrorBoundary({ + error, + reset, +}: { + error: Error; + reset: () => void; +}) { + return ( +
+
+

+ 서비스 이용에 불편드려 죄송합니다. +

+
+ + 에러가 발생하여 페이지를 표시할 수 없습니다. + + + 잠시 뒤에 다시 시도해주세요. + +
+
+ +
+ ); +} From d2d48722fc6584bc225f7f207d22f3be56f39e06 Mon Sep 17 00:00:00 2001 From: aken-you Date: Mon, 8 Sep 2025 00:27:19 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=8B=A0=EC=B2=AD=20mutation=20onError=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entities/user/model/use-user-profile-query.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/entities/user/model/use-user-profile-query.ts b/src/entities/user/model/use-user-profile-query.ts index 38d00741..bbec6c9f 100644 --- a/src/entities/user/model/use-user-profile-query.ts +++ b/src/entities/user/model/use-user-profile-query.ts @@ -6,6 +6,7 @@ import { } from '@/entities/user/api/get-user-profile'; import type { GetUserProfileResponse } from '@/entities/user/api/types'; import { hashValue } from '@/shared/lib/hash'; +import { isApiError } from '@/shared/tanstack-query/api-error'; export const useUserProfileQuery = (memberId: number) => { return useQuery({ @@ -45,10 +46,18 @@ export const usePatchAutoMatchingMutation = () => { return { prev }; }, - onError: (_err, { memberId }, ctx) => { + onError: (error, { memberId }, ctx) => { if (ctx?.prev) { qc.setQueryData(['userProfile', memberId], ctx.prev); } + + if (isApiError(error)) { + if (error.errorCode === 'MEM004') { + alert('아직 스터디를 신청하지 않았습니다. 먼저 스터디 신청해주세요.'); + } else if (error.errorCode === 'MEM001') { + alert('회원 정보가 존재하지 않습니다.'); + } + } }, onSuccess: async (_data, { memberId, autoMatching }) => { From 4f5970935c5dd36f7c29a9cab6baceea880e65d2 Mon Sep 17 00:00:00 2001 From: aken-you Date: Mon, 8 Sep 2025 00:27:29 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20mutation=20onError=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/auth/model/use-auth-mutation.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/features/auth/model/use-auth-mutation.ts b/src/features/auth/model/use-auth-mutation.ts index b81c0725..712e67ff 100644 --- a/src/features/auth/model/use-auth-mutation.ts +++ b/src/features/auth/model/use-auth-mutation.ts @@ -5,6 +5,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; import { logout, signUp, uploadProfileImage } from '@/features/auth/api/auth'; import { hashValue } from '@/shared/lib/hash'; +import { isApiError } from '@/shared/tanstack-query/api-error'; import { deleteCookie, getCookie } from '@/shared/tanstack-query/cookie'; import { SignUpResponse } from './types'; @@ -16,6 +17,13 @@ export const useSignUpMutation = () => { { name: string; imageExtension: string } >({ mutationFn: (data: any) => signUp(data), + onError: (error) => { + if (isApiError(error)) { + if (error.errorCode === 'DUPLICATE_MEMBER') { + alert('이미 가입된 회원입니다.'); + } + } + }, }); }; From 81851a8eba2ea0365b4701e2055c675c8b15d238 Mon Sep 17 00:00:00 2001 From: aken-you Date: Mon, 8 Sep 2025 00:30:53 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20mut?= =?UTF-8?q?ation=20onError=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../my-page/model/use-update-user-profile-mutation.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/features/my-page/model/use-update-user-profile-mutation.ts b/src/features/my-page/model/use-update-user-profile-mutation.ts index d49cdaf7..5b34e273 100644 --- a/src/features/my-page/model/use-update-user-profile-mutation.ts +++ b/src/features/my-page/model/use-update-user-profile-mutation.ts @@ -1,5 +1,6 @@ import { useMutation, useQuery } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; +import { isApiError } from '@/shared/tanstack-query/api-error'; import { UpdateUserProfileInfoRequest, UpdateUserProfileRequest, @@ -24,6 +25,15 @@ export const useUpdateUserProfileMutation = (memberId: number) => { onSuccess: () => { router.refresh(); }, + onError: (error) => { + if (isApiError(error)) { + if (error.errorCode === 'MPR001') { + alert('관심사가 중복됐습니다.'); + } else if (error.errorCode === 'MEM001') { + alert('회원 정보가 존재하지 않습니다.'); + } + } + }, }); }; From bb7a15fb666452c2ea6061bb525b3cb5ade6bcb5 Mon Sep 17 00:00:00 2001 From: aken-you Date: Mon, 8 Sep 2025 00:37:19 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=ED=9B=84=EA=B8=B0=20=EB=93=B1=EB=A1=9D=20mutation=20onError=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entities/review/model/use-review-query.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/entities/review/model/use-review-query.ts b/src/entities/review/model/use-review-query.ts index 26d994a0..cbaf66a3 100644 --- a/src/entities/review/model/use-review-query.ts +++ b/src/entities/review/model/use-review-query.ts @@ -9,6 +9,7 @@ import { UserPositiveKeywordsRequest, } from '@/entities/review/api/review-types'; import { getKoreaDate } from '@/shared/lib/time'; +import { isApiError } from '@/shared/tanstack-query/api-error'; import { addStudyReview, getUserPositiveKeywords, @@ -32,6 +33,15 @@ export const useAddStudyReviewMutation = () => { // todo: 모달로 변경 alert('후기 작성이 완료되었습니다.'); }, + onError: (error) => { + if (isApiError(error)) { + if (error.errorCode === 'CMM001') { + alert('이미 후기를 작성했습니다.'); + } else if (error.errorCode === 'CMM003') { + alert('스터디 또는 스터디 멤버가 존재하지 않습니다.'); + } + } + }, }); }; From 44efe4361dbdbaaf495315d93ac356c34f03863c Mon Sep 17 00:00:00 2001 From: aken-you Date: Thu, 18 Sep 2025 00:22:54 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20=EC=A0=84=EC=97=AD=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EA=B3=A0=EC=B9=A8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/error.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/error.tsx b/app/error.tsx index ae1b52c9..0c788e08 100644 --- a/app/error.tsx +++ b/app/error.tsx @@ -1,5 +1,7 @@ 'use client'; +import { useRouter } from 'next/navigation'; +import { startTransition } from 'react'; import Button from '@/shared/ui/button'; export default function ErrorBoundary({ @@ -9,6 +11,8 @@ export default function ErrorBoundary({ error: Error; reset: () => void; }) { + const router = useRouter(); + return (
@@ -24,7 +28,15 @@ export default function ErrorBoundary({
-