v4 - 에러 컨트롤러 만들기 및 커스텀 exception 만들기

coding S's avatar
Mar 16, 2024
v4 - 에러 컨트롤러 만들기 및 커스텀 exception 만들기

핸들러의 필요성

notion image
💡
executeUpdate() 하다가 터지면 어떻게 하지…? 내부적으로 터지면 에러 페이지 리턴을 못하는데… 컨트롤러가 아니니까!
notion image
💡
그럼 이런 식으로 레이어마다 엄청나게 귀찮게 이런 로직 처리를 해야하나?

아니!!! 핸들러를 사용하면 돼!!

💡
그냥 터뜨려버리고 핸들러를 사용하자!
notion image
 

[ 에러 컨트롤러 만들기 ]

notion image
ExceptionHandler라는 이름으로 만들면 안된다. 이미 클래스가 있기 때문!!!
notion image
💡
throw나 Exception이 발생하면 다 여기로 오게 만들거다!! 에러만 터뜨리는 클래스! 핸들러!

주의할 것 !!! ★

notion image
💡
이렇게 적으면 안 됨! 모든 Exception이 다 일로 오니까. ex400만 계속 터질 것이다. 동물(RuntimeException) 을 걸어놔서 세세한 구분 없이 다 터져버림

[ 왜 그럴까? ]

notion image
💡
동물이 터지면 둘 다 가겠지… 그러나! 고양이가 터지면 a 오류 페이지로 가게 할 것이고, 강아지가 터지면 a 오류 페이지로는 가지 않게 할 것이다! → 즉, 고양이가 터진다고 강아지가 터지면 안 됨!
notion image
💡
이렇게 하나씩 다 만들어줘야 한다. 어디로 갈 지 모르니까! → 커스텀이 필요하다! 커스텀 하자! 다형성으로 상속하는 자식을 만들자!!
 

[ 커스텀 exception 만들자! ]

notion image
 

Exception400

package shop.mtcoding.blog._core.errs.exception; public class Exception400 extends RuntimeException { public Exception400(String msg) { super(msg); } }

Exception401

package shop.mtcoding.blog._core.errs.exception; public class Exception401 extends RuntimeException { public Exception401(String msg) { super(msg); } }

Exception403

package shop.mtcoding.blog._core.errs.exception; public class Exception403 extends RuntimeException { public Exception403(String msg) { super(msg); } }

Exception404

package shop.mtcoding.blog._core.errs.exception; public class Exception404 extends RuntimeException { public Exception404(String msg) { super(msg); } }

Exception500

package shop.mtcoding.blog._core.errs.exception; public class Exception500 extends RuntimeException { public Exception500(String msg) { super(msg); } }
💡
이제 throw exception400, throw exception403 이런 식으로, 내가 터뜨리고 싶은 에러 페이지를 골라서 터트릴 수가 있게 됨!!
 

[ MyExceptionHandler - 컨트롤러 ]

package shop.mtcoding.blog._core.errs; import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import shop.mtcoding.blog._core.errs.exception.*; //RuntimeException이 터지면 해당 파일로 오류가 모인다!! @ControllerAdvice public class MyExceptionHandler { //애는 Exception @ExceptionHandler(Exception400.class) public String ex400(Exception e, HttpServletRequest request) { request.setAttribute("msg", e.getMessage()); return "err/400"; } //애는 Exception @ExceptionHandler(Exception401.class) public String ex401(Exception e, HttpServletRequest request) { request.setAttribute("msg", e.getMessage()); return "err/401"; } //애네들은 RuntimeException @ExceptionHandler(Exception403.class) public String ex403(RuntimeException e, HttpServletRequest request) { request.setAttribute("msg", e.getMessage()); return "err/403"; } @ExceptionHandler(Exception404.class) public String ex404(RuntimeException e, HttpServletRequest request) { request.setAttribute("msg", e.getMessage()); return "err/404"; } @ExceptionHandler(Exception500.class) public String ex500(RuntimeException e, HttpServletRequest request) { request.setAttribute("msg", e.getMessage()); return "err/500"; } }
애네들은 내가 잡을 수 있는 에러들인데... 내가 못 잡는 모든 exception... 에러는 어떻게 하는걸까? -> unknown이란 걸 하나 더 만들어줌!
 

[ unknown ]

notion image
💡
NullPointException 이런건 커스텀 되어있지 않으니까 exUnknown으로 간다. StackOverFlow 이런 것도 unknown으로 간다! ClassCastingException 이런 것도!! 내가 못 잡은 에러들은 전부 이쪽으로!! 내가 잡은 에러들은 커스텀 되어있는 쪽으로 직접 던짐!!
💡
그러나… 우리는 지금 공부를 해야하니까, unknown은 생성하지 않는다. → 하나하나 다 잡아라!
 

작동 하는지 잠깐 확인해보자

notion image
💡
임시 코드! 작동 되는지 확인만 해보고 지우자!
notion image
notion image
💡
이 생성자로 가서 치는 것! > super를 잘 모르겠으면 자바 공부를 한 번 더 하자! super = 자식이 부모 클래스한테 접근할 때 사용. Exception401이 RuntimeException에게 접근 가능 (부모 클래스의 멤버를 호출하거나 재정의)
 
Share article

codingb