주문상세 트랜잭션 사용기

이재문·2021년 12월 12일
0
post-thumbnail

프로젝트 기간동안 회원가입, 로그인, 주문상세페이지를 구현했다.
그 중 주문상세페이지를 구현하며 장바구니에 담긴 상품을 삭제와 동시에 주문완료된 테이블에 각각 정보를 담아야했다. 이때 사용했던 기능이 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내에 있는 코드는 하나도 적용이 되지 않는 기능이다.

profile
이제부터 백엔드 개발자

0개의 댓글