DB
값이 존재하지 않는 Id가 1인 데이터를 삭제해보자.
Controller
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id) {
User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
@Override
public IllegalArgumentException get() {
return new IllegalArgumentException("해당 유저는 없습니다. id : " + id);
}
});
return user;
}
http://localhost:8001/blog/dummy/user/1 로 1번 데이터 삭제를 요청해보자
당연히 아래와 같이 오류페이지가 StackTrace와 함께 나온다.
그런데 클라이언트 입장에서 저런 오류메시지가 나온다면 불필요하기도 하고 무섭지 않을까..
StackTrace를 제외하고 간단하게 오류 문구만 보여지게 해보자!!
먼저 Package를 생성하고 아래와 같이 Class파일을 만들어주자
GlobalExceptionHandler.java --> 예외가 발생했을때 이 파일을 타게 된다.
package com.lwj.blog.handler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
@ControllerAdvice // 어느파일에서나 Exception이 발생해도 이 함수를 타게하기 위한 어노테이션
@RestController
public class GlobalExceptionHandler {
@ExceptionHandler(value=IllegalArgumentException.class)
public String handleArgumentException(IllegalArgumentException e) {
return "<h1>" + e.getMessage() + "</h1>";
}
}
근데 이렇게 문자열을 반환하는거 말고 오류가 발생했을때 jsp파일을 요청하고 싶다면
아래와 같이 @RestController를 지우고 반환값으로 jsp파일명을 써주면 된다.
@ControllerAdvice // 어느파일에서나 Exception이 발생해도 이 함수를 타게하기 위한 어노테이션
public class GlobalExceptionHandler {
@ExceptionHandler(value=IllegalArgumentException.class)
public String handleArgumentException(IllegalArgumentException e) {
return "error"; // /WEB-INF/views/error.jsp 로 요청한다
}
}
참고 유튜브 (메타코딩님 강의)
https://youtu.be/qYxWWWVpJkA?si=b5NO0_FzHuhJ9trY