현재 진행 중인 프로젝트에 내가 원하는 로직대로 Exception을 처리해둔 부분이 있지만 그렇지 않은 곳도 있어 한 번 다뤄보려고 한다.
예외 처리 부분을 보기 좋게 고치기
'@ExceptionHandler'를 반드시 사용하기
a. 'RestaurantController', 'OrderController'
b. 'RestaurantService', 'FoodService', 'OrderService'
'FoodService'나 'OrderService'의 Exception이 주된 수정의 대상이 될 것 같다.
throw new FoodNameExistException("name:'" + food.getName() + "'은/는 이미 존재하는 음식명입니다");
Restaurant findRestaurant = restaurantRepository.findById(restaurantId).orElseThrow(
() -> new IllegalArgumentException("restaurant:존재하지 않는 음식점입니다")
);
restaurantRepository.findById(restaurantId).orElseThrow(
() -> new NoSuchElementException("해당 음식점이 존재하지 않습니다.")
);
restaurantRepository.findById(restaurantId).orElseThrow(
() -> new NullPointerException("존재하지 않는 음식점입니다")
);
foodRepository.findById(foodOrderInfo.getId()).orElseThrow(
() -> new NullPointerException("존재하지 않는 음식입니다")
);
FoodNameExistException -> FoodAlreadyExistException
읽었을 때 더 확실히 눈에 들어온다는 판한 하에 변경하였다.
return restaurantRepository.findById(restaurantId).orElseThrow(
() -> new GlobalExistException("존재하지 않는 음식점입니다")
;
return foodRepository.findById(foodOrderInfo.getId()).orElseThrow(
() -> new GlobalExistException("존재하지 않는 음식입니다")
;
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(GlobalExistException.class)
public GeneralResponseDto handleGlobalExistException(GlobalExistException e) {
return new GeneralResponseDto(e);
}
'GlobalExistException'라는 Exception을 상속받는 사용자 정의 클래스를 만들고 위에 보이는 코드의 예처럼 조회 불가 시에 해당 예외를 발생 시키도록 했다. 그리고 'RestControllerAdvice'에 해당 Exception을 처리하고 응답하는 'handleGlobalExistException'이라는 ExceptionHandler 메서드를 두어 클라이언트에 응답하게 처리했다.
우선 진작 이렇게 예외 처리를 해뒀으면 좋았을 걸 하는 생각이 들었다.
위와 같은 예외 처리를 통해서 하나의 컨트롤러에서 상황에 맞게 다양한 응답 처리를 하는 융통성이 생긴 것 같다