diff --git a/.claude/rules/error-codes.md b/.claude/rules/error-codes.md index d6ef5d0..7d4746c 100644 --- a/.claude/rules/error-codes.md +++ b/.claude/rules/error-codes.md @@ -13,13 +13,13 @@ description: 세 플랫폼이 공유하는 에러 코드 ↔ 한국어 메시지 | 코드 | HTTP / 상황 | 메시지 | | -------- | -------------------- | ------------------------------------------------------- | -| SYS_001 | 500 / 미정의 예외 | "일시적인 시스템 오류가 발생했습니다. 잠시 후 다시 시도해 주세요." | -| AUTH_001 | 401 | "로그인이 필요한 서비스입니다. 로그인 후 이용해 주세요." | -| AUTH_002 | 세션 만료 (클라이언트) | "안전을 위해 로그아웃 되었습니다. 다시 로그인해 주세요." | -| AUTH_003 | 403 | "해당 메뉴나 기능에 접근할 수 있는 권한이 없습니다." | -| VAL_001 | 400 / 422 (Validation) | "입력하신 정보를 다시 확인해 주세요. (필수값 누락 또는 형식 오류)" | -| RES_001 | 404 | "요청하신 정보나 페이지를 찾을 수 없습니다." | -| BIZ_001 | 200(비즈니스 실패) / 기타 | "요청하신 작업을 완료하지 못했습니다. 다시 시도해 주세요." | +| SYS_001 | 500 / 미정의 예외 | "일시적인 오류가 생겼어요. 잠시 후 다시 시도해 주세요." | +| AUTH_001 | 401 | "로그인이 필요한 기능이에요. 로그인 후 이용해 주세요." | +| AUTH_002 | 세션 만료 (클라이언트) | "안전을 위해 로그아웃했어요. 다시 로그인해 주세요." | +| AUTH_003 | 403 | "이 메뉴나 기능을 이용할 권한이 없어요." | +| VAL_001 | 400 / 422 (Validation) | "입력하신 내용을 다시 확인해 주세요. 빠진 항목이 있거나 형식이 맞지 않아요." | +| RES_001 | 404 | "찾으시는 정보나 페이지가 없어요." | +| BIZ_001 | 200(비즈니스 실패) / 기타 | "요청하신 작업을 끝내지 못했어요. 다시 시도해 주세요." | > 비즈니스 예외는 `HttpException` 응답의 `message` 로 사용자 노출 문구를 재정의할 수 있다. > 응답 래퍼 구조는 [[response-format]] 참조. diff --git a/backend/src/common/filters/http-exception.filter.ts b/backend/src/common/filters/http-exception.filter.ts index 224d5a5..e7c38fe 100644 --- a/backend/src/common/filters/http-exception.filter.ts +++ b/backend/src/common/filters/http-exception.filter.ts @@ -21,7 +21,7 @@ export class HttpExceptionFilter implements ExceptionFilter { let status: HttpStatus = HttpStatus.INTERNAL_SERVER_ERROR; let code = 'SYS_001'; let message = - '일시적인 시스템 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.'; + '일시적인 오류가 생겼어요. 잠시 후 다시 시도해 주세요.'; if (exception instanceof HttpException) { status = exception.getStatus(); @@ -29,23 +29,23 @@ export class HttpExceptionFilter implements ExceptionFilter { if (status === HttpStatus.UNAUTHORIZED) { code = 'AUTH_001'; - message = '로그인이 필요한 서비스입니다. 로그인 후 이용해 주세요.'; + message = '로그인이 필요한 기능이에요. 로그인 후 이용해 주세요.'; } else if (status === HttpStatus.FORBIDDEN) { code = 'AUTH_003'; - message = '해당 메뉴나 기능에 접근할 수 있는 권한이 없습니다.'; + message = '이 메뉴나 기능을 이용할 권한이 없어요.'; } else if (status === HttpStatus.NOT_FOUND) { code = 'RES_001'; - message = '요청하신 정보나 페이지를 찾을 수 없습니다.'; + message = '찾으시는 정보나 페이지가 없어요.'; } else if ( status === HttpStatus.BAD_REQUEST || status === HttpStatus.UNPROCESSABLE_ENTITY ) { code = 'VAL_001'; message = - '입력하신 정보를 다시 확인해 주세요. (필수값 누락 또는 형식 오류)'; + '입력하신 내용을 다시 확인해 주세요. 빠진 항목이 있거나 형식이 맞지 않아요.'; } else { code = 'BIZ_001'; - message = '요청하신 작업을 완료하지 못했습니다. 다시 시도해 주세요.'; + message = '요청하신 작업을 끝내지 못했어요. 다시 시도해 주세요.'; // 비즈니스 예외에서는 사용자에게 보일 메시지를 재정의 가능 if ( diff --git a/backend/src/main.ts b/backend/src/main.ts index 5531264..af9bcec 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -71,7 +71,7 @@ async function bootstrap() { error: { code: 'SYS_001', message: - '일시적인 시스템 오류가 발생했습니다. (요청 한도 초과) 잠시 후 다시 시도해 주세요.', // 글로벌 통합 에러 포맷 + '요청이 너무 많아요. 잠시 후 다시 시도해 주세요.', // 글로벌 통합 에러 포맷 }, }, }), diff --git a/flutter/lib/core/api/error_lexicon.dart b/flutter/lib/core/api/error_lexicon.dart index 423e18f..21ca2c1 100644 --- a/flutter/lib/core/api/error_lexicon.dart +++ b/flutter/lib/core/api/error_lexicon.dart @@ -1,12 +1,12 @@ class ErrorLexicon { static const Map codes = { - 'SYS_001': '일시적인 시스템 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.', - 'AUTH_001': '로그인이 필요한 서비스입니다. 로그인 후 이용해 주세요.', - 'AUTH_002': '안전을 위해 로그아웃 되었습니다. 다시 로그인해 주세요.', - 'AUTH_003': '해당 메뉴나 기능에 접근할 수 있는 권한이 없습니다.', - 'VAL_001': '입력하신 정보를 다시 확인해 주세요. (필수값 누락 또는 형식 오류)', - 'RES_001': '요청하신 정보나 페이지를 찾을 수 없습니다.', - 'BIZ_001': '요청하신 작업을 완료하지 못했습니다. 다시 시도해 주세요.', + 'SYS_001': '일시적인 오류가 생겼어요. 잠시 후 다시 시도해 주세요.', + 'AUTH_001': '로그인이 필요한 기능이에요. 로그인 후 이용해 주세요.', + 'AUTH_002': '안전을 위해 로그아웃했어요. 다시 로그인해 주세요.', + 'AUTH_003': '이 메뉴나 기능을 이용할 권한이 없어요.', + 'VAL_001': '입력하신 내용을 다시 확인해 주세요. 빠진 항목이 있거나 형식이 맞지 않아요.', + 'RES_001': '찾으시는 정보나 페이지가 없어요.', + 'BIZ_001': '요청하신 작업을 끝내지 못했어요. 다시 시도해 주세요.', }; static String getMessage(String code) { diff --git a/frontend/src/components/common/SectionBoundary.vue b/frontend/src/components/common/SectionBoundary.vue index 0827ff4..08c8bb8 100644 --- a/frontend/src/components/common/SectionBoundary.vue +++ b/frontend/src/components/common/SectionBoundary.vue @@ -1,5 +1,7 @@