[스프링부트] - Controller Advice
Controller Advice란
API동작 중에 예외가 발생했을 때, 예외를 바로 사용자에게 반환하는 것은 불필요하고, 심하면 공격까지 받을 수 있다.
그래서 이를 적절히 처리해주는 역할을 하는 것이 바로 Controller Advice읻.
@Controller Advice
이 어노테이션 붙은 클래스 파일은 애플리케이션 내 모든 컨트롤러에서 발생하는 예외를 처리할 수 있다.
즉, 매핑 메서드 실행중 발생한 예외를 가로채는 exceptions interceptor라고 생각하면 된다.
Controller Advice 사용이유?
- 예외처리를 한 곳에 묶어서 편하게 관리
- 처리가 제대로 되지 못한 부분에 예외발생 시 브라우저에 모든 예측하지 못한 예외도 한꺼번에 처리 가능
- 컨틀롤러의 역할에 집중할 수 있고, 코드 중복 제거, 관심사의 분리를 이뤄낼 수 있다.
PostController.java
package com.example.controller_advice.controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/post")
public class PostController {
@PostMapping("/create")
public String createPost(
@RequestParam(required = false) String title
) {
// System.out.println(4/0);
// 코드 작성
if(title == null) throw new NullPointerException("제목이 없습니다.");
if(title.length() <= 3) throw new IllegalArgumentException(
"제목이 너무 짧습니다."
);
return "게시글 등록 완료";
}
}
컨트롤러는 정말 간단하게 title값이 null이거나 title의 길이가 3이하면 예외를 던져주기만 하면 된다.
ControllerAdvice.java
package com.example.controller_advice.advice;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.WebRequest;
import java.util.*;
@ControllerAdvice
public class GlobalExceptionHandler {
// NullPointerException, IllegalArgumentException 예외만 처리
@ExceptionHandler({ NullPointerException.class, IllegalArgumentException.class })
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public Map<String, Object> handleCommonExceptions(Exception e, WebRequest request) {
Map<String, Object> error = new HashMap<>();
error.put("message", e.getMessage());
error.put("status", "fail");
return error;
}
}
ControllerAdvice는
ExceptionHandler로 예외 타입을
NullPointerException과 IllegalArgumentExcetion의 예외처리를 받으면
@ResponseStatus
handleCommonException으로 예외를 성공적으로 처리했을 때 클라이언트에게 응답으로 보낼 HTTP 상태코드를 지정
HttpStatus.BAD_REQUEST로 클라이언트 요청이 잘못되었음을 의미하는 400Bad request를 의미한다.
@ResponseBody
메소드 반환값을 HTTP응답 본문으로 사용하겠다는 것을 나타낸다.
메소드 반환값을 JSON으로 나타내주기 위해서 맵 자료구조를 사용하여
맵 형식의 error에 예외처리 객체 e를 받아서 넣어주고
"status"를 fail로 준 뒤 error를 리턴해준다.
Request본문에 title의 길이를 3보다 짧게 줬을 때
Request본문에 title값을 안줬을 때
잘 뜨는 것을 확인할 수 있다.