save 메서드 통과, 테스트 메서드 assertThat.isEqualTo 시행, findById 메서드 통과
위의 모든 기능을 테스트해보니 동시성 보장이 되지 않음 (테스트 실패)
조회는 할 수 있지만, 값을 가져올 수 없는 상태
1년 이후 연령 데이터를 수정하기 위해 업데이트를 실시 -> 실패(?)
정합성 문제 사용
flush 쿼리실행 이후 이후 JPQL 쿼리가 실행
Flush와 JPQL에 대하여
Flush는 JPA(Java Persistence API)와 관련된 개념 중 하나로, 영속성 컨텍스트(Persistence Context)의 변경 내용을 데이터베이스에 동기화하는 작업을 의미합니다. JPQL(Java Persistence Query Language) 쿼리와 Flush 간의 관계는 다음과 같이 설명할 수 있습니다:
영속성 컨텍스트와 엔티티: JPA는 영속성 컨텍스트를 통해 엔티티 객체를 관리합니다. 영속성 컨텍스트는 엔티티의 상태를 추적하고, 데이터베이스와의 동기화를 관리합니다.
JPQL 쿼리 실행: JPQL은 JPA에서 엔티티를 조회하거나 조작하기 위한 쿼리 언어입니다. JPQL 쿼리를 실행하면 데이터베이스에서 데이터를 가져오거나 업데이트하게 됩니다.
Flush 작업: 영속성 컨텍스트의 변경 내용을 데이터베이스와 동기화하기 위해 Flush 작업이 수행됩니다. Flush는 영속성 컨텍스트에 보류 중인 변경(추가, 수정, 삭제)을 데이터베이스에 반영하는 역할을 합니다.
JPQL 쿼리와 Flush: JPQL 쿼리를 실행하면 데이터베이스에 대한 변경 내용이 먼저 영속성 컨텍스트에 저장됩니다. 그런 다음 Flush 작업이 트랜잭션 커밋이나 명시적으로 Flush할 때 자동으로 실행되어 데이터베이스에 변경 내용을 반영합니다.
JPQL 쿼리를 실행한 후 데이터베이스에 대한 변경 내용을 즉시 반영하려면 Flush를 수동으로 호출할 수도 있습니다. 이것은 JPA의 EntityManager 인터페이스에서 flush() 메서드를 사용하여 수행할 수 있습니다.
즉, JPQL 쿼리와 Flush는 영속성 컨텍스트와 데이터베이스 간의 변경 내용을 동기화하는 데 사용되며, JPQL 쿼리 실행 후에 변경 내용을 데이터베이스에 반영하기 위해 Flush 작업이 필요합니다.
상단 문제코드, 하단이 해결방법.