웹 프로그래밍/DRF
효율적인 Django 사용을 위한 몇가지 (분산트랜잭션 처리와 ACID)
박살난 디비성적과는 별개로 ACID에 대한 기억은 남아있다. 다시 정리해보면,Atomic: 원자성의 보장이다. 트랜잭션 내의 모든 작업이 성공적으로 완료되거나, 하나라도 실패하면 전체가 롤백돼야한다.Consistency: 트랜잭션이 완료되면 데이터베이스는 항상 일관된 상태를 유지해야한다.Isolation: 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 영향을 받지 않도록 해야한다.Durability: 트랜잭션이 성공적으로 완료되면, 시스템 장애가 발생해도 변경 사항이 유지돼야한다. 분산트랜잭션 처리에 대한 예시들을 찾아보던 중 적절하게 문제가 있는 한가지 예시를 발견하여 가져와 정리해보려한다.from django.db import transaction @transaction.atomic def tr..
효율적인 Django 사용을 위한 몇가지(쿼리 최적화 적용편)
1. N+1문제와 최적화(1)N개의 추가 쿼리가 발생하며 데이터 개수에 따라 성능이 급감하는 문제를 말한다. 비효율적 접근을 살펴보자.transactions = PaymentTransaction.objects.filter(user=request.user) for txn in transactions: print(txn.user.profile.name) # N+1 문제 발생 첫번째로 PaymentTransaction 테이블에서 request.user의 모든 거래내역을 가져온다.그리고 루프를 실행하며 txn.user.profile.name에 접근할 때마다 user와 profile을 개별조회하는 SQL query가 실행되며 transaction에 N개의 결과가 있으면 추가로 N개의 쿼리가 실행된다...
효율적인 Django 사용을 위한 몇가지(정규화 설계 적용편)
1. 정규화 설계 적용을 통한 데이터 중복 개선과 무결성 유지1정규화(1NF)각 칼럼이 원자값을 가져야한다. 즉 칼럼에 리스트나 중첩된 JSON등을 저장해서는 안된다.class User(models.Model): name = models.CharField(max_length=100) email = models.EmailField(unique=True)emails=["x.com", "y.com"] 같은 저장은 1정규화를 만족하지 않는다. 2정규화(2NF)1NF를 만족하면서 부분적 함수종속을 제거해야한다. 즉, pk의 일부만 가지고 결정되는 속성이 있다면 그걸 별도의 테이블로 분리해야한다.class StudentCourse(models.Model): student = models.Foreig..