Open EntityManager In View 라는 필터는 JPA EntityManager(영속성 컨텍스트: DB에서 읽어온 객체들을 관리하는 컨텍스트. persistent 상태인 객체들을 관리) 또는 hibernate session(영속성 컨텍스트), 즉 영속성 컨텍스트를 뷰 랜더링이 끝날 때 까지 유지하는 것이다.
스프링부트는 기본적으로 Open EntityManager In View를 설정해준다.
persistent 상태인 객체들은 트랜잭션 안에서는 객체 상태의 변경만 감지하다가 트랜잭션이 종료될 때 DB에 반영한다.
따라서 데이터를 변경해야하는 일이 있는 경우, 트랜잭션 내에서 관리해준다.
OEIV(OSIV)를 사용하면 뷰를 랜더링 할 때까지 영속성 컨텍스트를 유지하기 때문에, 뷰에 데이터를 랜더링 할 때, 뷰에 전달해야하는 모든 것들을 미리 읽어와서 모델에 담아주는 것이 아니라, 뷰에서 도메인 기반으로 추가로 로딩을 할 수가 있다.(lazy loading)
스프링 부트인 경우, repository에는 기본적으로 @Transactional이 붙어져있다. 따라서 repository를 통해서 무엇인가 하면 트랜잭션을 사용하는 것이다. 그러나 Service같은 경우는 @Transactional을 직접 설정하지 않는다면, 데이터 변경이 있을 때 DB 반영이 안된다.
따라서, 아래와 같이 처리해 줄 수도 있다.