9.1 예외 처리란?
Spring의 기본적인 예외처리
- White level 페이지는 스프링이 기본적으로 해준는 예외 처리 중 하나이다.
- bad request
- Java지원 예외처리: try-catch
- custom exception을 만들어서 처리한다.
Ex) Custom Exception
- 예외 상황을 위한 예외 클래스 InvalidDate를 만든다. RuntimeException를 상속 받는다.
- RuntimeException코드를 보면 아래과 같이 에러메시지를 매개변수로 줄 수 있다.
<hide/>
public RuntimeException(String message) {
super(message);
}
- InvalidDate 클래스
- 아래와 같이 작성하면 InvalidDate가 호출될 때 메시지가 함께 반환된다.
<hide/>
package zerobase.weather.error;
public class InvalidDate extends RuntimeException {
private static final String MESSAGE = "너무 과거 혹은 미래의 날짜입니다.";
public InvalidDate(){
super(MESSAGE);
}
}
- readDiary메서드 예외 처리 해보자
- ofYearDay() : year와 day를 이용해서 LocalDate객체를 만드는 함수
<hide/>
@Transactional(readOnly = true)
public List<Diary> readDiary(LocalDate date) {
if(date.isAfter(LocalDate.ofYearDay(3050, 1))){
throw new InvalidDate();
}
return diaryRepository.findAllByDate(date);
}
Note) 실행 결과 - GET: http://localhost:8080/read/diary?date=4000-01-01
- 500 에러
- 스프링 화면
9.2 Exception Handler 작성
@Exception Handler - 컨트롤러 안에서만 예외처리
- @Controller 또는 @RestController의 예외를 하나의 메서드에서 처리해주는 기능이다.
- 주의) 하나의 @Controller안에 하나의 Handler를 두면 그 컨트롤러 안에서만 예외를 잡아준다. (프로젝트 전체를 잡아주는 것이 아니다.)
- ex) @ExceptionHandler(InvalidDate.class): InvalidDate가 발생한 경우에만 핸들러가 동작한다.
@ControllerAdvice - 전역 예외 처리
- @ControllerAdvice는 프로젝트 안의 모든 @Controller에 대해서 예외가 발생한 것을 잡아준다. (@ExceptionHandler와의 차이점)
- 여러 Controller에 동일한 코드를 쓸 필요없다.
- @ControllerAdvice를 붙인 클래스를 만들어서 클래스 안에 전역 예외가 모이도록 설정한다.
- 그리고 그 예외를 @ExceptionHandler가 처리하도록 한다.
Ex) ControllerAdvice
- 자바로 되어 있지만 프로젝트 전체의 설정과 관련된 클래스는 보통 config 패키지에 저장한다.
- GlobalExceptionHandler 만든다.
- @ResponseStatus: 예외가 발생한 경우 GlobalExceptionHandler가 예외를 찾았다. 그런데 만약 클라이언트가 API를 호출한 시점인 경우에 어떻게 반환할 것인지 설정 가능하다.
<hide/>
package zerobase.weather.config;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import zerobase.weather.error.InvalidDate;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class) // 모든 예외에 대해 동작하도록 Exception
public Exception handleAllException(){
System.out.println("Error from GlobalExceptionHandler ");
return new InvalidDate();
}
}
- invalidDate()가 사용된 부분 주석처리한다.
Note) 실행 결과 GET - http://localhost:8080/read/diary?date=gdfgfgdf
- 유효하지 않은 데이터를 넣은 경우이다.
- 아래와 같이 log도 출력된다.
출처 - 제로베이스 백엔드 스쿨 (김조현 강사님)
'Spring Projcect > 날씨 일기 프로젝트' 카테고리의 다른 글
Chapter 10. API document 만들기 (API 문서화) (2) | 2022.09.01 |
---|---|
Chapter 08. 로그(log) 남기기 (0) | 2022.09.01 |
Chapter 07. 날씨 저장 스케쥴링 (0) | 2022.09.01 |
Chapter 06. Spring Transaction(스프링 트랜잭션) (0) | 2022.08.31 |
Chapter 05. 날씨 데이터 CRUD (0) | 2022.08.31 |