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도 할 수 있다면..)