
Exception Handler라는 곳에 모이게 된다서버는 항상 요청을 하면, 🤔응답은 OK즉 성공 아니면 실패 둘중에 하나이다!!
ExceptionHandler에서 성공응답과, 실패응답을 내주면 된다ErrorCodeIfs를 만들어 놨기 때문에, 이를 구현한 에러를 만들어서 상황에 맞게 실패응답을 내려주면 되는 것이다
@Slf4j
@RestControllerAdvice
@Order(value = Integer.MAX_VALUE) // 가장 마지막에 실행 적용
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Api<Object>> exception(Exception exception){
log.error("",exception);
return ResponseEntity.status(500).body(Api.ERROR(ErrorCode.SERVER_ERROR));
}
@RestControllerAdvice : ExceptionHandler을 AOP적용해 예외를 전역적으로 처리할 수 있게 하는 어노테이션@Order : 순서를 지정해주는 어노테이션, 작을 수록 우선순위이다@ExceptionHandler : 스프링에서 어노테이션을 이용하여서, 간단하게 예외처리를 할 수 있다@RestControllerAdvice로 예외를 모아 전역적으로 처리할 수 있게 만들고, @ExceptionHandler을 이용해 예외를 처리한다
ResponseEntity에 500 상태코드를 적고, body에 Api.ERROR을 넣어서 반환한다

ResponseEntity<Api<AccountMeResponse>>로 바꿔주야 한다결국 보면
✅Api의 응답은성공아니면실패이다
- 모든 에러 코드는 @ExceptionHandler를 통해, Exception Handler부분에서 처리가 가능하다
- 그리고 이부분에서 errorCode에 대한 StackTrace를 모두 모아, debugging을 할 것이다
- 결국 예외처리를 하지 않는 이상 굳이 try,catch를 할 필요가 없다
✅코드의 분리!!!
- 우리가 작성하는 컨트롤러, ✅서비스 코드는 항상
성공 케이스만 본다- 그 부분에서, Error가 나는 것들은 -> 예외 처리 핸들러를 이용해 한자리에 모아서, StackTrace를 찍은 후에, 응답을 내려준다
우리는 이 ✅StackTrace를 가지고 debugging을 잘 해주면 된다!
- stack trace는 어디에서 오류가 났는지, 어떤 이유인지 ... 등등 자세하게 내려줘야 한다
- 아주 중요하다
@Getter
public class ApiException extends RuntimeException implements ApiExceptionIfs{
private final ErrorCodeIfs errorCodeIfs;
private final String errorDescription;
public ApiException(ErrorCodeIfs errorCodeIfs){
super(errorCodeIfs.getDescription());
this.errorCodeIfs = errorCodeIfs;
this.errorDescription = errorCodeIfs.getDescription();
}
public ApiException(ErrorCodeIfs errorCodeIfs, String errorDescription){
super(errorDescription);
this.errorCodeIfs = errorCodeIfs;
this.errorDescription = errorDescription;
}
public ApiException(ErrorCodeIfs errorCodeIfs, Throwable tx){
super(tx);
this.errorCodeIfs = errorCodeIfs;
this.errorDescription = errorCodeIfs.getDescription();
}
public ApiException(ErrorCodeIfs errorCodeIfs, Throwable tx, String errorDescription){
super(tx);
this.errorCodeIfs = errorCodeIfs;
this.errorDescription = errorDescription;
}
}
public interface ApiExceptionIfs {
ErrorCodeIfs getErrorCodeIfs();
String getErrorDescription();
}
@Slf4j
@RestControllerAdvice
@Order(value = Integer.MIN_VALUE) // 최우선 처리
public class ApiExceptionHandler {
@ExceptionHandler(value = ApiException.class)
public ResponseEntity<Api<Object>> apiException(ApiException apiException){
log.error("",apiException);
ErrorCodeIfs errorCode = apiException.getErrorCodeIfs();
return ResponseEntity
.status(errorCode.getHttpStatusCode())
.body(Api.ERROR(errorCode, apiException.getErrorDescription()));
}
}
@ExceptionHandler(value = ApiException.class)로 apiException을 처리한다Api<>의 result부분에 넣어 반환해준다
- ApiException은 예외랑, 예외설명을 가지고 있다
- ApiException발생 -> ApiExceptionHandler로 이동
- Handler는 ApiException에서 예외와 설명을 꺼낸후, 반환값 responseEntity에 status값을 채우고
- body는 비었고, result의 3개의 필드에, 예외와 설명을 가지고 값을 채운 ✅
Api<Object>(result부분에 값을 채운) 을 반환해준다!!!