Spring/JPA

태태개발일지 - ActionQueue

태태코 2024. 11. 18. 17:19
반응형

ActionQueue

 

커리어리에서 개발 관련 글을 읽다가 JPA가 flush 할 때 개발자가 의도한 비지니스 로직 대로, 실행되지 않는다는 글을 읽게 되었다.

 

그래서 실제로 간단한 Entity하나를 만들어서 테스트해봤다.

테스트 한 내용은 이렇게된다.

 

예상 로직 : insert -> select -> insert -> delete -> insert

실제로직 : insert -> insert -> insert  -> delete

 

하지만 test하니까 정말로 중복키 에러가 뜨는 것이였다. 

그래서 ActionQueue에 대해서 찾아봤다.

 

ActionQueue의 주요 역할

  1. 엔티티 상태 추적:
    • JPA에서는 엔티티 객체를 관리하는데, ActionQueue는 엔티티 객체가 변경될 때마다 그 변경 사항을 추적합니다. 예를 들어, persist(), merge(), remove()와 같은 메서드를 호출하면 해당 엔티티의 상태 변화가 큐에 기록됩니다.
  2. 변경 사항 큐에 추가:
    • 데이터베이스에 대한 업데이트, 삽입, 삭제와 같은 작업을 실제로 실행하기 전에 ActionQueue는 이들 작업을 큐에 추가합니다. 이렇게 쌓인 작업들은 트랜잭션이 끝날 때 일괄 처리됩니다.
  3. 플러시(Flush) 시점에서 작업 실행:
    • flush() 메서드가 호출되면 ActionQueue에 쌓인 모든 작업들이 데이터베이스에 반영됩니다. 이 때 큐에 쌓인 작업들이 실행되어 실제 데이터베이스에 반영되며, 이는 트랜잭션의 일관성을 유지하는데 도움을 줍니다.

 

즉 sql문을 담아놨다가 뿌려주는 역할을 하는데 중점은 뿌려줄 때 Insert, update , delete 간의 순서차이가 있다는 점이다.

 

  • 수정된 엔티티 순서 (Update) 처리:
    • 먼저 ActionQueue에 쌓인 수정 작업(Update)을 처리합니다. 데이터베이스에 반영해야 할 업데이트가 먼저 수행되는 이유는, 수정된 엔티티가 다른 삽입 또는 삭제 작업과 관련이 있을 수 있기 때문입니다. 예를 들어, 외래 키 제약조건을 지키기 위해서 수정된 값이 먼저 반영되어야 할 필요가 있습니다.
    • 이 단계에서는 수정된 엔티티들이 현재 상태를 반영하도록 먼저 쿼리로 전송됩니다. 이때, 엔티티의 버전 관리변경 감지(dirty checking)가 중요하며, 이 과정에서 수정된 엔티티들이 실제로 어떻게 수정되었는지에 대한 정보가 데이터베이스에 반영됩니다.
  • 새로운 엔티티 삽입 (Insert) 처리:
    • ActionQueue에 쌓인 삽입 작업(Insert)은 두 번째로 처리됩니다. 새로운 엔티티가 삽입되기 전에 관련된 수정 작업이 먼저 반영되어야 합니다. 이 단계에서는 ActionQueue에 기록된 새로 삽입할 엔티티들을 데이터베이스에 삽입하는 쿼리가 실행됩니다.
    • 삽입 작업은 주로 INSERT INTO 쿼리로 처리되며, 데이터베이스에 새로운 레코드가 추가됩니다. 삽입된 엔티티는 이제 영속성 컨텍스트에 반영되고, 그 후의 작업에서도 참조할 수 있게 됩니다.
  • 삭제된 엔티티 처리 (Delete):
    • 마지막으로 ActionQueue에 쌓인 삭제 작업(Delete)이 처리됩니다. 삭제된 엔티티들은 DELETE FROM 쿼리를 사용하여 데이터베이스에서 삭제됩니다.
    • 삭제 작업은 외래 키 제약조건, 트랜잭션의 일관성 등을 고려하여 마지막에 처리되며, 다른 작업이 모두 완료된 후에야 데이터베이스에서 해당 엔티티가 삭제됩니다.

해결방안 :  delete 대신 update를 사용한다..?

나중에 JPA를 활용하여 로직을 개발할 때 이점을 꼭 유의하고 짜야겠다.

 

 

반응형

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

태태개발일지 - 양방향 연관관계  (1) 2024.11.22
태태개발일지 - JPA 슈퍼타입  (1) 2024.11.20
태태개발일지 - ManyToMany  (2) 2024.11.15
태태개발일지 - OneToOne  (0) 2024.11.15
태태개발일지 - JPA 연관관계  (0) 2024.11.14