Enum 타입으로 Exception 구현하기

[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 상태 코드와 메시지를 통일된 형식으로 관리할 수 있습니다.

최종적으로 CustomRuntimeExceptionControllerAdvice 또는 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

+ Recent posts