3일차 과제

2023. 5. 10. 15:57이력서 스터디

JPA 영속성 컨텍스트

 - 엔티티를 영구 저장하는 환경

 

엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다.

 

영속성 컨텍스트의 특징

영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다.

JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터 베이스에 반영하는데 이를 flush라 한다.

 

영속성 컨텍스트의 장점

 - 1차 캐시

영속성 컨텍스트 내부에는 캐시가 있는데 이를 1차 캐시라고 한다. 영속 상태의 엔티티를 이곳에 저장한다. 1차 캐시의 키는 식별자 값(데이터베이스의 기본 키)이고 값은 엔티티 인스턴스이다.

// em.find(엔티티 클래스 타입, 식별자 값);
Member member = em.find(Member.class, "member1");

조회의 흐름
1. 1차 캐시에서 엔티티를 찾는다
2. 있으면 메모리에 있는 1차 캐시에서 엔티티를 조회한다.
3. 없으면 데이터베이스에서 조회한다.
4. 조회한 데이터로 엔티티를 생성해 1차 캐시에 저장한다. (엔티티를 영속상태로 만든다)
5. 조회한 엔티티를 반환한다.

 

 - 동일성 보장

영속성 컨텍스트는 엔티티의 동일성을 보장한다.

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.print(a==b) // true

동일성 : 실제 인스턴스가 같다. (== 성립)

동등성 : 실제 인스턴슨느 다르지만 인스턴스가 가지고 있는 값이 같다. (equals()메소드 사용)

 

 - 트랜잭션을 지원하는 쓰기 지연

em.find(member)를 사용해 member를 저장해도 바로 INSERT SQL이 DB에 보내는 것이 아니다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다. 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 DB에 보낸다. 이것을 트랜잭션을 지원하는 쓰기 지연이다.

 

 - 변경 감지(영속성 컨텍스트가 관리하는 영속 상태의 엔티티만 적용된다.)

JPA로 엔티티를 수정할 때는 단순히 엔티티를 조회해서 데이터를 변경하면 된다.

변경감지의 흐름

1. 트랙잭션을 커밋하면 엔티티 매니저 내부에서 먼저 플러시가 호출된다.
2. 엔티티와 스냅샷을 비교하여 변경된 엔티티를 찾는다.
3. 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰기 지연 SQL 저장소에 저장한다.
4. 쓰기 지연 저장소의 SQL을 플러시한다.
5. 데이터베이스 트랜잭션을 커밋한다.

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();

Member member = em.find(Member.class, "member1");
member.setName("노영삼");

transaction.commit();

 - 지연로딩

Member와 Team 사이가 다대일 @ManyToOne 관계로 매핑되어 있는 상황에서, 로딩되는 시점에 Lazy 로딩 설정이 되어있는 Team 엔티티는 프록시 객체로 가져온다.

후에 실제 객체를 사용하는 시점에(Team을 사용하는 시점에) 초기화가 된다. DB에 쿼리가 나간다.

  • getTeam()으로 Team을 조회하면 프록시 객체가 조회가 된다.
  • getTeam().getXXX()으로 팀의 필드에 접근 할 때, 쿼리가 나간다.

제네릭

특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화시키는 기법

 

제네릭의 장점

 - 타입이 결정되지 않고 컴파일 시에 타입이 결정되므로 보다 안전한 프로그래밍 가능

 - 런타임 타입 충돌 문제 방지

 - 개발시 타입 캐스팅 절차 불필요

 - ClassCastException 방지 => 부모 클래스가 자식 클래스를 캐스팅

 

컬렉션에서 사용하는 이유

구체적인 타입을 지정하면 해당 값만 저장하도록 사용할 수 있다. 특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 컬렉션을 일반화 시키기위해 <E>사용, <E> 자체를 타입 매개변수라고 부른다.

'이력서 스터디' 카테고리의 다른 글

7일차  (1) 2023.05.17
5일차  (0) 2023.05.13