우리는 웹애플리케이션을 제작할 때 몇가지의 예외처리를 통해 프로그램이 안정해지도록 한다. 그리고 예외처리를 통해 발생된 오류들에 관한 메세지가 정확히 어떤 부분에서, 어떤 것 때문에 벌어졌는지를 알고 싶어 한다.
하지만 에러가 나면 웹애플리케이션이 우리에게 전해주는 정보는 그리 많지 않다. 기껏해야 에러코드 정도에 불과한 정보를 전달해준다.
원하는 에러정보를 얻기 위해서 우리는 @ExceptionHandler를 사용할 것이다.
@ExceptionHandler
package com.example.exception.advice;
import ...
@RestControllerAdvice
public class GlobalControllerAdvice {
@ExceptionHandler(value = Exception.class)
public ResponseEntity exception(Exception e){
System.out.println(e.getClass().getName());
System.out.println("--------------");
System.out.println(e.getLocalizedMessage());
System.out.println("--------------");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
위에서 보이는 코드 중 @ExceptionHandler(value = Exception.class)를 주목하자. 이는 발생하는 모든 예외를 캐치하겠다는 것이다. 예외를 캐치하면 아래의 로직이 진행된다.
아래의 @ExceptionHandler(value = MethodArgumentNotValidException.class)부분은 원하는 에러만을 골라서 메세지를 출력하는 과정이다.
위에서의 경우는 프로그램을 실행했을 때 발생하는 모든 오류에 대한 예외처리지만 내가 원하는 부분에서만 에러가 발생한 것을 캐치하고 싶을 때는 다음과 같이 설정하면 된다.
package com.example.exception.controller;
import com.example.exception.dto.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/api/user")
public class ApiController {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
System.out.println("api Controller");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
위의 코드는 중간이 생략된 코드이다.
아까전에 GlobalControllerAdvice에 예외처리를 위한 ExceptionHandler를 사용했는데 좀 더 범위를 좁혀서 ApiController내의 에러를 캐치하는 ExceptionHandler를 사용하였다. ApiController에서 ExceptionHandler를 제외한 상태에서 예외가 발생했을 때는 GlobalControllerAdvice에서 사용한 ExceptionHandler가 작동해 해당 메세지를 출력하는데 위처럼 ApiController에 ExceptionHandler를 사용하면 ApiController내에서 예외를 캐치할 때 "api Controller"가 출력된다.
'웹 개발 일기 > Spring' 카테고리의 다른 글
Rest Template를 사용한 Server간의 연결 (0) | 2021.06.18 |
---|---|
Filter / Interceptor (0) | 2021.06.17 |
AOP(Aspect Oriented Programming) (0) | 2021.06.15 |
Spring Boot Annotation(2) (0) | 2021.06.15 |
Spring Boot Validation (0) | 2021.06.15 |