W2AS2L
2023. 6. 15. 22:08
2023. 6. 15. 22:08
영속성 컨텍스트란?
- Server side와 Database 사이에 엔티티를 저장하는 논리적인 영역이라고 할 수 있다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 보관하고 관리한다.
- 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 그리고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있고 영속성 컨텍스트를 관리할 수 있다.
영속성 컨텍스트가 엔티티를 관리하면 얻게되는 장점
1차 캐시
- Map 객체로 저장
- 엔티티를 식별자 값(@Id 매핑)으로 구분한다. Key-value로 관리하는데 이때 key 값이 @Id 값이 된다.
- 식별자 값 필요
- 영속상태의 엔티티는 반드시 식별자 값이 있어야 한다.
- 1차 캐시를 사용하면 한 가지 기능을 두개의 트랜잭션으로 처리할 경우?
- OSIV를 사용하여 영속성 컨텍스트의 데이터를 공유한다.
- 2차 캐시는 언제 사용하나?
- 하이버 네이트가 지원하는 캐시는 크게 3가지가 있음
- 엔티티 캐시
- 엔티티 단위로 캐시한다. 식별자로 엔티티를 조회하거나 컬렉션이 아닌 연관된 엔티티를 로딩할 때 사용한다.
- 쿼리 캐시
- 쿼리와 파라미터 정보를 키로 사용해서 캐시한다.
- 컬렉션 캐시
- 엔티티와 연관된 컬렉션을 캐시한다. 컬렉션이 엔티티를 담고 있으면 식별자 값만 캐시한다.
- 문제는 쿼리 캐시나 컬렉션 캐시만 사용하고 대상 엔티티에 엔티티 캐시를 적용하지 않으면 성능상 심각한 문제가 발생할 수 있다.
동일성 보장
- 동일한 객체 반환
- Collection에서 객체를 빼오듯이 같은 객체를 반환하게 되면 새로운 객체가 나오는 것이 아니라 동일한 객체가 반환된다.
- JPQL을 사용하게 되면 기존 영속성 컨텍스트의 데이터는 갱신되나?
- 변경감지
- 자동 Update
- 영속성 상태의 객체는 객체의 데이터가 변경이 되면, 자동 update 된다.
- EntityManager에서 flush가 되고, commit이 된다.
- flush가 되는 시점
- 강제 flush 호출
- 트랜잭션 종료시
- JPQL 쿼리 실행
- JPQL은 실제 DB side에서 데이터를 가져오기 때문에 동기화를 위하 JPQL 쿼리가 실행 전에 flush가 된다.
트랜잭션으로 인한 쓰기 지연
- 쓰기 지연
- 영속성 컨텍스트는 트랜잭션 범위 안에서 동작한다. 그래서 트랜잭션이 끝나야 commit이 이뤄지고 반영된다.
Lazy 로딩
- 엔티티와 관계가 맺어진 엔티티의 데이터를 실제로 접근하여 자식 객체가 필요한 시점에 로딩합니다. 이를 통해 불필요한 데이터베이스 쿼리를 줄이고, 성능을 최적화할 수 있습니다.
Checked Exception과 트랜잭션은 아무 상관 없다
- @Transactional은 기본적으로 unchecked exception에 대해서만 rollback을 수행한다고 알고있었다. 하지만 엄밀히 말하자면 그것은 오해라고 할 수 있다.
- 트랜잭션이, 메세지 트랜잭션을 말하는 건지, 데이터베이스 트랜잭션을 말하는 건지 데이터베이스의 트랜잭션을 말하는 것이라도 checked exceptoin이든 unchecked exceptoin이든 에 따라 롤백을 할지 안할지는 전적으로 개발자에게 달려 있다.
- 즉, 자바 프로그래밍 언어에서는 위와 같은 규칙은 없다.
- Exception 종류에 따라 롤백 유무가 다르다고 정리된 이유는, 자바의 유명한 프레임워크 Spring Framework 의 트랜잭션 처리에서 비롯 됐기 때문
- 스프링에서는 기본적으로는 런타임 예외 같은경우 바로 롤백을 한다.
- 그러나 이 상황도 개발자가 옵션을 어떻게 설정하느냐에 따라 충분히 바꿀 수 있는 요소이다. 예를들어 런타임 자식 예외클래스 중에 몇몇을 골라서 롤백을 하지 않도록 설정이 가능하다.
- 따라서 정리하자면, 자바를 스프링과 동일시 한다면 위의 정리는 맞지만, 자바 프로그래밍에서만 생각한다면 checked exceptoin과 unchecked exceptoin과 트랜잭션 롤백 유무는 연관이 없는 것이다. 그리고 예외발생이 트랜잭션 처리에 대해서는 checked 든 unchecked 든 전적으로 개발자 마음에 달려있다고 볼 수 있다.