[WIL] Week 12

김주희·2023년 8월 6일
0

WIL

목록 보기
12/17

1. FACTS

  • 개인 과제 - 키오스크 프로젝트
  • 후발대 수업 - sql 실습

2. FEELINGS

  • 이번주도 역시나 정체기가 온 것 같다. 과제를 진행하는데, 이해하는 속도도 너무 느리고, node-cache를 적용하는 부분에서도 너무 많이 헤맸고, 여전히 헤매고 있다.
  • sql문은 복습을 여러 번 하나보니 이해가는 부분이 많았다. 예제들도 무리 없이 풀 수는 있었지만, 아직 좀 더 연습이 필요하다. (어떤 테이블을 기준으로 조인을 해야하는지와 가끔 GROUP BY를 빼먹은 부분이 많아서)

3. FINDINGS

  • 노드 캐시에 대해 알게 되고 과제에 적용하게 되면서 코드의 흐름도 어느 정도 알아가긴 했다. 하지만 아직 cache.get을 하는 부분에서 자꾸 undefined가 뜨고 있기 때문에..추가 공부가 더 필요하다.
  • 트랜잭션에 대해 이론 공부는 많이 했지만 실제로 코드에 적용해본건 이번이 처음이었다. 첨엔 여러 개의 함수나 여러 개의 DB에 접근하기 때문에 함수 분리가 중요하다는 것을 알게 되었다.
modifyOrderCustomer = async (orderCustomerId, orderState) => {
    await this.validationModifyOrderCustomer(orderState);

    const transaction = await sequelize.transaction({
      isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED,
    });

    try {
      const findOrderCustomerData =
        await this.orderCustomerRepository.findOneOrderCustomerById(
          orderCustomerId,
          { transaction }
        );

      if (!findOrderCustomerData) {
        throw new MakeError(400, '존재 하지 않는 주문 내역입니다.');
      }

      if (findOrderCustomerData.state === 1 && orderState === '취소') {
        throw new MakeError(400, '완료된 주문은 취소할 수 없습니다');
      }

      if (orderState === '완료') {
        await this.orderCustomerRepository.modifyOrderCustomerState(
          orderCustomerId,
          { transaction }
        );

        const itemOrderCustomersData =
          await this.orderCustomerRepository.findAllOrderByOrderCustomerId(
            orderCustomerId,
            { transaction }
          );

        for (let data = 0; data < itemOrderCustomersData.length; data++) {
          const orderItemId = itemOrderCustomersData[data].itemId;
          const orderAmount = itemOrderCustomersData[data].amount;
          const itemAmount = itemOrderCustomersData[data]['Item.amount'];

          await this.orderCustomerRepository.modifyAmountWhenOrderCompleted(
            orderItemId,
            itemAmount,
            orderAmount,
            { transaction }
          );
        }

        return true;
      } else if (findOrderCustomerData.state === 0 && orderState === '취소') {
        await this.orderCustomerRepository.deleteOrderCustomerWhenCanceled(
          orderCustomerId,
          { transaction }
        );

        await this.orderCustomerRepository.deleteItemOrderCustomerWhenCanceled(
          orderCustomerId,
          { transaction }
        );

        return false;
      }

      await transaction.commit();
    } catch (err) {
      await transaction.rollback();
      throw err;
    }
  };
  • 지금은 서비스레이어에 코드를 정리해뒀지만 첨엔 비즈니스 로직이 레파지토리 레이어에서 실행되거나 함수 분리가 제대로 되지 않아 유효성 검증하는 함수에서 레파지토리에 리턴으로 데이터들을 넘겨주기도 했다. 함수 분리에 대해선 어느 정도 정리가 잘 된 것 같다.

4. FUTURE

  • 캐싱화된 데이터 더 활용해보기(지금은 findOne만 하고 있는데, update나 destroy도 할 수 있다면..)
profile
꾸준히 하자

0개의 댓글