Open EntityManager In View 필터는 JPA EntityManager(지속성 컨텍스트: DB에서 읽어온 객체를 관리하는 컨텍스트. 지속성 상태를 관리함)를 요청을 처리하는 전체 프로세스에 바인딩하는 필터입니다.
Spring Boot는 기본적으로 Open EntityManager In View를 구성합니다.
지속 상태의 개체는 트랜잭션 내에서 개체 상태의 변경 사항만 감지하고 트랜잭션이 끝날 때 데이터베이스에 반영합니다.
따라서 데이터를 변경해야 하는 경우 트랜잭션 내에서 관리해야 합니다.
퍼시스턴스 컨텍스트는 뷰가 렌더링될 때까지 유지되므로 렌더링하면서 필요한 데이터를 추가로 읽을 수 있습니다.
(게으른 로딩)
엔터티 개체 변경은 트랜잭션 내에서 수행되어야 합니다.
그래야만 트랜잭션이 끝나기 전에 또는 필요한 경우 변경 사항이 데이터베이스에 반영될 수 있습니다.
@Transactional은 기본적으로 리포지토리에 적용됩니다.
문제 상황: 컨트롤러에서 데이터가 변경되었으나 DB에 반영되지 않음.
이유: 트랜잭션 범위 밖에서 발생했기 때문입니다.
솔루션: 데이터 변경 사항은 서비스 계층에 위임되고 트랜잭션 내에서 처리됩니다.
(서비스 레이어는 @Transactional을 직접 설정해야 합니다.
)
팁: 데이터 수정을 서비스 계층에 위임하고 트랜잭션에서 처리하고 리포지토리 또는 서비스를 사용하여 데이터를 검색하는 것이 좋습니다.