스프링/미션

[Spring] lotto - exception 구현

문상휘파람 2024. 10. 4. 19:19

오늘은 exception 처리입니다! 

 

제가 어떠한 원리로 exception 코드를 작성했는지는 이 곳을 참고해주세요!

 

exception 패키지 구조

 

exception 패키지 구조입니다! 

 

예외처리를 전역적으로 적용시킬 것이기에 global 패키지를 생성하여 예외 처리를 구현하였습니다.


먼저, enum을 사용하여 에러코드를 커스텀하였습니다.

 

* CustomErrorCode

public enum CustomErrorCode {

    NOT_LOTTO_RANGE_EXCEPTION(400, "로또 범위 아님."),
    USER_NOT_FOUND_EXCEPTION(404, "유저 없음."),
    MONEY_NOT_FOUNT_EXCEPTION(404, "돈 없음."),
    LOTTO_NOT_FOUND_EXCEPTION(404, "로또 없음.");

    private final int status;
    private final String message;

    CustomErrorCode(int status, String message) {
        this.status = status;
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public int getStatus() {
        return status;
    }
}

 

오류 번호와 메세지를 직접 커스텀 하기 위해 생성하였습니다!

 

 

다음은 위에서 커스텀한 오류 코드를 사용하기 위해 구현부를 만들었습니다. 

 

*CustomException

public class CustomException extends RuntimeException {

    private final CustomErrorCode customErrorCode;

    public CustomException(CustomErrorCode customErrorCode) {
        super(customErrorCode.getStatus() + ": " + customErrorCode.getMessage());
        this.customErrorCode = customErrorCode;
    }

    public CustomErrorCode getCustomErrorCode() {
        return customErrorCode;
    }
}

 

RuntimeException을 상속받아서, CustomErrorCode 값을 넘겨줄 수 있도록 하였습니다.

 

 

마지막으로 핸들러입니다!

 

* GlobalExceptionHandler

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleException(CustomException e){
        CustomErrorCode customErrorCode = e.getCustomErrorCode();
        ErrorResponse errorResponse = new ErrorResponse(customErrorCode.getStatus(), customErrorCode.getMessage());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
    }
}

 

ErrorResponse(dto)를 통해 값을 보여줄 수 있도록 하였고, 잘못된 요청(BAD_REQUEST)을 보냈다는 상태도 같이 반환하도록 코드를 작성하였습니다.

 


이렇게, Exception 처리를 어떻게 했는지 설명해 보았습니다!

 

저의 경우,

1. 에러 코드를 커스텀하고            

2. 커스텀한 에러 코드를 이용할 수 있는 구현부를 만들고

3. 마지막으로 핸들러를 적용시켰습니다!