JPA 에서 쓰기 지연(write-behind) 으로 쿼리를 한번에 데이터베이스에 적용하는 이유와 장점
Intro.
JPA에서 쓰기 지연으로 지연 SQL 쿼리 저장소에 쿼리를 모아놨다가 flush() 시점에 한번에 쿼리를 데이터베이스에 적용(동기화)하는 이유가 궁금해졌습니다.
검색 전 예상으로는,
- 쿼리마다 데이터베이스에 쿼리를 전송하면 한번에 보내는 것보다 부하가 걸림
- 트랜잭션을 구현해야 함으로, 즉 보장해야 함
- 지연 SQL 저장소에 모아놨다가 롤백되는 경우 데이터베이스에 반영이 안된상태. 즉, 트랜잭션 원자성 보장
- 결국 성능과 트랙잭션을 잘! 보장하기 위해 사용하는 것이라고 예상합니다. 밑에는 검색 결과이며, 쿼리를 어떻게 최적화하는지는 좀 더 깊게 들어가야 할 것 같습니다.
효율적인 쿼리 실행
쓰기 지연을 통해 JPA 는 변경된 엔티티를 일괄로 처리하고, 데이터베이스에 보내는 쿼리의 수를 최소화합니다.
- 네트워크 오버헤드와 데이터베이스 리소스 사용을 줄일 수 있습니다.
트랜잭션 안정성
쓰기 지연은 변경된 엔티티를 실제로 데이터베이스에 반영하기 전까지 모든 변경 내용을 트랜잭션 내에 유지합니다.
- 데이터 일관성과 트랙잭션 안정성을 보장하는 데 도움을 줍니다.
- 트랜잭션 내에서 발생한 예외로 인해 롤백이 필요한 경우, 쓰기 지연을 통해 변경 내용을 롤백할 수 있습니다.
영속성 컨텍스트 관리
JPA 는 영속성 컨텍스트라는 메모리 내의 엔티티 관리 기능을 제공합니다. 쓰기 지연을 사용하면 변경된 엔티티를 컨텍스트에 저장하고, 나중에 데이터베이스에 적용할 수 있습니다.
- 엔티티의 변경을 감지하고, 최적의 쿼리 실행 순서와 방식을 결정할 수 있습니다.
성능 향상
쓰기 지연은 여러 개의 변경 작업을 하나의 쿼리로 일괄 처리하므로, 데이터베이스와의 라운드 트립 횟수를 줄입니다.
- 이는 네트워크 지연 시간과 데이터베이스 작업 오버헤드를 절감하여 성능을 향상 시킵니다.
Leave a comment