its_jh_stroy

[Springboot] 예외 한 번에 처리하기 본문

Java

[Springboot] 예외 한 번에 처리하기

_J_H_ 2024. 6. 23. 17:50

REST API 서버에서 예외 한 번에 처리하기

웹 개발에서 가장 기본적인 예외 처리 방식은 컨트롤러에 try~catch 문을 작성하여 예외를 처리하는 것이다.

이러한 방식은 클래스 내 메서드가 많아질수록 중복된 코드도 많아지게 된다.

 

클래스 내부에서 예외를 한 번에 처리하기

ExceptionHandler 어노테이션을 사용하면 예외를 한 번에 처리할 수 있다.

@RestController
@RequiredArgsConstructor 
public class ItemController {

    // ...

    @GetMapping("/list")
    String list(Model model) throws Exception {
        List<Item> result = itemRepository.findAll();

        model.addAttribute("items", result);
        return "list.html";
    }

    @ExceptionHandler(Exception.class)
    public void handler() { }
}

 

 

위와 같이 ExceptionHandler 어노테이션을 사용하면 파라미터로 작성한 Exception 예외에 대한 처리를 handler() 메서드에서 실행한다.

예외를 넘길 수 있도록 메서드에 "throws Exception"를 꼭 작성해야 한다.

그런데 이러한 방식도 문제가 있다.

컨트롤러의 수가 많아질수록 중복되는 코드가 늘어날 것이다.

 

모든 클래스의 예외를 한 번에 처리하기

ControllerAdvice와 ExceptionHandler 어노테이션을 활용하면 모든 컨트롤러에 대해 예외 처리를 할 수 있다.

마찬가지로 컨트롤러의 메서드에서 예외를 넘길 수 있도록 "throws Exception"를 작성해야 한다.

@GetMapping("/list")
String list(Model model) throws Exception { }

@ControllerAdvice
public class MyExceptionHandler {
    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    public ResponseEntity<String> handler1() {
        return ResponseEntity.status(400).body("매개변수 타입이 안 맞아요.");
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handler2() {
        return ResponseEntity.status(400).body("최후의 예외 처리");
    }
}