영속성 컨텍스트란
영속성 컨텍스트는 '엔티티를 영구 저장하는 환경' 이라는 뜻으로 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
다만 영구 저장한다고 해서 물리적으로 영구 저장되는 것은 아니고 트랜잭션 단위의 휘발성 메모리 공간이다.
영속성 컨텍스트의 장점
1차 캐시
영속성 컨텍스트는 엔티티가 영속성 컨텍스트에 1차 캐시에 있을 경우 DB 까지 접근하지 않고 메모리에 있는 1차 캐시에서 엔티티를 바로 불러오는 방식으로 동작한다. 만약 1차 캐시에 없을 경우 DB 까지 접근해서 가져온 엔티티를 1차 캐시에 저장하여 이후부터는 1차 캐시를 통해 조회할 수 있도록 한다.
이로 인해 성능상 이점을 누릴 수 있다.
동일성 보장
1차 캐시에서 엔티티를 불러올 수 있기 때문에 한 트랜잭션 안에서 동일한 엔티티를 여러 번 불러올 때 동일성을 보장할 수 있다. DB 레벨이 아닌 어플리케이션 레벨에서 REPEATABLE READ 등급의 트랜잭션 격리 수준을 제공할 수 있는 것이다.
트랜잭션을 지원하는 쓰기 지연
한 트랜잭션에서 여러 쿼리문이 발생할 경우 쿼리문이 발생할 때마다 DB 에 쿼리를 날리는 것보다는 쿼리를 모아뒀다가 한 번에 날리고 트랜잭션을 커밋하는 것이 성능 상 이점을 가질 수 있는데 영속성 컨텍스트에는 쓰기 지연 SQL 저장소가 있어 여기에 쿼리를 모아뒀다가 트랜잭션 커밋 전에 한 번에 DB에 쿼리를 날려 성능 상 이점을 가질 수 있다.
변경 감지
영속성 컨텍스트에 엔티티를 보관할 때는 최초 상태를 복사해서 스냅샷을 저장하게 되는데 플러시 시점에 스냅샷과 엔티티를 비교해 변경된 엔티티가 있으면 자동으로 수정 쿼리를 생성해 쓰기 지연 SQL 저장소에 보내서 처리하므로 휴먼 에러를 방지할 수 있다.
지연 로딩
영속성 컨텍스트는 연관관계에 있는 엔티티를 조회할 경우 한 번에 다 가져오기 않고 필요 시에 가져오는 방식으로 동작하는데 이 덕분에 불필요한 쿼리 실행을 방지할 수 있다.
A 와 B 가 연관관계에 있을 때 A 만을 조회하는데 B 까지 조회하는 쿼리가 발생한다면 이는 불필요한 낭비다.
영속성 컨텍스트는 A 를 조회할 경우 B는 일단 프록시 객체로 채워놓고 추후에 B를 실제로 조회할 때 쿼리를 날려 조회해오는 방식이다.
'기술 면접 질문' 카테고리의 다른 글
스프링 컨테이너(Spring Container)에 대해 설명해주세요 (0) | 2023.07.24 |
---|---|
List, Set, Map, HashMap 의 차이에 대해서 설명해주세요 (0) | 2023.07.24 |
의존성 주입에 대해 설명해주세요 (0) | 2023.07.23 |
제네릭에 대해 설명하고 컬렉션 클래스에서 왜 제네릭을 사용하는 지 설명해주세요 (0) | 2023.07.21 |
Spring MVC 에서의 예외 처리 기법에 대해 설명해주세요 (0) | 2023.07.21 |