YoungSoo

Spring-Data-Jpa의 saveAll()과 Dirty Checking 본문

BE/Spring

Spring-Data-Jpa의 saveAll()과 Dirty Checking

YoungSooSoo 2023. 4. 10. 19:06

saveAll()에 대해 알게된 이유는 수백 개의 데이터를 save()로 저장해주었는데 saveAll()를 사용하면 대량의 데이터를 한 번에 처리할 수 있습니다. 이 과정에서 몇 가지의 장점이 있습니다.

  1. 데이터베이스에 접근하는 횟수를 줄일 수 있습니다.
  2. 데이터베이스 처리 속도가 향상됩니다.
  3. 메모리 사용량을 줄일 수 있습니다.

saveAll()이란?

Spring Data JPA의 saveAll() 메서드는 여러 개의 엔티티를 한 번에 데이터베이스에 저장하는 메서드입니다.

이 메서드를 사용하면 데이터베이스에 새로운 엔티티를 저장하거나 이미 존재하는 엔티티를 업데이트할 수 있습니다.

saveAll() 메서드는 Iterable 또는 Collection 인터페이스를 구현한 객체를 파라미터로 받으며, 이 객체에 포함된 모든 엔티티를 데이터베이스에 저장합니다.

예를 들어, 다음과 같이 List<Entity> 형태로 엔티티 목록을 생성하고, saveAll() 메서드를 호출하면 데이터베이스에 엔티티들이 저장됩니다.

saveAll()의 동작 방식

  1. saveAll() 메서드에 전달된 엔티티 객체를 먼저 메모리 상에 보관합니다.
  2. saveAll() 메서드 실행 시점에 Dirty Checking을 통해 영속성 컨텍스트에 있는 엔티티와 비교하여 변경된 엔티티만 저장하거나 새로운 엔티티를 영속화합니다.
  3. 만약 엔티티가 신규로 생성된 것이라면, EntityManager를 사용하여 새로운 엔티티를 영속화시키고, 그렇지 않으면 이미 영속화된 엔티티를 수정합니다.
  4. 모든 엔티티에 대한 저장이 완료된 후, JPA의 트랜잭션을 커밋하여 영속성 컨텍스트를 초기화합니다.

Dirty Checking

더티 체킹(Dirty Checking)은 JPA가 엔티티의 상태 변화를 감지하여 데이터베이스와 동기화하는 메커니즘입니다.

영속 상태(Persistent)의 엔티티는 엔티티 매니저에 의해 관리되며, 매니저가 해당 엔티티의 상태 변화를 감지할 수 있습니다. 이때 매니저는 트랜잭션을 커밋하는 시점에서 엔티티의 상태 변화를 적용합니다. 그런데 만약에 해당 엔티티가 변경된 내용이 없다면, 데이터베이스에 변경 사항을 반영하지 않습니다.

더티 체킹은 이런 경우를 대비해 엔티티가 변경되었는지 여부를 계속해서 감시하고, 변경이 일어날 경우 자동으로 엔티티 매니저에게 알려주는 기능입니다. 이를 통해 개발자가 명시적으로 데이터베이스에 변경 사항을 저장하지 않아도 자동으로 저장될 수 있습니다.

더티 체킹을 통해 엔티티의 상태 변화를 추적할 수 있으므로, 개발자는 엔티티의 상태를 관리하면서도 데이터베이스와의 동기화를 자연스럽게 유지할 수 있습니다.

'BE > Spring' 카테고리의 다른 글

[Spring Cloud Gateway] MSA를 향해 가는 API Gateway 도입기 - 1  (2) 2023.05.24
[Spring JPA] Merge와 Save의 차이  (0) 2023.05.11
왜 Spring Batch를 사용해야할까?  (0) 2023.04.10
Spring Batch  (0) 2023.04.03
Spring의 DB  (0) 2023.03.23