Spring Projcect/날씨 일기 프로젝트

Chanpter 09. 예외 처리하기

계란💕 2022. 9. 1. 14:35

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도 출력된다.

 

 

 

 

출처 - 제로베이스 백엔드 스쿨 (김조현 강사님)

https://zero-base.co.kr/

 

제로베이스 - 누구나 취업하는 가장 합리적인 취업 스쿨

코딩 부트 캠프 개발자, 데이터 사이언티스트, 마케터, PM, 디자이너 등 제대로 공부하고 확실하게 취업하세요. 당신의 삶의 전환점이 될 제로베이스 스쿨입니다.

zero-base.co.kr