본문 바로가기
web/Bakery Shop Project

쇼핑몰 구현 10 - 장바구니 기능

by su0a 2024. 2. 23.

1. CartRepository

@Repository
public interface CartRepository extends JpaRepository<Cart,Long> {

    //해당 이메일을 가진 회원의 모든 장바구니를 찾기 위해
    List<Cart> findAllByMemberEmail(String email);

    //해당 이메일을 가진 회원의 장바구니에 해당 아이디를 가진 아이템이 존재하는지 확인하기 위해
    //아이템이 존재할 경우 장바구니에 또 추가하지 않고 수량만 변경
    Boolean existsByMemberEmailAndItemId(String email,Long itemId);

    //해당 이메일을 가진 회원의 장바구니에 해당 아이디를 가진 아이템이 존재한다면 해당 카트 반환
    Optional<Cart> findByMemberEmailAndItemId(String email, Long itemId);
}

 

2. CartService

@Service
@RequiredArgsConstructor
public class CartService {
    private final ItemRepository itemRepository;
    private final MemberRepository memberRepository;
    private final CartRepository cartRepository;

    //장바구니 생성
    @Transactional
    public void createCart(OrderDto orderDto, String email) {
        Item item = itemRepository.findById(orderDto.getItemId())
                .orElseThrow(EntityNotFoundException::new);
        Member member = memberRepository.findByEmail(email).get();
        if(cartRepository.existsByMemberEmailAndItemId(email, item.getId())){
            Cart cart = cartRepository.findByMemberEmailAndItemId(email, item.getId()).get();
            cart.increaseCount(orderDto.getCount());
        }
        else {
            Cart cart = Cart.create(item, orderDto.getCount(), member);
            cartRepository.save(cart);
        }
    }

    //장바구니 리스트 조회
    public List<CartDto> cartList(String email){
        List<Cart> cartList = cartRepository.findAllByMemberEmail(email);
        List<CartDto> cartDtoList=new ArrayList<>();
        for(Cart cart:cartList){
            CartDto cartDto = CartDto.of(cart);
            cartDtoList.add(cartDto);
        }
        return cartDtoList;
    }

    //장바구니 삭제
    @Transactional
    public boolean deleteCart(Long cartId){
        Cart cart = cartRepository.findById(cartId).orElseThrow(EntityNotFoundException::new);
        Member member = cart.getMember();
        if(member!=null){
            member.getCartItems().remove(cart);
        }
        cartRepository.delete(cart);
        System.out.println("cartId: "+cartId+" 삭제완료");
        return true;
    }

    //선택된 장바구니들을 주문할 때 사용
    @Transactional
    public List<OrderDto> changeCartToOrderDto(List<Long> selectedCartIds) {
        if(selectedCartIds==null){
            return null;
        }
        List<OrderDto> orderDtoList=new ArrayList<>();
        for(Long id:selectedCartIds){
            Cart cart = cartRepository.findById(id).get();
            OrderDto orderDto = new OrderDto(cart.getItem().getId(), cart.getCount());
            orderDtoList.add(orderDto);
            cartRepository.delete(cart);
        }
        return orderDtoList;
    }
}

 

3. CartController

@Controller
@RequiredArgsConstructor
@RequestMapping("/carts")
public class CartController {
    private final ItemService itemService;
    private final CartService cartService;
    @PostMapping("/create")
    public String createCart(@RequestParam("itemId1") Long itemId,
                                 @RequestParam("count1") int count,
                                 Model model, Authentication auth){

        OrderDto orderDto = new OrderDto(itemId, count);
        cartService.createCart(orderDto,auth.getName());

        model.addAttribute("message","상품이 장바구니에 담겼습니다.");
        model.addAttribute("nextUrl","/items/"+itemId+"/detail");
        return "printMessage";
    }

    @PostMapping("{cartId}/delete")
    public String deleteCart(@RequestParam("cartId") Long cartId, Model model, Authentication auth){
        cartService.deleteCart(cartId);
        model.addAttribute("message","상품이 삭제되었습니다.");
        model.addAttribute("nextUrl","/members/myPage/cart");
        return "printMessage";
    }
}

 

장바구니 리스트 조회는 MemberController에 존재

@GetMapping("/myPage/cart")
public String myCartPage(Authentication auth, Model model){
    List<CartDto> cartDtoList = cartService.cartList(auth.getName());
    model.addAttribute("cartDtoList",cartDtoList);
    return "members/myCart";
}

 

4. CartDto

  • Cart 리스트 조회 시 사용
@Data
@Builder
public class CartDto {
    private Long id;
    private UploadImage itemImage;
    private String itemName;
    private Integer count;
    private Integer itemPrice;

    public static CartDto of(Cart cart){
        return CartDto.builder()
                .id(cart.getId())
                .itemImage(cart.getItem().getUploadImages().get(0))
                .itemName(cart.getItem().getName())
                .count(cart.getCount())
                .itemPrice(cart.getItem().getPrice())
                .build();
    }
}