[PROJECT] 정기구독 웹서비스 6 - 장바구니 Service

zirryo·2023년 1월 18일
0

💊 Pillivery

목록 보기
6/7

22.11.16 WED (DAY 7)


💿 Cart Service

Service
도메인 업무 영역을 구현하는 비즈니스 로직 클래스


  • Structure

    // CartService.java
    @Service
    @Transactional
    @RequiredArgsConstructor
    public class CartService {
    
        private final CartRepository cartRepository;
        private final ItemCartService itemCartService;
        private final UserService userService;
        ...
        ...
    }
    • @Service : 서비스 레이어, 내부에서 자바 로직 처리
    • @Transactional : 기본적으로 해당 클래스에서 repository의 기능을 이용하는 모든 메서드에 트랜잭션 적용
    • @RequiredArgsConstructor : final, @NotNull 이 붙은 필드의 생성자를 만드는 애너테이션 (순환 참조 방지, 객체 변이 방지)

  • findMyCart

    // CartService.java
    public Cart findMyCart() {
        User user = userService.getLoginUser();
        return cartRepository.findByUser(user);
    }
    // UserService.java
    public User getLoginUser(){
    	Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String name = authentication.getName();
        Optional<User> user = userRepository.findByEmail(name);
        return user.orElseThrow(() -> new AuthenticationServiceException("Authentication exception"));
    }
    • userService 에서 로그인한 유저의 정보를 얻고, 데이터베이스에서 해당 유저의 카트를 찾는 메서드

  • findVerifiedCart

    // CartService.java
    public Cart findVerifiedCart(long cartId) {
            Optional<Cart> optionalCart = cartRepository.findById(cartId);
            Cart findCart = optionalCart.orElseThrow(
                    () -> new BusinessLogicException(ExceptionCode.CART_NOT_FOUND));
            return findCart;
        }
    • findById : Spring Data JPA 에서 지원하는 쿼리 메서드를 이용하여 cartId 로 카트 데이터 조회
    • 조회 결과를 Optional로 반환하여 NullPointException을 방지하고, null 일 경우 ExceptionCode 를 던짐.


  • countTotalPrice

    // CartService.java
    private int countTotalPrice(long cartId, boolean subscription) {
    	Cart cart = findVerifiedCart(cartId);
        List<ItemCart> itemCarts = itemCartService.findItemCarts(cart, subscription, true);
    
        if(itemCarts == null) return 0;
    
        int totalPrice = 0;
    
        for(ItemCart itemCart : itemCarts) {
        	int quantity = itemCart.getItem().getPrice();
      		int price = itemCart.getQuantity();
      		totalPrice += (quantity * price);
        }
    
    	return totalPrice;
    }
    • 클래스 외부에서 사용되는 메서드가 아니므로 private 접근 제어자 사용
    • 카트에 포함된 상품의 총 금액(정가)을 계산하는 메서드
    • findItemCarts : cartId 를 이용해서 존재하는 카트 정보인지 확인하여 데이터 조회
      -> 해당 카트에서 선택된 항목들의 목록을 다시 조회함
    • 카트에 선택된 상품이 없을 경우 0(원) 리턴
    • 개별 상품의 상품 가격(정가) * 담긴 수량 을 계산하여 더함.


  • countTotalDiscountPrice

    // CartService.java
    private int countTotalDiscountPrice(long cartId, boolean subscription) {
    	Cart cart = findVerifiedCart(cartId);
        List<ItemCart> itemCarts = itemCartService.findItemCarts(cart, subscription, true);
    
        if(itemCarts == null) return 0;
    
        int totalDiscountPrice = 0;
    
        for(ItemCart itemCart : itemCarts) {
        	int quantity = itemCart.getItem().getPrice();
      		int price = itemCart.getQuantity();
      		int discountRate = itemCart.getItem().getDiscountRate();
    
            totalDiscountPrice += (quantity * price * discountRate/100);
        }
    
    	return totalPrice;
    }
    • 클래스 외부에서 사용되는 메서드가 아니므로 private 접근 제어자 사용
    • 카트에 포함된 상품의 총 할인금액을 계산하는 메서드
    • findItemCarts : cartId 를 이용해서 존재하는 카트 정보인지 확인하여 데이터 조회
      -> 해당 카트에서 선택된 항목들의 목록을 다시 조회함
    • 카트에 선택된 상품이 없을 경우 0(원) 리턴
    • 개별 상품의 상품 가격(정가) * 담긴 수량 * (할인율/100) 을 계산하여 더함.


  • countTotalItems

    // CartService.java
    private int countTotalItems(long cartId, boolean subscription) {
        Cart cart = findVerifiedCart(cartId);
        return itemCartService.findItemCarts(cart, subscription, true).size();
    }
    • 클래스 외부에서 사용되는 메서드가 아니므로 private 접근 제어자 사용
    • 카트에서 선택된 상품의 수량을 리턴하는 메서드


  • refreshCart

    //CaerService.java
    public void refreshCart(long cartId, boolean subscription) { 
        Cart cart = findVerifiedCart(cartId);
    
        if(subscription) {
            cart.setSubTotalPrice(countTotalPrice(cartId, subscription));
            cart.setSubTotalItems(countTotalItems(cartId, subscription));
        } else {
            cart.setTotalPrice(countTotalPrice(cartId, subscription));
            cart.setTotalItems(countTotalItems(cartId, subscription));
        }
    
        cartRepository.save(cart);
    }

    • 장바구니 개별 항목 수량 변경, 삭제 등이 발생할 때 일반 / 정기 장바구니 총 금액, 상품 수를 업데이트 하는 메서드
    • 메서드의 파라미터 boolean subscription 으로 일반, 정기를 구분한 후 if 문을 활용하여 분기함.
    • subTotalPrice : 정기구독 장바구니에서 현재 선택된 항목의 총 금액
    • subTotalItems : 정기구독 장바구니에서 현재 선택된 항목의 수
    • totalPrice : 일반 장바구니에서 현재 선택된 항목의 총 금액
    • totalItems : 일반 장바구니에서 현재 선택된 항목의 수

🔗 전체 코드



💿 ItemCart Service

  • Structure

    // ItemCartService.java
    @Service
    @Transactional
    @RequiredArgsConstructor
    public class ItemCartService {
    
        private final ItemCartRepository cartRepository;
        ...
        ...
    }
    • @Service : 서비스 레이어, 내부에서 자바 로직 처리
    • @Transactional : 기본적으로 해당 클래스에서 repository의 기능을 이용하는 모든 메서드에 트랜잭션 적용
    • @RequiredArgsConstructor : final, @NotNull 이 붙은 필드의 생성자를 만드는 애너테이션 (순환 참조 방지, 객체 변이 방지)

  • findVerifiedItemCarts
    //ItemCartService.java
    public ItemCart findVerifiedItemCart(long itemCartId) {
        Optional<ItemCart> optionalItemCart = itemCartRepository.findById(itemCartId);
        ItemCart findItemCart = optionalItemCart.orElseThrow(() ->
                new BusinessLogicException(ExceptionCode.ITEMCART_NOT_FOUND));
        return findItemCart;
    }
    • findById : Spring Data JPA 에서 지원하는 쿼리 메서드를 이용하여 itemCartId 로 카트 데이터 조회
    • 조회 결과를 Optional로 반환하여 NullPointException을 방지하고, null 일 경우 ExceptionCode 를 던짐.


  • checkItemCart

    //ItemCartService.java
    public ItemCart checkItemCart(ItemCart itemCart) { 
        return itemCartRepository.findByCartAndItemAndSubscription(
                    itemCart.getCart(), itemCart.getItem(), itemCart.isSubscription());
    }
    • 장바구니에 특정 아이템이 이미 담겨있는지 확인하는 메서드
    • 누구의 카트인지, 어떤 아이템인지, 구독 여부를 확인함.
    • addItemCart 메서드에서 사용됨.


  • addItemCart

    //ItemCartService.java
    public ItemCart addItemCart(ItemCart itemCart) {
        ItemCart findItemCart = checkItemCart(itemCart);
    
        if(findItemCart == null) {
            createItemCart(itemCart); // 상품이 장바구니에 없는 경우 장바구니에 추가
            return itemCart;
        } else {
            findItemCart.addQuantity(itemCart.getQuantity()); // 상품이 장바구니에 이미 있는 경우 수량만 증가
            itemCartRepository.save(findItemCart);
            return findItemCart;
        }
    }
    • 장바구니에 아이템을 추가하는 메서드
    • checkItemCart 메서드를 통해 이미 담겨있는 아이템인지 확인함.
    • if(장바구니에 없는 경우) : createItemCart 메서드를 이용하여 새 데이터 생성.
    • else(이미 있는 경우) : 해당 아이템의 수량을 증가시켜서 데이터 업데이트.


  • createItemCart
    //ItemCartService.java
    public ItemCart createItemCart(ItemCart itemCart) { // 상품이 장바구니에 없는 경우
        return itemCartRepository.save(itemCart);
    }
    • 아이템이 장바구니에 없는 새로운 아이템일 경우 데이터베이스에 새 데이터를 추가하는 메서드
    • addItemCart 메서드에서 사용됨.


  • updownItemCart
    //ItemCartService.java
    public ItemCart updownItemCart(long itemCartId, int upDown) { 
        ItemCart itemCart = findVerifiedItemCart(itemCartId);
        itemCart.addQuantity(upDown);
        itemCartRepository.save(itemCart);
        return itemCart;
    }
    //ItemCart.java
    public void addQuantity(int quantity) {
        this.quantity += quantity;
    }
    • 장바구니 아이템의 수량을 변경하는 메서드 (+1 or -1)
    • 장바구니에서 아이템을 수량을 증가시킬 때 파라미터 upDown = 1 이 입력되고,
      수량을 감소시킬 때 -1 이 입력됨.


  • periodItemCart

    //ItemCartService.java
    public ItemCart periodItemCart(long itemCartId, int period) { // 정기 구독 주기 변경
        ItemCart itemCart = findVerifiedItemCart(itemCartId);
        itemCart.setPeriod(period);
        return itemCartRepository.save(itemCart);
    }

    • 정기배송 장바구니에 담긴 아이템의 구독 주기를 변경하는 메서드.
    • 파라미터 period 값으로 30, 60, 90, 120 이 입력됨.


  • excludeItemCart
    //ItemCartService.java
    public ItemCart excludeItemCart(long itemCartId, boolean buyNow) { // 아이템 체크 및 해제
        ItemCart itemCart = findVerifiedItemCart(itemCartId);
        itemCart.setBuyNow(buyNow);
        return itemCartRepository.save(itemCart);
    }

    • 장바구니의 아이템을 선택 혹은 해제하는 메서드
    • boolean buyNowtrue 일 경우 체크박스 활성화, false 일 경우 체크박스 비활성화됨.


  • deleteItemCart

    //ItemCartService.java
    public long deleteItemCart(long itemCartId) { // 장바구니 항목 삭제
        ItemCart itemCart = findVerifiedItemCart(itemCartId);
        long cartId = itemCart.getCart().getCartId(); // 장바구니 리프레시를 위해 카트 정보 확인
        itemCartRepository.delete(itemCart);
    
        return cartId;
    }

    • 장바구니 항목을 삭제하는 메서드.
    • 해당 아이템을 주문하여 장바구니에서 제거되는 경우에도 사용됨.
    • cartId 를 리턴하여 해당 카트의 상태를 업데이트 하도록 카트 정보 제공.


  • findItemCarts (1)

    //ItemCartService.java
    public List<ItemCart> findItemCarts(Cart cart, boolean subscription) { 
        return itemCartRepository.findAllByCartAndSubscription(cart, subscription);
        // subscription - true 정기구독, false 일반
    }
    • 메서드 오버로딩을 이용하여 같은 이름의 메서드를 두 개 구현함.
    • (1) : 일반 혹은 정기 장바구니의 전체 목록 조회를 위한 메서드


  • findItemCarts (2)

    //ItemCartService.java
    public List<ItemCart> findItemCarts(Cart cart, boolean subscription, boolean buyNow) { // 금액 합계, 주문
        return itemCartRepository.findAllByCartAndSubscriptionAndBuyNow(cart, subscription, buyNow);
        // subscription - true 정기구독, false 일반
        // buyNow - true 체크박스 활성화, false 체크박스 비활성화
    }
    • (2) : 장바구니 목록의 선택 금액 합계, 주문 정보 생성을 위한 메서드
    • buyNow 파라미터를 추가하여 선택된 항목만 조회할 수 있도록 함.

🔗 전체 코드


0개의 댓글