반응형
ActionQueue
커리어리에서 개발 관련 글을 읽다가 JPA가 flush 할 때 개발자가 의도한 비지니스 로직 대로, 실행되지 않는다는 글을 읽게 되었다.
그래서 실제로 간단한 Entity하나를 만들어서 테스트해봤다.
테스트 한 내용은 이렇게된다.
예상 로직 : insert -> select -> insert -> delete -> insert
실제로직 : insert -> insert -> insert -> delete
하지만 test하니까 정말로 중복키 에러가 뜨는 것이였다.
그래서 ActionQueue에 대해서 찾아봤다.
ActionQueue의 주요 역할
- 엔티티 상태 추적:
- JPA에서는 엔티티 객체를 관리하는데, ActionQueue는 엔티티 객체가 변경될 때마다 그 변경 사항을 추적합니다. 예를 들어, persist(), merge(), remove()와 같은 메서드를 호출하면 해당 엔티티의 상태 변화가 큐에 기록됩니다.
- 변경 사항 큐에 추가:
- 데이터베이스에 대한 업데이트, 삽입, 삭제와 같은 작업을 실제로 실행하기 전에 ActionQueue는 이들 작업을 큐에 추가합니다. 이렇게 쌓인 작업들은 트랜잭션이 끝날 때 일괄 처리됩니다.
- 플러시(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 |