개요
최근 Django 프레임워크를 사용하는 새로운 회사로 이직하게 되었습니다.
이전 회사에서는 주로 Spring Boot와 NestJS 프레임워크를 사용했지만, Django에 대해서는 깊게 공부해본 적이 없습니다.
새로운 환경에 빠르게 적응하고 회사에 기여하기 위해, Django ORM을 학습하고자 합니다.
그래서 이번 글에서는 Django ORM의 특징 중 하나인 Auto Commit에 대해 알아보겠습니다.
Auto Commit이란?
Auto Commit은 데이터베이스 작업(save, update, delete ...)이 호출되는 즉시 커밋되는 트랜잭션 처리 방식입니다.
Spring Boot의 경우 기본적으로 Auto Commit이 false로 설정되어 있습니다. 또한 @Transactional 어노테이션을 사용해 트랜잭션이 끝나는 시점에 모든 쿼리문을 한번에 커밋합니다.
반면 장고는 기본적으로 Auto Commit이 True로 설정되어 있습니다. 그래서 장고는 save, update, delete와 같은 실제 데이터 변경 메서드를 호출하면 해당 메서드는 그 즉시 DB에 반영됩니다.
만약 개발자가 별도의 트랜잭션을 설정하지 않았다면 save, update, delete는 모두 독립적으로 수행됩니다.
코드로 예시를 들어보겠습니다.
@Transactional
public void test() {
userRepository.save(new User("user1")); // 저장 작업 (커밋 안됨)
userRepository.save(new User("user2")); // 저장 작업 (커밋 안됨)
userRepository.save(new User("user3")); // 저장 작업 (커밋 안됨)
userRepository.save(new User("user4")); // 저장 작업 (커밋 안됨)
} // 메서드 끝나는 시점에 트랜잭션 커밋
스프링부트는 test 메서드가 끝나는 시점에 save 작업이 commit 됩니다.
그렇기 때문에 원자성을 보장해, 메서드 실행 중간에 장애가 발생하면 네개의 save 메서드가 모두 실패하게 됩니다.
def test():
user = User(username="user1", email="user1@example.com")
user.save() # 즉시 커밋
user2 = User(username="user2", email="user2@example.com")
user2.save() # 즉시 커밋
user3 = User(username="user3", email="user3@example.com")
user3.save() # 즉시 커밋
user4 = User(username="user4", email="user4@example.com")
user4.save() # 즉시 커밋
반면 장고에서는 save 메서드를 호출하는 즉시 DB에 반영됩니다.
이 때문에 user2를 save 한 뒤 user3을 save 하는 중간에 오류가 발생해도 user1과 user2 save 작업은 롤백되지 않습니다.
물론 장고에서도 Transaction 설정이 불가능 한 것은 아닙니다.
아래 코드처럼 메서드 레벨에 @transaction.atomic을 붙여주면 Spring Boot의 @Transactional과 동일한 작업을 할 수 있습니다.
@transaction.atomic
def test():
user = User(username="user1", email="user1@example.com")
user.save() # 즉시 커밋
user2 = User(username="user2", email="user2@example.com")
user2.save() # 즉시 커밋
Django가 AutoCommit을 사용하는 이유

장고 공식문서에서 발췌한 글 입니다.
간단히 요약하자면, SQL 표준에서는 쿼리 실행 전에 트랜잭션을 시작하는 것을 권장하지만, 장고에서는 개발자의 편의를 위해 트랜잭션을 시작하거나 커밋하지 않아도 데이터베이스에 반영되도록 Auto Commit을 True 로 설정한 것 입니다.
장고의 기본 철학은 웹 애플리케이션을 빠르고 간단하게 개발하는 것이기 때문에 Auto Commit은 이런 장고의 철학과 일맥상통합니다.
결론
아직 실무에서 장고를 사용해본적이 없기 때문에, 직접 경험해봐야 Auto Commit의 장단점을 확실하게 알 수 있을 것 같습니다.
현재 생각으로는, 비즈니스 로직의 사이즈가 커지면 Auto Commit으로 얻는 이득보다는 손실이 더 클 것이라 생각합니다.
이러한 예측이 맞을지, 추후 실무 경험을 쌓고 천천히 포스팅해 보겠습니다.