Backend/JPA

[JPA] EntityManager

findmypiece 2021. 12. 8. 09:44
728x90

JPA가 아닌 환경에서 api호출과 DB수정이 함께 필요한 로직이 있다고 가정해보자. 트랜잭션 단위로 완벽하게 묶을 순 없지만 DB수정 -> api 호출 과 같은 순서로 진행하도록 해 놓으면 api 호출에 문제가 있을 경우 RuntimeException 을 발생시켜서 DB수정을 롤백하면 된다.

하지만 JPA 환경에서는 이게 불가능하다. JPA 는 flush 단계에서 실제 DB로 쿼리를 날리고 flush는 트랜잭션이 종료된 시점에 commit 과 함께 수행되기 때문에 쿼리가 정상인지 여부를 기본적으로 트랜잭션이 종료되는 시점(일반적으로 메소드가 정상 종료된 시점)에 알 수 있다.

이에 트랜잭션으로 묶인 메소드에서 단순히 DB수정 -> api 호출 과 같은 순서로 진행하도록 구성을 해놓을 경우 DB수정 쿼리에 구문오류가 있더라도 api 호출은 정상적으로 수행되고 메소드 실행이 종료되는 시점에 구문오류로 인해 DB수정은 롤백되는 현상이 발생할 수 있다.

이런 현상을 막으려면 DB수정 -> api 호출 중간에 임의로 flush 를 해줘야 하는데 이 때 EntityManager가 필요하다. SpringBoot 환경에서는 아래와 같이 EntityManager를 얻어올 수 있다.

@PersistenceContext
private EntityManager entityManager;

 

https://way-be-developer.tistory.com/241
https://lng1982.tistory.com/276
728x90