우리는 웹애플리케이션을 제작할 때 몇가지의 예외처리를 통해 프로그램이 안정해지도록 한다. 그리고 예외처리를 통해 발생된 오류들에 관한 메세지가 정확히 어떤 부분에서, 어떤 것 때문에 벌어졌는지를 알고 싶어 한다.

 

하지만 에러가 나면 웹애플리케이션이 우리에게 전해주는 정보는 그리 많지 않다. 기껏해야 에러코드 정도에 불과한 정보를 전달해준다.

 

원하는 에러정보를 얻기 위해서 우리는 @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

+ Recent posts