JPA 강의 스터디 1

송현진·2023년 4월 29일
0

Jpa

목록 보기
3/9
post-thumbnail
post-custom-banner

JPA에서 가장 중요한 2가지

객체와 관계형 데이터베이스 매핑하기(Object Relation Mapping)

영속성 컨텍스트

"엔티티를 영구 저장하는 환경"
EntityManager.persist(entity);
영속성 컨텍스트라는 곳 저장. 영속화 한다.
DB 저장은 이후에 한다.

JPA 이해하는데 가장 중요한 용어

엔티티 매니저 팩토리와 엔티티 매니저

생성 비용

엔티니 매니저 팩토리는 이름 그대로 엔티티 매니저를 생성하는 역할을 맡는다. 엔티티 매니저 팩토리를 생성하는 비용은 굉장히 크기 때문에 한 개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다. 반면 엔티티 매니저는 생성 비용이 크지 않다.

동시성 문제

엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 되지만, 엔티티 매니저는 여러 스레드가 동 시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안 된다.

영속성 컨텍스트는 논리적인 개념,
눈에 보이지 않고 엔티티 매니저를 통해 접근

엔티티 생명주기

비영속(new/ transient)

영속성 컨텍스트와 전혀 관계없는 새로운 상태

영속(managed)

영속성 컨텍스트에 관리되는 상태

준영속(detached)

영속성 컨텍스트에 저장되었다가 분리된 상태
따라서 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.

  • 엔티티 삭제와의 차이
    엔티티 삭제(em.remove()) 와는 차이가 명확하다. 엔티티 삭제는 DELETE SQL문을 지연 쓰기 SQL 저장소에 등록하고 영속성 컨텍스트에서 엔티티를 삭제하는 것이다.

반면 엔티티 비영속화는 해당 엔티티 관련 INSERT, UPDATE SQL문을 지연 쓰기 SQL 저장소에서 삭제하고, 영속성 컨텍스트에서 엔티티를 삭제하는 것이다.

삭제(removed)

삭제된 상태

영속성 컨텍스트의 이점

1차 캐시
고객 요청 1개 들어와 비즈니스 끝나면 영속성 컨텍스트를 지워 1차 캐시도 날아감.
1번 조회한 거 또 조회하면 쿼리에 안날아감.(단, 동일한 트랜잭션 안에서)
찰나의 순간에만 이점.
여러명의 고객이 사용하는 캐시는 아님. 비즈니스 로직이 굉장히 복잡하면 이점이 있음.

동일성(identity) 보장
1차 캐시로 반복 가능한 읽기(Repeatable Read) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공. 똑같은 거 비교해서 == 해 true가 나옴.

트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
persist 할 때마다 DB 보내지 않고 쓰기지연 SQL 저장소에 저장되었다가 commit할 때 한번에 처리해줌. 버퍼링같은 개념. 한 번에 모아놨다가 보냄.

변경 감지(Dirty Checking)
수정할 때 persist를 또 사용할 필요가 없음.
트랜잭션 커밋하면 엔티티와 스냅샷을 비교함.
바뀌면 쓰기지연 저장소에 넣었다가 커밋함.
변경된 거 JPA가 자동으로 인식해 알려주는 것.
commit할 때 마다 일어남 ㅎㅎ

지연 로딩(Lazy Loading)
쿼리를 나중에 날리는 것.

플러시

영속성 컨텍스트의 변경내용을 데이터베이스에 반영

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면 됨
    • FlushModeType.AUTO
      커밋이나 쿼리를 실행할 때 플러시(기본값)
      왠만하면 오토로 사용함
    • FlushModeType.COMMIT
      커밋할 때만 플러시

발생

  • 변경감지(Dirty Checking)
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 전송
    (등록, 수정, 삭제 쿼리)

영속성 컨텍스트를 플러시하는 방법

  • em.flush() - 직접호출
  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출

준영속 상태

영속 -> 준영속
영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
영속성 컨텍스트가 관리하지 않으므로 1차캐시, 쓰기지연, 변경감지, 지연로딩을 포함한 컨텍스트가 제공하는 어떠한 기능도 동작하지 않는다.
영속성 컨텍스트가 제공하는 기능을 사용 못함(더티 체킹 등)

방법

  • em.detach(entity)
    엔티티 매니저가 관리하는 영속성 컨텍스트에서 특정 엔티티를 제외시킴
  • em.clear()
    엔티티 매니저가 관리하는 영속성 컨텍스트를 비워버림
  • em.close()
    엔티티 매니저 자체를 닫아버림
profile
개발자가 되고 싶은 취준생
post-custom-banner

0개의 댓글