Skip to content

Commit 3782318

Browse files
committed
refactor(front, repository): ErrorCode 수정, useLoadingProgress 수정
1 parent a89f401 commit 3782318

File tree

2 files changed

+115
-32
lines changed

2 files changed

+115
-32
lines changed

front/src/hooks/analysis/useLoadingProgress.ts

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,77 @@
22

33
import { useEffect, useRef, useState, useMemo } from "react"
44
import { useRouter } from "next/navigation"
5+
import { ERROR_CODES, ERROR_MESSAGES, ErrorCode } from "@/types/api"
56

67
type AnalysisErrorKind = "repo" | "auth" | "rate" | "duplicate" | "server" | "network";
8+
79
const defaultAnalysisError = {
810
type: "server" as AnalysisErrorKind,
911
message: "분석 처리 중 오류가 발생했어요. 잠시 후 다시 시도해 주세요.",
1012
};
1113

12-
const stashAnalysisError = (payload: { type: AnalysisErrorKind; message: string }) => {
13-
try {
14-
sessionStorage.setItem("analysisError", JSON.stringify(payload));
15-
} catch {
16-
/* ignore */
14+
const ANALYSIS_ERROR_KIND: Partial<Record<ErrorCode, AnalysisErrorKind>> = {
15+
[ERROR_CODES.GITHUB_REPO_NOT_FOUND]: "repo",
16+
[ERROR_CODES.GITHUB_API_FAILED]: "repo",
17+
[ERROR_CODES.GITHUB_REPO_TOO_LARGE]: "repo",
18+
[ERROR_CODES.GITHUB_INVALID_TOKEN]: "auth",
19+
[ERROR_CODES.FORBIDDEN]: "auth",
20+
[ERROR_CODES.GITHUB_RATE_LIMIT_EXCEEDED]: "rate",
21+
[ERROR_CODES.GITHUB_API_SERVER_ERROR]: "server",
22+
[ERROR_CODES.NETWORK_ERROR]: "network",
23+
[ERROR_CODES.ANALYSIS_IN_PROGRESS]: "duplicate",
24+
}
25+
26+
const ANALYSIS_ERROR_MESSAGE: Partial<Record<ErrorCode, string>> = {
27+
[ERROR_CODES.GITHUB_REPO_NOT_FOUND]: "리포지토리 URL을 다시 한번 확인해 주세요.",
28+
[ERROR_CODES.GITHUB_API_FAILED]: "요청을 처리할 수 없었어요. 입력값을 다시 확인해 주세요.",
29+
[ERROR_CODES.GITHUB_REPO_TOO_LARGE]: "저장소가 너무 커서 분석할 수 없어요.",
30+
[ERROR_CODES.GITHUB_INVALID_TOKEN]: "GitHub 인증에 실패했어요. 다시 로그인 후 시도해 주세요.",
31+
[ERROR_CODES.FORBIDDEN]: "해당 리포지토리에 접근 권한이 없어요.",
32+
[ERROR_CODES.GITHUB_RATE_LIMIT_EXCEEDED]: "요청이 많아요. 잠시 기다렸다 다시 시도해 주세요.",
33+
[ERROR_CODES.GITHUB_API_SERVER_ERROR]: "GitHub 서버에서 오류가 발생했어요. 잠시 후 다시 시도해 주세요.",
34+
[ERROR_CODES.NETWORK_ERROR]: "네트워크 연결을 확인해 주세요.",
35+
[ERROR_CODES.ANALYSIS_IN_PROGRESS]: "이미 분석을 진행 중이에요. 잠시 후 다시 확인해 주세요.",
36+
}
37+
38+
const errorCodeValues = new Set<ErrorCode>(Object.values(ERROR_CODES))
39+
40+
const resolveErrorCode = (raw?: string): ErrorCode | undefined => {
41+
if (!raw) return undefined
42+
if (errorCodeValues.has(raw as ErrorCode)) {
43+
return raw as ErrorCode
1744
}
18-
};
45+
if (raw in ERROR_CODES) {
46+
return ERROR_CODES[raw as keyof typeof ERROR_CODES]
47+
}
48+
return undefined
49+
}
1950

2051
const mapErrorCodeToAlert = (
2152
code?: string,
2253
fallback?: string
2354
): { type: AnalysisErrorKind; message: string } => {
24-
switch (code) {
25-
case "GITHUB_REPO_NOT_FOUND":
26-
return { type: "repo", message: "리포지토리 URL을 다시 한번 확인해 주세요." };
27-
case "GITHUB_INVALID_TOKEN":
28-
return { type: "auth", message: "GitHub 인증에 실패했어요. 다시 로그인 후 시도해 주세요." };
29-
case "GITHUB_RATE_LIMIT_EXCEEDED":
30-
return { type: "rate", message: "요청이 많아요. 잠시 기다렸다 다시 시도해 주세요." };
31-
case "FORBIDDEN":
32-
return { type: "auth", message: "해당 리포지토리에 접근 권한이 없어요." };
33-
case "GITHUB_API_FAILED":
34-
return { type: "repo", message: "요청을 처리할 수 없었어요. 입력값을 다시 확인해 주세요." };
35-
case "GITHUB_API_SERVER_ERROR":
36-
return { type: "server", message: "GitHub 서버에서 오류가 발생했어요. 잠시 후 다시 시도해 주세요." };
37-
default:
38-
return {
39-
type: defaultAnalysisError.type,
40-
message: fallback || defaultAnalysisError.message,
41-
};
55+
const resolvedCode = resolveErrorCode(code);
56+
57+
if (resolvedCode) {
58+
const type = ANALYSIS_ERROR_KIND[resolvedCode] ?? defaultAnalysisError.type;
59+
const message =
60+
ANALYSIS_ERROR_MESSAGE[resolvedCode] ||
61+
ERROR_MESSAGES[resolvedCode] ||
62+
fallback ||
63+
defaultAnalysisError.message;
64+
65+
return { type, message };
66+
}
67+
68+
return defaultAnalysisError;
69+
};
70+
71+
const stashAnalysisError = (payload: { type: AnalysisErrorKind; message: string }) => {
72+
try {
73+
sessionStorage.setItem("analysisError", JSON.stringify(payload));
74+
} catch {
75+
/* ignore */
4276
}
4377
};
4478

@@ -185,8 +219,13 @@ export function useAnalysisProgress(repoUrl?: string | null) {
185219

186220
eventSource.onerror = (err) => {
187221
console.error("[SSE][error]", err)
188-
setError("❌ SSE 연결이 끊어졌습니다.")
222+
setError("❌ 서버에 문제가 발생했어요.")
189223
eventSource.close()
224+
225+
setTimeout(() => {
226+
router.push("/analysis");
227+
}, 3000);
228+
return;
190229
}
191230

192231
return () => {

front/src/types/api.ts

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,24 @@ export interface ApiResponse<T> {
5252
INVALID_INPUT_VALUE: 'CMN003',
5353
INVALID_TYPE_VALUE: 'CMN004',
5454
MISSING_REQUEST_PARAMETER: 'CMN005',
55+
UNAUTHORIZED: 'CMN006',
5556

57+
// user 도메인
58+
LOGIN_FAILED: 'U001',
59+
EMAIL_VERIFY_FAILED: 'U002',
60+
NAME_NOT_FOUND: 'U003',
61+
PASSWORD_NOT_FOUND: 'U004',
62+
PASSWORD_NOT_EQUAL: 'U005',
63+
EMAIL_NOT_FOUND: 'U006',
64+
ALREADY_REGISTERED_EMAIL: 'U007',
65+
5666
// Analysis 도메인
5767
INVALID_GITHUB_URL: 'A001',
5868
INVALID_REPOSITORY_PATH: 'A002',
5969
ANALYSIS_NOT_FOUND: 'A003',
70+
USER_NOT_FOUND: 'A004',
71+
FORBIDDEN: 'A005',
72+
ANALYSIS_IN_PROGRESS: 'A006',
6073

6174
// Repository 도메인
6275
GITHUB_REPO_NOT_FOUND: 'G001',
@@ -65,32 +78,63 @@ export interface ApiResponse<T> {
6578
GITHUB_INVALID_TOKEN: 'G004',
6679
GITHUB_RESPONSE_PARSE_ERROR: 'G005',
6780
GITHUB_API_FAILED: 'G006',
68-
81+
GITHUB_REPO_TOO_LARGE: 'G007',
82+
83+
// comment 도메인
84+
COMMENT_NOT_FOUND: 'R001',
85+
6986
// 프론트엔드 전용 에러
7087
NETWORK_ERROR: 'FE001',
7188
TIMEOUT_ERROR: 'FE002',
72-
INVALID_RESPONSE: 'FE003',
73-
UNAUTHORIZED: 'FE004',
74-
FORBIDDEN: 'FE005',
89+
INVALID_RESPONSE: 'FE003'
7590
} as const;
7691

7792
export type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];
7893

7994
// ========== 에러 메시지 매핑 ==========
8095
export const ERROR_MESSAGES: Record<string, string> = {
96+
// 공통
8197
[ERROR_CODES.VALIDATION_FAILED]: '입력값 검증에 실패했습니다.',
8298
[ERROR_CODES.INTERNAL_ERROR]: '서버 내부 오류가 발생했습니다.',
8399
[ERROR_CODES.INVALID_INPUT_VALUE]: '잘못된 입력값입니다.',
100+
[ERROR_CODES.INVALID_TYPE_VALUE]: '잘못된 타입의 값입니다.',
101+
[ERROR_CODES.MISSING_REQUEST_PARAMETER]: '필수 요청 파라미터가 누락되었습니다.',
102+
[ERROR_CODES.UNAUTHORIZED]: '인증이 필요합니다.',
103+
104+
// user 도메인
105+
[ERROR_CODES.LOGIN_FAILED]: '로그인에 실패했습니다.',
106+
[ERROR_CODES.EMAIL_VERIFY_FAILED]: '이메일 인증코드가 일치하지 않습니다.',
107+
[ERROR_CODES.NAME_NOT_FOUND]: '이름이 입력되지 않았습니다.',
108+
[ERROR_CODES.PASSWORD_NOT_FOUND]: '비밀번호가 입력되지 않았습니다.',
109+
[ERROR_CODES.PASSWORD_NOT_EQUAL]: '비밀번호 확인이 일치하지 않습니다.',
110+
[ERROR_CODES.EMAIL_NOT_FOUND]: '해당 이메일은 없는 계정입니다.',
111+
[ERROR_CODES.ALREADY_REGISTERED_EMAIL]: '이미 회원가입된 이메일입니다.',
112+
84113
[ERROR_CODES.INVALID_GITHUB_URL]: '올바른 GitHub 저장소 URL이 아닙니다.',
85-
[ERROR_CODES.INVALID_REPOSITORY_PATH]: '저장소 URL 형식이 잘못되었습니다.',
114+
[ERROR_CODES.INVALID_REPOSITORY_PATH]:
115+
'저장소 URL 형식이 잘못되었습니다. (예: https://github.com/{owner}/{repo})',
86116
[ERROR_CODES.ANALYSIS_NOT_FOUND]: '분석 결과를 찾을 수 없습니다.',
117+
[ERROR_CODES.USER_NOT_FOUND]: '사용자 정보를 찾을 수 없습니다.',
118+
[ERROR_CODES.FORBIDDEN]: '접근 권한이 없습니다.',
119+
[ERROR_CODES.ANALYSIS_IN_PROGRESS]: '이미 분석이 진행 중입니다. 잠시 후 다시 시도해주세요.',
120+
121+
// repository 도메인
87122
[ERROR_CODES.GITHUB_REPO_NOT_FOUND]: 'GitHub 저장소를 찾을 수 없습니다.',
88123
[ERROR_CODES.GITHUB_API_SERVER_ERROR]: 'GitHub API 서버에서 오류가 발생했습니다.',
89124
[ERROR_CODES.GITHUB_RATE_LIMIT_EXCEEDED]: 'GitHub API 호출 제한을 초과했습니다.',
125+
[ERROR_CODES.GITHUB_INVALID_TOKEN]: 'GitHub 인증 토큰이 유효하지 않습니다.',
126+
[ERROR_CODES.GITHUB_RESPONSE_PARSE_ERROR]:
127+
'GitHub 응답 데이터를 처리하는 중 오류가 발생했습니다.',
128+
[ERROR_CODES.GITHUB_API_FAILED]: 'GitHub API 응답에 실패했습니다.',
129+
[ERROR_CODES.GITHUB_REPO_TOO_LARGE]: '저장소가 너무 커서 분석할 수 없습니다.',
130+
131+
// comment 도메인
132+
[ERROR_CODES.COMMENT_NOT_FOUND]: '댓글을 찾을 수 없습니다.',
133+
134+
// 프론트엔드 전용
90135
[ERROR_CODES.NETWORK_ERROR]: '네트워크 연결을 확인해주세요.',
91136
[ERROR_CODES.TIMEOUT_ERROR]: '요청 시간이 초과되었습니다.',
92-
[ERROR_CODES.UNAUTHORIZED]: '인증이 필요합니다.',
93-
[ERROR_CODES.FORBIDDEN]: '접근 권한이 없습니다.',
137+
[ERROR_CODES.INVALID_RESPONSE]: '서버 응답 형식이 올바르지 않습니다.'
94138
};
95139

96140
// ========== API 요청 옵션 ==========

0 commit comments

Comments
 (0)