[Spring] Enum 타입으로 Exception 구현하기
2024. 7. 22. 11:44
[Spring] Enum 타입으로 Exception 구현하기
기존에 예외 처리를 다음과 같이 Enum
타입으로 구현했습니다.
public enum AdminException {
FAIL_TO_SIGN_IN(HttpStatus.BAD_REQUEST, "로그인에 실패했습니다.");
private final HttpStatus status;
private final String message;
}
Enum
타입은 기본적으로 java.lang.Enum
을 암시적으로 상속받기 때문에 extends
키워드를 사용할 수 없습니다. 따라서 상속 기능을 구현하기 위해 interface
를 사용했으며, interface
는 다중 상속을 지원하므로 아래 코드와 같이 enum
클래스들이 CustomException
인터페이스를 implements
하도록 했습니다.
public interface CustomException {
HttpStatus getHttpStatus();
String getErrorMessage();
String getName();
}
@RequiredArgsConstructor
public enum AdminException implements CustomException {
FAIL_TO_SIGN_IN(HttpStatus.BAD_REQUEST, "로그인에 실패했습니다.");
private final HttpStatus status;
private final String message;
@Override
public HttpStatus getHttpStatus() {
return status;
}
@Override
public String getErrorMessage() {
return message;
}
@Override
public String getName() {
return name();
}
}
Enum
타입이 특정 인터페이스를 implements
한 이유는 RuntimeException
을 상속받는 특정 클래스(아래에서는 CustomRumtimeException
)에서 모든 예외에 대해 동일한 응답을 제공하기 위해서였습니다. 해당 클래스는 다음과 같습니다.
@Getter
@RequiredArgsConstructor
public class CustomRuntimeException extends RuntimeException {
private final CustomException customException;
public String getMessage() {
return customException.getErrorMessage();
}
}
위 코드는 CustomRuntimeException
클래스가 CustomException
인터페이스를 구현하는 열거형을 사용하여 예외 정보를 처리하고, 예외 발생 시 일관된 응답을 반환하도록 설계되었습니다. 이를 통해 각 예외에 대한 HTTP 상태 코드와 메시지를 통일된 형식으로 관리할 수 있습니다.
최종적으로 CustomRuntimeException
을 ControllerAdvice
또는 RestControllerAdvice
에서 아래와 같이 예외를 잡고 응답을 보낼 수 있습니다.
@ExceptionHandler(CustomRuntimeException.class)
public ResponseEntity<Map<String, String>> customExceptionHandler(CustomRuntimeException e) {
// 응답 맵 생성
Map<String, String> responseMap = new LinkedHashMap<>();
responseMap.put("status", e.getCustomException().getHttpStatus().toString());
responseMap.put("message", e.getCustomException().getErrorMessage());
// 응답 반환
return ResponseEntity.status(e.getCustomException().getHttpStatus())
.body(responseMap);
}
이렇게 하면 예외 발생 시 CustomRuntimeException
을 던지고, GlobalExceptionHandler
가 해당 예외를 잡아 일관된 형식으로 응답을 반환하게 됩니다.
'Spring' 카테고리의 다른 글
[Spring] DynamicInsert 사용 이유 (0) | 2024.07.22 |
---|---|
Optional 클래스의 orElseThrow (0) | 2024.07.22 |
docker hub 사용하는 방법 (1) | 2023.11.27 |
redis를 통해 로그아웃 기능 구현 (0) | 2023.11.27 |
Jasypt 를 통한 암호화 (2) | 2023.11.27 |