[ Cheese10Yun Blog ]Spring Guide - Exception 전략
public enum ErrorCode { // Common INVALID_INPUT_VALUE(400, "C001", " Invalid Input Value"), METHOD_NOT_ALLOWED(405, "C002", " Invalid Input Value"), .... HANDLE_ACCESS_DENIED(403, "C006", "Access is Denied"), // Member EMAIL_DUPLICATION(400, "M001", "Email is Duplication"), LOGIN_INPUT_INVALID(400, "M002", "Login input is invalid"), ; private final String code; private final String message; private int status; ErrorCode(final int status, final String code, final String message) { this.status = status; this.message = message; this.code = code; } }
- 에러 코드가 전체적으로 흩어져있을 경우 코드, 메시지의 중복을 방지하기 어렵고 전체적으로 관리하는 것이 매우 어렵습니다.
C001
같은 코드도 동일하게 enum으로 관리 하는 것도 좋습니다. 에러 메시지는 Common과 각 도메인별로 관리하는 것이 효율적일 거 같습니다.
- 고민되는 부분 : 아래 둘을 같이 취급해야 할지, 다르게 취급해야 할지가 고민임
- 클라이언트에서 에러코드를 통해서 메시지를 정의해야 할 때 보는 에러코드(UI와 연동되는 에러코드)
- 연동작업을 할 때 즉, API와 클라 로직을 붙이는 때에만 보는 에러코드
Business Exception

- Business Exception은 요구사항에 맞지 않을 경우 발생시키는 Exception
- 이펙티브 자바에서 가능한 한 표준 예외를 재사용하라고 하였지만, 커스텀 에러코드를 클라이언트와 공유하기 위해서는 커스텀 예외를 정의할 수 밖에 없는 상황이 있음
나 같은 경우에는, ErrorCode를 아래와 같이 구체적으로 정의했기에, 예외 클래스를 더욱 구체적으로 나눠서 만들어야 할 필요가 없다고 생각이 됐음
@RequiredArgsConstructor @Getter public enum ErrorCode { /* * Account * */ /* Create Account */ INVALID_ACCOUNT_PARAMETER(HttpStatus.BAD_REQUEST, 1001, "아이디, 비밀번호를 채워주세요"), ID_PASSWORD_SAME(HttpStatus.BAD_REQUEST, 1002, "아이디와 동일한 비밀번호는 안됩니다"), INVALID_PASSWORD(HttpStatus.BAD_REQUEST, 1003, "비밀번호는 8자 이상 20자 이하, 영어 소문자, 대문자, 특수문자, 숫자 중 3가지를 포함해야 합니다"), DUPLICATE_ID(HttpStatus.BAD_REQUEST, 1004, "이미 등록된 아이디입니다") /* Login */, WRONG_PASSWORD(HttpStatus.BAD_REQUEST, 1005, "아이디 혹은 비밀번호가 잘못되었습니다"), ACCOUNT_NOT_FOUND(HttpStatus.BAD_REQUEST, 1006, "아이디 혹은 비밀번호가 잘못되었습니다"), UNAUTHENTICATED(HttpStatus.UNAUTHORIZED, 1007, "인증이 필요합니다"), UNAUTHORIZED(HttpStatus.FORBIDDEN, 1008, "권한이 없습니다"), /* * Inspection Period * */ PERIOD_OVERLAPPED(HttpStatus.BAD_REQUEST, 2001, "점검 기간이 중복됩니다"), INVALID_PERIOD_INPUT(HttpStatus.BAD_REQUEST, 2002, "기간 설정이 유효하지 않습니다"), PERIOD_NOT_FOUND(HttpStatus.NOT_FOUND, 2003, "해당하는 점검기간이 존재하지 않습니다"), INSPECTION_ONGOING(HttpStatus.FORBIDDEN, 2004, "서버 점검 중입니다. %s ~ %s"), /* * ChannelServer * */ CHANNEL_SERVER_NOT_FOUND(HttpStatus.INTERNAL_SERVER_ERROR, 3001, "채널 서버가 존재하지 않습니다"), TOO_MANY_CONNECTIONS(HttpStatus.BAD_REQUEST, 3002, "최대 접속자수를 초과했습니다"); private final HttpStatus httpStatus; private final int code; private final String message; }
