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();
}
}
'web > Bakery Shop Project' 카테고리의 다른 글
쇼핑몰 구현 12 - 리뷰 , Q&A 기능 (0) | 2024.02.23 |
---|---|
쇼핑몰 구현 11 - 위시리스트 기능 (0) | 2024.02.23 |
쇼핑몰 구현 9 - 상품 기능 (0) | 2024.02.23 |
쇼핑몰 구현 8 - 회원 기능 (0) | 2024.02.23 |
쇼핑몰 구현 7 - 환경설정 (0) | 2024.02.23 |