Spring JPA vs Django ORM

2024. 4. 4. 16:58기타

 

설명

해당 문서는 Spring JPA와 Django ORM을 비교해보는 문서입니다.

두 ORM의 공통적인 이점

  • 1차 캐시
    • 조회, 저장 시 메모리(JPA의 경우 영속성 컨텍스트)에 저장 후 재사용
    • Transaction 혹은 요청이 끝나면 초기화
      • 이 때문에 성능상 이점은 크게 없음.
  • 영속 엔티티의 동일성 보정
    • 동일한 pk를 가진 엔티티는 엔티티 비교로 동일한 객체로 인지할 수 있음.
    • 1차 캐시로 반복 가능한 읽기(Repeatable Read) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 단에서 제공
  • 트랜잭션을 지원하는 쓰기 지원
    •  
    • 객체의 변경을 데이터베이스에 바로 반영하는 것이 아니라 커밋 될때 변경 내용을 모아서 한 번에 데이터베이스에 적용
  • 엔티티 수정(변경 감지, dirty checking)
    • 객체의 변경 사항을 추적하여 필요한 경우에만 데이터베이스에 업데이트

두 ORM의 차이점

기능/개념 Django ORM Spring JPA
객체 추적 범위 요청 범위(Request Scope) 내에서 유지 트랜잭션 범위(Transaction Scope) 내에서 유지
객체 관리 장소 메모리 영속성 컨텍스트
쓰기 지연 방식 save()를 통한 요청 범위(Request Scope) 내에서 저장 보통의 경우 트랜잭션이 끝날때 commit을 통한 저장

 

총 정리

기능/개념 Django의 Unit of Work Spring의 영속성 컨텍스트(Persistence Context)
개념 객체와 데이터베이스 간 매핑 및 관리 담당 객체와 데이터베이스 간 매핑 및 관리 담당
핵심 역할 객체의 상태 추적 및 데이터베이스 작업 관리 객체의 상태 추적 및 데이터베이스 작업 관리
장점 요청 범위(Request Scope) 내에서 유지 트랜잭션 범위(Transaction Scope) 내에서 유지
  동일한 객체의 재사용 및 캐싱
 - 객체의 동일성 보장
동일한 객체의 재사용 및 캐싱
 - 객체의 동일성 보장
  쓰기 지연(Lazy Write) 지원 쓰기 지연(Lazy Write) 지원
  변경 감지(dirty checking) 지원 변경 감지(dirty checking) 지원
개체 변경 추적 변경된 객체를 추적하여 데이터베이스에 반영(save) 변경된 객체를 추적하여 트랜잭션 커밋 시 반영
트랜잭션 관리 트랜잭션 범위 내에서 작동 영속성 컨텍스트 범위 내에서 작동
데이터베이스 쿼리 필요한 경우에만 데이터베이스 쿼리 수행 필요한 경우에만 데이터베이스 쿼리 수행
캐싱 동일한 객체 재사용 및 성능 향상 동일한 객체 재사용 및 성능 향상
요청 범위 HTTP 요청 범위 내에서 유지 HTTP 요청 범위 내에서 유지
효과 성능 향상 및 데이터베이스 부하 감소 성능 향상 및 데이터베이스 부하 감소

 

결론

객체 관리 주체? 논리적인 개념이 다르고, 가장 크게 다른 점은 객체 추적 범위가 다르다는점. 쓰기 지연을 사용할 때 Django ORM은 명시적으로 save()를 호출해주지만 JPA는 트랜잭션이 끝나고 commit 될때 저장된다. 단, JPA도 명시적으로 EntityManager를 통한 flush()로 호출이 가능하다.