-
Open EntityManager In View 필터Spring 2023. 2. 14. 02:38
Open EntityManager In View 필터는 JPA EntityManager(영속성 컨텍스트: DB에서 읽어온 객체들을 관리하는 컨텍스트. persistent 상태인 것을 관리)를 요청을 처리하는 전체 프로세스에 바인딩 시켜주는 필더이다.
스프링부트는 기본적으로 Open EntityManager In View를 설정해준다.
persistent 상태인 객체들은 트랜잭션 안에서는 객체 상태의 변경만 감지하다가 트랜잭션이 종료될 때에 DB에 반영한다.
그러므로 데이터를 변경해야하는 일이 있는 경우, 트랜잭션 내에서 관리해주어야 한다.
뷰를 랜더링 할 때 까지 영속성 컨텍스트를 유지하기 때문에 필요한 데이터를 랜더링하는 시점에 추가로 읽어올 수 있다. (지연 로딩. Lazy Loading)
엔티티 객체 변경은 반드시 트랜잭션 안에서 해야 한다. 그래야 트랜잭션 종료 직전 또는 필요한 시점에 변경 사항을 DB에 반영할 수 있다.
repository에는 기본적으로 @Transactional이 적용되어 있다.
문제 상황: 컨트롤러에서 데이터를 변경했더니 DB에 반영이 되지 않았다.
원인: 트랜잭션 범위 밖에서 일어난 일이기 때문
해결: 데이터 변경은 서비스 계층으로 위임해서 트랜잭션 안에서 처리한다. (서비스 계층은 @Transactional 을 직접 설정해주어야 한다.)
팁: 데이터 변경은 서비스 계층으로 위임해서 트랜잭션 안에서 처리하고, 데이터 조회는 레파지토리 혹은 서비스를 이용하는게 좋다.
'Spring' 카테고리의 다른 글
Spring 빈 스코프(Bean Scope) - 싱글톤, 프로토타입 (0) 2023.03.30 Spring 필터(Filter), 인터셉터(Interceptor), AOP (0) 2023.03.16 Spring의 @EventListener (0) 2023.01.30 Entity와 DTO 분리하기 (0) 2023.01.25 Setter 사용을 지양해야 하는 이유 (0) 2023.01.19