예외 처리 시스템¶
단일
BusinessException+ 도메인별ErrorCodeENUM만으로 모든 비즈니스 예외를 관리. 새 예외 클래스를 만들지 않는다.
1. 구성¶
- BusinessException — 모든 비즈니스 예외가 사용하는 단일 클래스
- ErrorCode (interface) —
status(HTTP) +message제공 - 도메인별 ErrorCode ENUM —
CommonErrorCode,AuthErrorCode,MemberErrorCode,StudyRoomErrorCode… - ErrorAdvice (
@ControllerAdvice) — 예외를 일관된 JSON으로 변환
2. 에러 코드 추가¶
ENUM에 한 줄 추가:
public enum AuthErrorCode implements ErrorCode {
INVALID_CREDENTIALS(401, "아이디 또는 비밀번호가 올바르지 않습니다."),
MEMBER_ALREADY_EXISTS(409, "이미 존재하는 회원입니다.");
}
3. 예외 발생¶
throw new BusinessException(AuthErrorCode.INVALID_CREDENTIALS);
throw new BusinessException(AuthErrorCode.LOGIN_ERROR, causeException); // 원인 포함
4. 응답 포맷 (항상 동일)¶
ErrorAdvice가 일관 가공하므로 호출부는 신경 쓸 필요 없음.
5. Swagger 에러 명세 자동화¶
common/swagger/의 메타 어노테이션으로 컨트롤러별 에러 응답을 Swagger에 자동 노출.
@ApiMemberErrorResponses({ MemberErrorCode.MEMBER_NOT_EXIST,
MemberErrorCode.INCORRECT_CURRENT_PASSWORD })
@PutMapping("/api/members/password")
public SuccessResponse<Void> changePassword(...) { }
@ErrorResponseAnnotation이 붙은 어노테이션을 자동 탐지 → 리플렉션으로ErrorCode[]추출 → HTTP 상태별 그룹화 → Swagger ApiResponse + Example 생성- 새 도메인은
Api{Domain}ErrorResponses.java한 개만 만들면 됨
6. 유의¶
- 반드시 도메인별로 ENUM 분리
message/status는 사용자가 이해 가능하게
7. 관련¶
- teams/engineering/guides/api-spec — SpringDoc/Swagger 기본 사용
- teams/engineering/guides/backend-architecture