음식 주문 관리 시스템 - 스프링 예외 처리 적용하기

<aside>

음식 주문 관리 시스템에서 발생할 수 있는 다양한 예외 상황에 대비하여, 이번 과제에서는 스프링의 예외 처리를 구현하는 작업을 진행해주세요.

</aside>

예외처리는 꼼꼼히 😧

예외처리는 꼼꼼히 😧

0. Spring 예외 처리 이론 학습하기


https://www.youtube.com/watch?v=MeAt9Em02Cs

1. Spring 예외 처리 적용 실습


  1. 프로젝트 내 예외 상황 점검

        @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);
        }
    

  2. Global Exception Handler 구현

  3. 커스텀 예외 클래스 작성

  4. 에러코드 Enum 활용해보기

  5. 테스트 코드 작성

2. 심화(선택)