프로젝트 기간동안 회원가입, 로그인, 주문상세페이지를 구현했다.
그 중 주문상세페이지를 구현하며 장바구니에 담긴 상품을 삭제와 동시에 주문완료된 테이블에 각각 정보를 담아야했다. 이때 사용했던 기능이 transaction이다.
주문상세페이지 API내에 있는 transaction 코드를 가져왔다.
with transaction.atomic(): order = Order.objects.create(order_number = uuid.uuid4(), user_id = user.id) OrderItem.objects.bulk_create([ OrderItem( quantity = cart.quantity, order_id = order.id, shipping_option_id = cart.shipping_option_id, package_id = cart.package.id ) for cart in Cart.objects.filter(id__in=cart_ids, user_id=user.id) ]) order.sub_total = Cart.objects.filter(id__in=cart_ids).aggregate(sub_total=Sum('price'))['sub_total'] order.save() Cart.objects.filter(id__in=cart_ids, user_id=user.id).delete()
우리 팀의 기획과 ERD에 의해 만들어진 테이블에 맞춰 코드를 치다보니 몇일전 블로깅한 ACID가 생각났다. order테이블에는 주문번호 주문자 총 가격이 들어가야하고, orderitem테이블에 상품정보들이 들어가야 한다. 그리고 주문완료와 동시에 장바구니에 선택된 물품을 삭제해야했고 이때 트랜잭션이 적용되어야했다. 처음 트랜잭션을 적용하려했는데 트랜잭션이 이론적인 방법론 인줄 알았는데 실제로 Django에 사용 할 수 있는 코드가 있었다.
order와 orderitem에 query값이 제대로 들어가지 않으면 장바구니 또한 비워지지 않게된다.
with transaction.atomic():
내에 있는 코드중 하나라도 작동을 하지 않는다면 transaction내에 있는 코드는 하나도 적용이 되지 않는 기능이다.