내일배움캠프 TIL (230205): 이커머스 프로젝트 5일차 - 장바구니 상품이 있을 때 수량 증가시키기

Jiumn·2023년 2월 7일
0

목표: 장바구니 상품이 있을 때 수량을 증가시키고 싶다

장바구니 상품 수량을 변경하는 로직을 짜면서 3가지로 조건을 분기하고 싶었다.

  1. 해당 상품이 장바구니에 없을 때는 새롭게 데이터 생성하기
  2. 해당 상품이 장바구니에 이미 있을 때
    상세 페이지에서 상품을 담으면 담은 수 만큼 추가로 증가시키기
  3. 해당 상품이 장바구니에 이미 있을 때
    장바구니 페이지에서 수량을 변경하면 해당 수량으로 변경하기

1번은 sequelize create() 함수로,
3번은 update() 함수로 구현하면 된다.

문제는 2번이었는데 수량 값을 받아와서 기존 데이터에 더해주고 싶었다.

sequelize increment 함수 사용하기

처음에는 update() 함수에 수량 값만 더해주다가 적용이 안 돼서
구글링을 하다가 increment() 함수가 있다는 것을 알게 됐다.

나름대로 공식문서와 구글링을 통해 다음과 같이 함수를 작성했다.

class CartsRepository {
 addCart = async (count, productId, userId) => {
    const addCart = await Cart.increment("count", {
      by: count,
      { where: { product_id: productId, user_id: userId }},
    });
    return addCart;
  };

특정 상품과 특정 유저가 해당하는 Cart 테이블에서
count라는 컬럼의 데이터를 by: 안의 count 만큼 증가시키겠다는 의미다.
by 값으로는 정수로도 가능하다. (예: by: 2)

문제 1) sequelize increment 문법 오류

얼핏 그럴 듯해 보이는데 역시나 처음부터 작동이 되지 않았다.
문법에 오류가 있었기 때문이다.

// X
Cart.increment("count", {
      by: count,
      { where: { product_id: productId, user_id: userId }},

// O
Cart.increment("count", {
      by: count,
      where: { product_id: productId, user_id: userId },

by와 where를 중괄호로 분리하면 안 되고 같이 써줘야 한다.

팀원의 도움으로 문법 오류는 찾았는데... 여전히 동작이 되지 않았다.

문제 2) dataValues 확인하기

다시 3계층을 열심히 살펴보기 시작했다.

controller에 설정된 조건이 잘못 되어 repo에서 찾은 장바구니 데이터를 수정할 때 막히는 건가 싶어서 console.log을 찍어봤다.

// 같은 상품이 있으면 기존 상품 수량에서 상품 수량 증가
if (existCartData.product_id == req.params.productId) {
await this.cartsService.addCart(count, productId, userId);
	res
	.status(200)
    .json({ message: "장바구니 상품 수량이 변경되었습니다." });

문제를 발견했다!

existCartData라는 데이터(특정 유저의 특정 장바구니 상품 데이터)를 출력해보니 바로 productId 값이 담기는 것이 아니라는 것을 알게 됐다.
중간에 dataValues라는 객체에 담기는 것이었다.

그래서 existCartData.dataValues.product_id로 변경해주니 장바구니 상품 수량 증가시키기 성공 🪄

profile
Back-End Wep Developer. 꾸준함이 능력이다.

0개의 댓글