본문 바로가기
컴퓨터 프로그래밍/Spring

[Spring] GlobalExceptionHandler

by 한33 2024. 9. 22.

UserService

if (!passwordEncoder.matches(deleteUserRequestDto.getPassword(), user.getPassword())) {
    throw new UnauthorizedPasswordException();
}

 

비밀번호가 일치하지 않을 때 비밀번호 불일치 메세지를 던지기 위해서 예외처리를 했다.

 

UnauthorizedPasswordException

public class UnauthorizedPasswordException extends GlobalException {
    public UnauthorizedPasswordException() {
        super(UNAUTHORIZED_PASSWORD);
    }
}

 

GlobalExceptionConst

@AllArgsConstructor
@Getter
public enum GlobalExceptionConst {
    // user_Exception ( 상태코드 )
    UNAUTHORIZED_PASSWORD(HttpStatus.UNAUTHORIZED, " 비밀번호가 일치하지 않습니다."),
    //order_Exception (상태코드 400)
    MINIMUM_ORDER_PRICE(HttpStatus.BAD_REQUEST, "주문 최소금액이 맞지 않습니다."),

    //order_Exception (상태코드 403),
    STORE_CLOSED(HttpStatus.FORBIDDEN, "가게 오픈 전입니다."),
    UNAUTHORIZED_USER(HttpStatus.FORBIDDEN, "사용자 권한이 없습니다."),

    //order_Exception (상태코드 404)
    NOT_FOUND_ORDER(HttpStatus.NOT_FOUND, " 주문이 존재하지 않습니다."),
    NOT_FOUND_USER(HttpStatus.NOT_FOUND, "회원이 존재하지 않습니다."),

    // menu_Exception (상태코드 400)
    NOT_FOUND_MENU(HttpStatus.BAD_REQUEST, " 해당 메뉴가 존재하지 않습니다."),

 

enum 으로 에러 메세지를 상수화 시켜놨다.

이처럼 여기에 팀원들끼리 소통해서 에러 메세지를 설정하고, HttpStatus 옆에는 알맞는 원하는 에러코드를 설정한다.

 

GlobalException

@Getter
public class GlobalException extends RuntimeException {

    private final HttpStatus httpStatus;

    // 상수 -> 상태 코드랑 메시지가 담겨있다.
    public GlobalException(GlobalExceptionConst globalExceptionConst) {
        super(globalExceptionConst.name() + globalExceptionConst.getMessage());
        this.httpStatus = globalExceptionConst.getHttpStatus();
    }
}

 

GlobalExceptionHandler

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(GlobalException.class)
    public ResponseEntity<ErrorResult> handlerGlobalException(GlobalException e) {
        return new ResponseEntity<>(new ErrorResult(e.getMessage()), e.getHttpStatus());
    }
}

 

ErrorResult

@Getter
@AllArgsConstructor
public class ErrorResult {
    private String message;
}