WindsomeProject - 장바구니 추가 기능

박민수·2024년 1월 6일
0

WindsomeProject

목록 보기
9/32
post-thumbnail

개요

해당 포스팅에서는 장바구니 추가 기능의 흐름에 대해서 정리해 보고자 한다.

장바구니 추가 기능 절차

  1. Controller: 장바구니 추가 요청을 처리한다.
  2. CartService: 장바구니와 관련된 비즈니스 로직을 처리한다.

Controller 로직

  1. 화면으로부터 사용자가 입력한 장바구니 정보를 전달받는다. (장바구니에 담은 상품 id와 상품 개수)
  2. 장바구니를 생성하고 DB에 저장한다. (CartService에 위임)
@PostMapping("/cart")
public ResponseEntity<Object> cart(@RequestBody @Valid CartItemDto cartItemDto, BindingResult bindingResult,
                                       @CurrentAccount Account account) {
	if (bindingResult.hasErrors()) {
		StringBuilder sb = new StringBuilder();
		List<FieldError> fieldErrors = bindingResult.getFieldErrors();
		for (FieldError fieldError : fieldErrors) {
			sb.append(fieldError.getDefaultMessage());
		}
		return ResponseEntity.badRequest().body(sb.toString());
	}

	Long cartItemId;

	try {
		cartItemId = cartService.addCart(cartItemDto, account.getUserIdentifier());
	} catch (Exception e) {
		return ResponseEntity.badRequest().body(e.getMessage());
	}
	return ResponseEntity.ok().body(cartItemId);
}

Service 로직

  1. 파라미터로 전달받은 값을 이용하여 DB에서 item과 account를 조회한다.
  2. 장바구니가 존재하지 않으면 장바구니를 새로 생성하고 DB에 저장한다.
  3. 장바구니 상품을 추가하고 DB에 저장한다. (장바구니 상품이 이미 존재하는 경우 새로 생성하지 않고 기존 장바구니 상품의 개수를 업데이트한다.)
public Long addCart(CartItemDto cartItemDto, String userIdentifier) {
	Item item = itemRepository.findById(cartItemDto.getItemId()).orElseThrow(EntityNotFoundException::new);
	Account account = accountRepository.findByUserIdentifier(userIdentifier);

	Cart cart = cartRepository.findByAccountId(account.getId());
	if (cart == null) {
		cart = Cart.createCart(account);
		cartRepository.save(cart);
	}

	CartItem savedCartItem = cartItemRepository.findByCartIdAndItemId(cart.getId(), item.getId());

	if (savedCartItem != null) {
		savedCartItem.addCount(cartItemDto.getCount());
		return savedCartItem.getId();
	} else {
		CartItem cartItem = CartItem.createCartItem(cart, item, cartItemDto.getCount());
		cartItemRepository.save(cartItem);
		return cartItem.getId();
	}
}
profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보