본문 바로가기
스프링 관련/스프링

exception

by 문자메일 2023. 1. 15.

패키지 구성 기본 뼈대

- exception

-> 사용자정의 exception class

-> 사용자정의 exception class Handling하는 클래스

-> 에러코드 enum 클래스

 

https://charactermail.tistory.com/490

 

@RestControllerAdvice, @ExceptionHandler(RuntimeException.class) 이용한 예외처리 분리

@RestControllerAdvice : 스프링 빈에 등록된 @Controller, @RestController 클래스 전체 대상으로 @ExceptionHandler를 적용할 수 있는 설정 @ExceptionHandler : @Controller, @RestController 클래스 안에서 예외가 발생한 것을

charactermail.tistory.com

 

간단한 존재 이유 : Controller Class 에서 메서드 마다 예외 처리하는 로직을 넣으면 코드도 지저분해지고 로직도 많이 중복된다.

그런 경우 때문에 controller에서 발생하는 exception을 따로 빼서 외부에서 처리할 수 있는 기능을 @RestControllerAdvice, @ExceptionHandler 어노테이션을 이용해서 구현할 수 있다.

위 2개 어노테이션에 대한 설명은 위 url 참조.

 

대략적으로 exception package 하위에는 3개 class 파일 존재

1. @RestControllerAdvice, @ExceptionHandler 어노테이션 붙여서 핸들링 하는 파일 (GlobalControllerExceptionHandler)

2. Custom하게 만든 Exception 파일 (SampleException)

3. Custom하게 에러 코드 만들어서 저장하는 Enum 파일 (ErrorCode) 

 

@Slf4j
@RestControllerAdvice
public class GlobalControllerExceptionHandler {

    @ExceptionHandler(SampleException.class)
    public ResponseEntity<?> handleSampleException(SampleException e){
        log.error("Error occurs {}", e.toString());
        return ResponseEntity.status(e.getErrorCode().getStatus()).body(
                //Response.error(ErrorCode.INTERNAL_SERVER_ERROR.name())
                ""
        );
    }

    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<?> handleRuntimeException(RuntimeException e){
        log.error("Error occurs {}", e.toString());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(
                        ""
                        //Response.error(ErrorCode.INTERNAL_SERVER_ERROR.name())
                );
    }
}

 

 

@Getter
@AllArgsConstructor
public class SampleException extends RuntimeException{

    private ErrorCode errorCode;
    private String message;

    public SampleException(ErrorCode errorCode) {
        this.errorCode = errorCode;
        this.message = null;
    }

    public String getMessage(){
        if(message == null){
            return errorCode.getMessage();
        }

        return String.format("%s %s", errorCode.getMessage());
    }
}

 

@Getter
@AllArgsConstructor
public enum ErrorCode {
    DUPLICATED_USER_NAME(HttpStatus.CONFLICT, "User name is duplicated"),
    USER_NOT_FOUND(HttpStatus.NOT_FOUND, "User not founded"),
    INVALID_PASSWORD(HttpStatus.UNAUTHORIZED, "Password is invalid"),
    INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "Token is invalid"),
    POST_NOT_FOUND(HttpStatus.NOT_FOUND, "Post not founded"),
    INVALID_PERMISSION(HttpStatus.UNAUTHORIZED, "Permission is invalid"),
    INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "Internal server error"),
    ALREADY_LIKED(HttpStatus.CONFLICT, "User already liked the post"),
    ALARM_CONNECT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "Connecting alarm occurs error");
    ;

    private HttpStatus status;
    private String message;
}

 

'스프링 관련 > 스프링' 카테고리의 다른 글

테스트 (Junit) 관련 포스팅 index 페이지  (0) 2023.01.16
dto  (0) 2023.01.15
controller  (0) 2023.01.15
repository  (0) 2023.01.15
domain  (0) 2023.01.14

댓글