Open EntityManager

Open EntityManager In View Filter는 요청을 처리하는 전 과정에 JPA EntityManager(Persistence Context: DB에서 읽어온 객체를 관리하는 컨텍스트. 영속 상태를 관리)를 묶어주는 필터이다.

Spring Boot는 기본적으로 Open EntityManager In View를 구성합니다.

영속 상태의 객체는 트랜잭션 내 객체 상태의 변화만 인식하고 트랜잭션 종료 시 DB에 반영한다.

따라서 데이터를 변경해야 하는 경우 트랜잭션 내에서 관리해야 합니다.


서비스가 트랜잭션을 관리하는 경우

저장소에서 관리하는 경우

또한 뷰가 렌더링될 때까지 지속성 컨텍스트가 유지되므로 렌더링 시 필요한 데이터를 읽을 수 있습니다.

(게으른 가게)

엔터티 객체에 대한 변경은 트랜잭션 내에서 이루어져야 합니다.

그래야만 트랜잭션 종료 직전이나 필요할 때 변경 사항이 DB에 반영될 수 있습니다.

@Transactional은 기본적으로 저장소에 적용됩니다.

문제 상황: 컨트롤러에서 데이터가 변경되었지만 DB에 미러링되지 않았습니다.

이유: 트랜잭션 범위 밖에서 발생했기 때문입니다.

솔루션: 데이터 변경 사항은 서비스 계층에 위임되고 트랜잭션 내에서 처리됩니다.

(서비스 레이어는 @Transactional을 직접 지정해야 합니다.

)

팁: 데이터 수정을 서비스 계층에 위임하고 트랜잭션 내에서 처리하고 리포지토리 또는 서비스를 통해 데이터를 가져오는 것이 좋습니다.