23-06-23 TIL

more·2023년 6월 23일
0

문제

  • 강의를 듣던 도중 영속성 컨텍스트에 대한 내용이 있었는데, 그중에서 entityManager를 통해서 영속성을 관리할 때에 flush라는 메서드와 commit이라는 메서드를 배우게 되었다.
    • commit은 해당 entity의 변경 값을 데이터베이스에 반영을 하게 되는 것으로 이해를 했는데, 이후에 flush라는 메서드의 사용법도 보여주셨다.
    • 헌데 flush를 사용하고 commit을 하자 데이터베이스에 쿼리가 날라가지 않는 모습을 보여주셨다.
    • 그렇다면 flush랑 commit이랑은 같은 역할을 하는 것으로 보이는데, 무슨 차이가 있길래 두 가지를 만들었는지 모르겠다.

시도

  • 뭔가 차이가 있겠지 하고 제공받은 테스트 코드에서 차이를 찾아보려고 했지만, 시간만 날려먹게 되었다.
    • 두 가지 모두 update, delete 할때에 사용이 되었고, 변경 사항을 데이터베이스에 저장 할 수 있었다.

해결

  • 결국 구글링을 통해서 두 가지의 개념과 차이를 찾아 보았다.
    • Flush
      • JPA의 영속성 컨텍스트를 DB와 동기화
      • 변경 감지 -> 영속상태의 엔티티 중 변경된 엔티티를 UPDATE
      • 쓰기 지연 쿼리 동기화 (변경 될 때마다 매번 데이터베이스를 바꾸는 것 보다 다 바꾸고 한번에 변경 사항을 보내는 것이 시간상으로 더 이득이 있기 때문으로 보인다.)
    • commit
      • 트랜잭션을 begin() 으로 수행한 뒤 commit() 하여 트랜잭션을 종료
        -> 결국 transaction이 시작되었을 때 종료하는 것이 commit이라고 보인다.
      • 내부적으로 EntityManager 의 flush() 메서드를 호출
        -> flush를 내포하고 있는 것
    • 차이점
      • flush는 쿼리를 전송하는 역할, commit은 내부적으로 flush를 수행한 뒤 트랜잭션을 끝내는 역할
        -> flush로 전송된 쿼리는 rollback할 수 있지만 commit은 트랜잭션을 끝내므로 rollback 할 수 없다.

알게 된 점

  • 결국 flush는 commit안에 들어있어서 commit이 변경사항을 데이터베이스로 영속화할 수 있도록 하는 기능이였고, commit은 거기에다가 트랜잭션을 끝낸다 라고 프로젝트에 알려주는 기능을 가지고 있다. 따라서 rollback을 하려면 아직 쓰기 지연 쿼리에 저장되는 단계인 flush를 할 때에만 가능하고, commit을 하면 이미 데이터베이스에 변경사항이 저장되어 있으니 rollback이 불가능하며, 다시 원래의 데이터로 바꾸려면 데이터베이스에 쿼리를 날려서 바꾸어야 한다.

0개의 댓글