1. JAVA의 예외처리
Exception
특수한 처리를 필요로 하는 비상적 또는 예외적 상황
1. try-catch 사용
try : 예외 일어날 수 있는 구역
catch : 예외 발생 시 실행
finally : 예외의 발생과 무관
2. throws
- 함수 호출하는 대상이 method signiture을 보고 그 예외
- 예외처리를 호출하는 대상에게 전가
- 처리되지 않은 예외는 compile error를 발생시킴 (Runtime Exception 제외)
2. Spring Boot의 예외처리 방법들
- ResponseStatusException : 단발적 예외
- @ExceptionHandler : controller 내부 예외 처리
- HandlerExceptionResolver : 예외 처리 handler 전역적
- @ControllerAdvice : ExceptionHandler 모음
3.ResponseStatusException
ExceptTestController 생성
- 일반적으로 예외 사용하듯이 이용 sb 내부에서 자동적으로 처리할 준비 완료
- 빠르게 기능 구현하고 오류 지정할 때 쉽게 사용 가능
- ResponseStatusException가 어느 시점에서 일어나는지 잘 모아두면 예외처리 규칙 만들어 낼 수 있음
초기 단계에서 많이 사용
4.@ExceptionHandler
exceptionhandler 을 controller, handler안에서 선언
함수는 지정된 예외 처리 할 때 동작함
1. 실습
예외들 생성 ->exception package 생성
1) Base Exception : 상속받을 상위 exception
public abstract class BaseException extend RuntimeException{
}
2) PostNotExistException
public class PostNotExistException extend BaseException{
}
3) ExceptionHandler 수정
- ExceptionHandler(BaseException.class)->exception을 넣음
- 이 controller 내부에서 발생하는 모든 exception 처리
- 함수의 인자로 처리하고자하는 exception받을 수 있음
- 스프링 내부 존재 annotation -> 응답 조정에 필요한 객체 자동 주입해줌
4) annotation 기반 처리하는 방법
응답 돌려주기 -> exception 패키지 안에 ErrorResponseDto 생성
5) ErrorResponseDto
public class ErrorResponseDto{
private String message;
//constructer
//getter&setter
//toString
}
6) 메세지 줄 수 있게
PostNotExistException에
super("Targetpost does not exist"); 추가
BaseException에
generate ->RuntimeException 생성
7) InconsistentDataException
게시판에 있는 게시글이 없을 경우 발생 예외
controller에 case2 추가
2. 정리
excpetionhandler는 자신이 선언된 컨트롤러 내부에서만 작동
PostController에서 exception 던져져도 처리 할 방법이 없음
@GetMapping("test-exception")
public void throwException(){
throw new PostNotExistException();
}
}
5. HandlerExceptionResolver
spring에서 제공하는 interface 중 하나
전체 application에서 발생하는 예외 처리 가능
1.실습
handler package 제작
1) application.yml
logging:
level:
dev.package명.jpa.handler : debug
.
2)PostExceptionResolver
public class PostExceptionResolver extends AbstractHandlerExceptionResolver{
@Override
protected ModelAndView doResolveException (HttpServeltRequest request,
HttpServletResponse response,
Object handler,
Exception ex){
logger.debug(ex.getClass());
return null;
}
}
- HandlerExceptionResolver 실제로 사용하게되는 인터페이스의 종류
- 실제로 스프링 exception을 처리하기 위한 모든 인터페이스의 기초
- return null : 함수가 실행은 됐지만 handler가 처리하지 못했다는 뜻
-ExceptionResolver가 ExceptionHandler나 ContorllerAdvise만큼 다양하게 존재
- component 붙여야 bean에 등록돼서 자동으로 들어감
- 함수가 ModelAndView 를 돌려줘야됨 -> 스프링도 html 랜더같은 걸 할 수 있으니
3)object 추가
public class PostExceptionResolver extends AbstractHandlerExceptionResolver{
@Override
protected ModelAndView doResolveException (HttpServeltRequest request,
HttpServletResponse response,
Object handler,
Exception ex){
logger.debug(ex.getClass());
if( ex instance of BaseException){
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
try{
response.getOutputStream().print(
new ObjectmAPPER().writeValueAsString)
new ErrorResponseDto("in resolver, message:" +ex.getMessage()
);
response.setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE);
return new ModelAndView();
}catch (IOException e){
logger warn("Handling exception caused exception : {}", e);}
}
return null;
}
}
ServletResponse를 받아온 상태임으로 조작해야됨
new ObjectMapper : model을 json으로 바꾸는 것 도와줌
[object 받기]
if( ex instance of BaseException){
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
try{
response.getOutputStream().print(
new ObjectmAPPER().writeValueAsString)
new ErrorResponseDto("in resolver, message:" +ex.getMessage()
);
[object가 어떤 형태로 작성됐는지 알리기]
response.setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE);
return new ModelAndView();
6. @ControllerAdvice
0. ControllerAdvice
- 모든 controller에 있는 exceptionhandler를 한 곳으로 가져오기 위해 만듬
- bean annotation중 하나
- component의 일종
1. 실습
PostControllerAdvice 제작
- ControllerAdvice, ResponseStatus를 이용해 json의 형태로 return
- controller와 restcontroller의 차이처럼controllerAdvice와 RestControllerAdvice도 차이 있음
- restcontrollerAdvice : responsebody annotation을 빼줘도 됨
'SpringBoot' 카테고리의 다른 글
Interceptors & Filters (0) | 2022.03.24 |
---|---|
Validation - 강의정리 (0) | 2022.03.22 |
Spring AOP -강의정리 (0) | 2022.03.22 |
Logging -강의 (0) | 2022.03.22 |
Spring Boot Properties - 강의 정리 (0) | 2022.03.22 |