22.11.16 WED (DAY 7)
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")); }
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
로 카트 데이터 조회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; }
findItemCarts
: cartId 를 이용해서 존재하는 카트 정보인지 확인하여 데이터 조회상품 가격(정가) * 담긴 수량
을 계산하여 더함.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; }
findItemCarts
: cartId 를 이용해서 존재하는 카트 정보인지 확인하여 데이터 조회상품 가격(정가) * 담긴 수량 * (할인율/100)
을 계산하여 더함.countTotalItems
// CartService.java private int countTotalItems(long cartId, boolean subscription) { Cart cart = findVerifiedCart(cartId); return itemCartService.findItemCarts(cart, subscription, true).size(); }
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); }
일반 / 정기
장바구니 총 금액, 상품 수를 업데이트 하는 메서드subTotalPrice
: 정기구독 장바구니에서 현재 선택된 항목의 총 금액subTotalItems
: 정기구독 장바구니에서 현재 선택된 항목의 수totalPrice
: 일반 장바구니에서 현재 선택된 항목의 총 금액totalItems
: 일반 장바구니에서 현재 선택된 항목의 수Structure
// ItemCartService.java @Service @Transactional @RequiredArgsConstructor public class ItemCartService { private final ItemCartRepository cartRepository; ... ... }
@Service
: 서비스 레이어, 내부에서 자바 로직 처리@Transactional
: 기본적으로 해당 클래스에서 repository의 기능을 이용하는 모든 메서드에 트랜잭션 적용@RequiredArgsConstructor
: final, @NotNull 이 붙은 필드의 생성자를 만드는 애너테이션 (순환 참조 방지, 객체 변이 방지)//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
로 카트 데이터 조회checkItemCart
//ItemCartService.java public ItemCart checkItemCart(ItemCart itemCart) { return itemCartRepository.findByCartAndItemAndSubscription( itemCart.getCart(), itemCart.getItem(), itemCart.isSubscription()); }
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; } }
if(장바구니에 없는 경우)
: createItemCart 메서드를 이용하여 새 데이터 생성.else(이미 있는 경우)
: 해당 아이템의 수량을 증가시켜서 데이터 업데이트.//ItemCartService.java public ItemCart createItemCart(ItemCart itemCart) { // 상품이 장바구니에 없는 경우 return itemCartRepository.save(itemCart); }
//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
)periodItemCart
//ItemCartService.java public ItemCart periodItemCart(long itemCartId, int period) { // 정기 구독 주기 변경 ItemCart itemCart = findVerifiedItemCart(itemCartId); itemCart.setPeriod(period); return itemCartRepository.save(itemCart); }
30
, 60
, 90
, 120
이 입력됨.//ItemCartService.java public ItemCart excludeItemCart(long itemCartId, boolean buyNow) { // 아이템 체크 및 해제 ItemCart itemCart = findVerifiedItemCart(itemCartId); itemCart.setBuyNow(buyNow); return itemCartRepository.save(itemCart); }
boolean buyNow
가 true
일 경우 체크박스 활성화, 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
파라미터를 추가하여 선택된 항목만 조회할 수 있도록 함.