<aside>
음식 주문 관리 시스템에서 발생할 수 있는 다양한 예외 상황에 대비하여, 이번 과제에서는 스프링의 예외 처리를 구현하는 작업을 진행해주세요.
</aside>
예외처리는 꼼꼼히 😧
스프링에서 예외 처리는 왜 필요할까?
스프링 MVC의 기본 예외 처리 메커니즘
주요 애노테이션
예외를 처리하여 클라이언트에게 응답으로 반환하는 방법
https://www.youtube.com/watch?v=MeAt9Em02Cs
프로젝트 내 예외 상황 점검
@Transactional
public void addOrder(AddOrderRequestDTO orderDTO) {
** User user = userRepository.findById(orderDTO.userId()).orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다."));**
Order order = new Order(user);
List<Long> foodIds = orderDTO.foodOrders().stream()
.map(AddOrderRequestDTO.FoodRequestDTO::foodId)
.collect(Collectors.toList());
List<Food> foods = orderRepository.findFoodById(foodIds);
Map<Long, Food> foodMap = foods.stream()
.collect(Collectors.toMap(Food::getId, food -> food));
for (AddOrderRequestDTO.FoodRequestDTO foodOrderDTO : orderDTO.foodOrders()) {
Food food = foodMap.get(foodOrderDTO.foodId());
**if (food == null) {
throw new IllegalArgumentException("음식을 찾을 수 없습니다.");
}**
OrderItem orderItem = new OrderItem(order, food, foodOrderDTO.quantity());
order.addOrderItem(orderItem);
}
orderRepository.save(order);
}
@Transactional
public void editOrder(EditOrderRequestDTO orderDTO) {
**Order order = orderRepository.findById(orderDTO.userId()).orElseThrow(() -> new IllegalArgumentException("주문을 찾을 수 없습니다."));**
order.clearOrderItems();
List<Long> foodIds = orderDTO.foodOrders().stream()
.map(EditOrderRequestDTO.FoodRequestDTO::foodId)
.collect(Collectors.toList());
List<Food> foods = orderRepository.findFoodById(foodIds);
Map<Long, Food> foodMap = foods.stream()
.collect(Collectors.toMap(Food::getId, food -> food));
for (EditOrderRequestDTO.FoodRequestDTO foodOrderDTO : orderDTO.foodOrders()) {
Food food = foodMap.get(foodOrderDTO.foodId());
**if (food == null) {
throw new IllegalArgumentException("음식을 찾을 수 없습니다.");
}**
OrderItem orderItem = new OrderItem(order, food, foodOrderDTO.quantity());
order.addOrderItem(orderItem);
}
orderRepository.save(order);
}
@Transactional
public void deleteOrder(Long id) {
**if (!orderRepository.existsById(id)) {
throw new IllegalArgumentException("주문을 찾을 수 없습니다.");
}**
orderRepository.deleteOrderById(id);
}
@Transactional
public UserResponseDTO signup(UserRequestDTO request) {
**if (userRepository.existsByEmail(request.email())) {
throw new IllegalArgumentException("이미 존재하는 이메일입니다.");
}**
String encodedPassword = passwordEncoder.encode(request.password());
User user = new User(request.email(), encodedPassword, request.name());
User savedUser = userRepository.save(user);
return new UserResponseDTO(savedUser.getId(), savedUser.getEmail(), savedUser.getName());
}
public void login(String email, String password) {
**User user = userRepository.findByEmail(email)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다."));**
**if (!passwordEncoder.matches(password, user.getPassword())) {
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}**
httpSession.setAttribute("email", email);
}
Global Exception Handler 구현
@RestControllerAdvice
와 @ExceptionHandler
를 활용하여 전역 예외 처리 클래스를 작성하기커스텀 예외 클래스 작성
에러코드 Enum 활용해보기
테스트 코드 작성