장바구니 회고(?)

·2022년 4월 20일
0

API 장바구니

목록 보기
5/5

아! 거지같은거 ! 드디어 다 만들었다.

근데 이게 한개의 물건을 여러개 담는 것 까지는 구현이 된 것 같은데.
여러개의 물건을 여러개 담을 경우에는 조금 고장이 날 것 같다.
배열의 형식으로 처리를 하면 되긴 할 것 같은데 구현을 해놓진 않은 상태라서, 이것 또한 참고하는게 좋을 것 같다.

그리고 시간이 나면 기능들을 추가해야할 것 같다.

  1. 주문이 완료되면 해당하는 유저의 결제 테이블에 등록하기
    1.1(결제내역이 현재는 결제랑 환불이 합쳐져있는데 이것도 분리를 해야할 것 같다)
  2. 만약에 주문이 된 상태여서 해당하는 유저의 장바구니 테이블이 사라진 상태지만
    2.1 구매를 취소할 경우 판매된 재고 롤백하기
  3. 물건 상세의 내역이 변경되어 1개당 구입 금액이 달라졌을 경우 장바구니 비활성화(이건 많은 쇼핑몰에 있다)
    3.1 혹은 장바구니에 들어간 금액도 같이 변경해주기

일단 ERD부터 올려놓고 시작하겠다.

ERD, 장바구니 관련된 것들만!

유저 1 : N 장바구니
물건 1 : N 장바구니
물건 상세 1 : 1 물건

로직 설명

  1. 판매자(운영자)가 물건에 대한 정보를 DB에 입력한다.
  2. 물건 상세에 테이블 한 줄이 생기면서, 그것을 참조하여 1개의 가격이 적혀있는 물건 테이블이 생성된다.
  3. 유저가 장바구니에 물건을 담는다.
  4. 물건 이름과 수량이 유저의 ID가 있는 장바구니 테이블에 담기며, 물건 이름으로 물건테이블의 정보를 참조해서 조인을 하고 갯수를 비례하여 총액이 입력된다.
  5. 만약 수량이 0개로 줄어든다면, 해당하는 장바구니 테이블이 삭제된다.
  6. 유저가 주문을 한다면, 해당하는 유저의 ID로 만들어진 모든 장바구니의 테이블이 삭제된 후
    6-1 유저가 구매한 수량 만큼 물건 상세에 있는 재고 컬럼의 갯수가 줄어든다.

추가 로직

  1. 판매자(운영자)가 이미 생성되어있는 물건의 정보를 업데이트 한다.
  2. 업데이트 함과 동시에 1개의 가격이 적혀있는 물건 테이블의 정보 또한 갱신된다.

이유는 뭐 어그로(?)를 끌기 위하여 상품의 이름을 바꾼다거나, 가격 할인률이 변경되는 경우가 있어서 추가해놓은 상태다.

사용한 다양한 createQueryBuilder()

createQueryBuilder()가 뭐냐면, 조금 더 Query문에 가까운 문법이라고 생각하면 된다.
그래서 일반 쿼리문에 존재하는 다양한 옵션들을 참조할 수 있는데

typeorm에서 지원하는 옵션을 쓸 경우에는, Service 단을 불러와야하기 때문에
불러올 때 사용하는 entity를 module에 추가를 해야한다는 단점이 발생한다.
이게 왜 단점이냐면, Nest에서는 서로 상속받는 것이 엄청 중요해서, 연쇄적으로 충돌이 발생하는 경우도 있기 때문이다.

그래서 쿼리빌더를 사용하면 조금 줄이 길긴 한데.... 아무튼 편하게 사용할 수 있다.
진짜 죽어라 쓴 것 같다. 정말 편해서 이건 계속 공부를 해보려고 한다, 일단 재밌음(...?)

아래는 여러가지 사용 사례

1:N으로 조인된 user의 id로 cart 테이블에서 join된 모든 테이블을 불러올 때

await getConnection()
      .createQueryBuilder()
      .select('cart')
      .from(Cart, 'cart')
      .innerJoinAndSelect('cart.user', 'user')
      .innerJoinAndSelect('cart.product', 'product')
      .where({ user: user_id })
      .getMany();

Product에서 name이 item인 물건 1개를 가져올 때

await getConnection()
      .createQueryBuilder()
      .select('product')
      .from(Product, 'product')
      .where({ name: item })
      .getOne();

Cart에서 Cart에 volume이 0인 테이블을 삭제할 때

await getConnection()
        .createQueryBuilder()
        .delete()
        .from(Cart)
        .where({ product: productData, user: user_id })
        .execute();

주문이 되었을 경우, Cart의 수량만큼 물품 상세의 재고를 감소 시킬 때

 await getConnection()
        .createQueryBuilder()
        .update(ProductInfo)
        .set({ volume: () => `volume-${readata[i].volume}` })
        .where({ name: readata[i].product.name })
        .execute();

주문이 되었을 경우 해당하는 유저의 Cart 테이블을 삭제할 때

await getConnection()
      .createQueryBuilder()
      .delete()
      .from(Cart)
      .where({ user: user_id })
      .execute();

물품 상세의 이름 혹은 가격, 할인률이 변경되었을 경우 물품 테이블의 정보를 업데이트할 때

await this.productRepository
      .createQueryBuilder()
      .update(Product)
      .set({
        name: updateInfo.name,
        price: updateInfo.price - updateInfo.price * updateInfo.sale,
      })
      .where({ info: dataInfo })
      .execute();
profile
물류 서비스 Backend Software Developer

0개의 댓글