데이터를 조금 더 효율적으로 다뤄보기 위한 차원에서 등장한 것
영속성, 지속성의 의미
영속성 컨텍스트 (Persistence Context)
응용 프로그램와 DB 사이에 하나의 단계가 더 추가된 느낌
데이터베이스와 어플리케이션 사이를 이어주는 중간의 다리가 되어주는 공간
데이터의 무결성을 유지하기 위한 개념
ACID : 원자성, 일관성, 고립성, 지속성 (트랜잭션의 특성)
한 번 변화가 발생하면 전부 반영하거나, 전부 반영하지 않는다.
트랜잭션 안에 들어와서 처리를 하고 commit이 됐다면 데이터의 변경문들이 한 번에 적용되었다는 것이다.
데이터의 삽입이나 조회의 경우, 여러 개의 트랜잭션이 실행되도 괜찮다.
단 데이터 수정의 경우, 같은 데이터를 다른 사용자가 다른 값으로 변경하게 되면 충돌이 일어날 수 있으므로 하나의 트랜잭션만 허용한다.
엔티티를 영속성 컨텍스트에 가져와서 저장한다고 해서 바로 저장되지는 않음
영속성 컨텍스트 안에 Action Queue가 있는데, 여기에 엔티티의 변경문을 쌓아놓고, 마지막에 commit을 수행하면 Action Queue에 있던 변경문들이 DB에 반영된다.
일반적으로 영속성 컨텍스트가 만들어지는 시점은 트랜잭션이 만들어지는 시점과 같다.
트랜잭션은 @Transactional 에너테이션을 사용했을 때 만들어진다.
따라서 영속성 컨텍스트가 Service 부터 등장하게 된다.
OSIV(Open Session In View)라는 개념이 있는데, 이는 Controller 레벨까지 영속성 컨텍스트를 확장하는 것이다.
영속성 컨텍스트가 Service 부터 시작되는 것이 아니라 앞의 Controller 까지 범위가 확장되는 것이다.
기본적으로 true가 적용되어 있어 Controller까지 영속상태가 유지되는데, false로 설정하면 Service부터 영속상태가 생성된다.
만약 Repository와 데이터베이스 간의 연결이 많이 사용되지 않는 경우라면 OSIV를 켜도 되지만 (영속성 컨텍스트 범위를 Controller부터)
Repository와 데이터베이스 간의 연결이 많이 사용되는 경우라면 OSIV를 꺼두어야 한다. (영속성 컨텍스트 범위를 Service부터)