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()로 호출이 가능하다.
'기타' 카테고리의 다른 글
MFA TOTP 인증 자동화 (0) | 2025.01.17 |
---|---|
IDasS(Okta) 생체인식(지문인식) 사용하기 (2) | 2024.12.20 |
Intellij Mybatis Mapper 경고(Warring) 표시 제거 (0) | 2024.03.12 |
Intellij Plugin 정리 (0) | 2024.03.12 |
MSA 사례 및 사례 별 MSA 적용 절차 정리 (0) | 2024.02.28 |