당연히 예외에 대해 처리를 할 수 있도록 만들어야 한다.
이런 부분들은 보통 Service단에 try-catch로 정의를 했지만, 항상 보며 느끼는 부분은 코드가 지저분해지고 가독성이 많이 떨어진다.
어떻게 할지 고민하던 중, 실습 기간 대리님께서 RestControllerAdvice를 써보라고 하셔서 이번 프로젝트에는 이것을 이용해 예외 처리를 최대한 깔끔하게 해보려고 한다.
그냥 사용하려면 방법은 어렵지 않다.
@RestControllerAdvice
그냥 이런 annotation을 가지고 있는 class를 정의해준다.
그리고 안에
@ExceptionHandler(Exception.class)
public ResponseEntity<String> GlobalHandler() {
return new ResponseEntity<>("에러, 자세한 상황을 보고해주세요", HttpStatus.BAD_REQUEST);
}
이렇게 어떤 에러를 어떻게 처리할 것인지 작성을 해준다.
물론 이렇게 작성해버리면 모든 에러가 여기에서 잡혀버리기 때문에 Exception.class는 안 쓸 거 같다.
근데 이걸 사용하려니 한 가지 걸리는 부분이 있었다.
만약 SQLException이 발생했다고 하자, 하지만 이 에러가 어느 컨트롤러에서 발생했는 지에 따라 다른 오류일텐데 Global로 처리를 해버리면 똑같이 처리 과정을 거치게 된다.
그래서 나는 각 Controller에 다른 handler를 사용하기 위해
@RestControllerAdvice(basePackageClasses = ???.class)
이렇게 어떤 컨드롤러인지 basePackageClasses에 명시해서 해당 컨트롤러만 사용하도록 만들었다.
그러면 또 여기서 문제가 생긴다.
공통적으로 발생하는 예외들은 다 복붙을 해서 적어야 하나...
솔직히 얼마 안 걸리지만, 중복되는 코드들을 계속 적는 부분이 마음에 걸렸다.
그렇기에 Global 부분에
package cobo.blog.global.Config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import java.sql.SQLException;
import java.sql.SQLTimeoutException;
@Slf4j
public class GlobalExceptionHandler {
/**
* DB 관련 에러
*/
@ExceptionHandler(SQLTimeoutException.class)
public ResponseEntity<String> GlobalSQLTimeoutHandler(){
log.info("GlobalSQLTimeoutHandler: {}", this.getClass());
return new ResponseEntity<>("데이터베이스 접근 시간 초과", HttpStatus.REQUEST_TIMEOUT);
}
@ExceptionHandler(SQLException.class)
public ResponseEntity<String> GlobalSQLHandler(){
log.info("GlobalSQLHandler: {}", this.getClass());
return new ResponseEntity<>("데이터 베이스 관련 에러, 자세한 상황을 보고해주세요", HttpStatus.BAD_REQUEST);
}
}
이런 식으로 공통부분은 구현을 하며, 각 세부 컨트롤러에서 상속을 받아 더 세부적으로 작업할 수 있도록 하였다.
오랫동안 생각해 본 결과 이 방법이 지금 내가 할 수 있는 최선의 방법이라고 생각했고, 후에는 아마 다른 방법도 사용하지 않을까?
'블로그 개발 프로젝트' 카테고리의 다른 글
Nginx에 페이지 연결하기 (0) | 2023.08.07 |
---|---|
EC2에 Nginx 초기 설정 (0) | 2023.08.05 |
Swagger @ApiModelProperty에 example List (0) | 2023.07.28 |
Swagger Response (0) | 2023.07.28 |
CORS Error (0) | 2023.07.28 |