From ecc4138d5ca31210f3437af4bd42553c06d0b866 Mon Sep 17 00:00:00 2001 From: selentia Date: Thu, 27 Nov 2025 11:00:05 +0900 Subject: [PATCH] =?UTF-8?q?fix(errors):=20ApiError=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EC=97=90=20status=E2=86=92code=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=20=EB=A7=A4=ED=95=91=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - new ApiError(401, ...) 호출 시 code 기본값이 INTERNAL_ERROR로 지정되던 문제 수정 - HTTP statusCode에 따라 적절한 ErrorCode 자동 설정하도록 매핑 추가 - static factory 메서드 외 직접 생성자 사용 시도에도 안정적으로 코드 분기 가능 --- src/common/errors/ApiError.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/common/errors/ApiError.ts b/src/common/errors/ApiError.ts index b0e480f4..ecab6d07 100644 --- a/src/common/errors/ApiError.ts +++ b/src/common/errors/ApiError.ts @@ -54,19 +54,27 @@ export default class ApiError extends Error { * @param isOperational 비즈니스 로직에서 발생한 정상 범위의 에러 여부 */ - constructor( - statusCode: number, - message: string, - code: ErrorCode = 'INTERNAL_ERROR', - details?: unknown, - isOperational = true - ) { + constructor(statusCode: number, message: string, code?: ErrorCode, details?: unknown, isOperational = true) { super(message); + + // 상태 코드 자동 매핑 + const fallbackCodeMap: Record = { + 400: 'BAD_REQUEST', + 401: 'UNAUTHORIZED', + 403: 'FORBIDDEN', + 404: 'NOT_FOUND', + 409: 'CONFLICT', + 422: 'UNPROCESSABLE', + 429: 'TOO_MANY_REQUESTS', + 500: 'INTERNAL_ERROR', + }; + this.statusCode = statusCode; - this.code = code; + this.code = code ?? fallbackCodeMap[statusCode] ?? 'INTERNAL_ERROR'; this.details = details; this.isOperational = isOperational; this.name = 'ApiError'; + Error.captureStackTrace?.(this, this.constructor); }