본문 바로가기
JPA

HelloJPA와 영속성 관리 - 내부 동작 방식

by ppirae 2022. 5. 10.

HelloJPA

@Entity : JPA가 관리할 객체

@Id : 데이터베이스 PK와 매핑

 

JPA에서는 트랜잭션이라는 단위가 매우 중요하다.

그래서 데이터를 변경하는 모든 작업은 JPA의 트랜잭션 안에서 작업해야 한다.

 

저장 -> em.persist()

조회 -> em.find() : 한 객체 조회할때

삭제 -> em.remove()

수정 -> em.setOOO()

수정 부분에서는 따로 em.persist()를 안해도 된다.

jpa가 자동으로 update 쿼리를 날려준다.

그 이유는 jpa를 통해서 entity를 가져오면 이 entity는 jpa가 관리를 한다.

그리고 jpa가 트랜잭션을 커밋하는 시점에 변경을 감지하여 업데이트 쿼리를 날린다.

 

주의

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드간의 공유 X (사용하고 버려야함)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

객체를 모두 조회하거나, 조건 또는 통계가 있는 객체를 반환할 땐

Jpql (엔티티 객체를 대상으로 쿼리를 할 수 있는 객체지향 쿼리 언어)을 사용해야한다.

List<Member> result = em.createQuery("select m from Member as m", Member.class)
        .getResultList();

페이징을 할때도 .setFirstResult() 와 .setMaxResult()로 페이징 할 수 있다.


영속성 관리

JPA에서 가장 중요한 2가지

  • 객체와 관계형 데이터베이스 매핑하기
  • 영속성 컨텍스트

영속성 컨텍스트 -> 엔티티를 영구 저장하는 환경

 

엔티티의 생명주기

비영속(new/transient), 영속(managed), 준영속(detached), 삭제(removed)

 

영속성 컨텍스트의 이점

  • 1차 캐시 : 성능 이점을 크게 얻지는 않음 
  • 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  • 변경 감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)

플러시 -> 영속성 컨텍스트의 변경내용을 데이터베이스에 반영

플러시 하는 방법

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

플러시는

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위를 중요시 -> 커밋 직전에만 동기화하면됨

준영속 상태 -> 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)

em.detach(entity), em.clear(), em.close()


인프런 김영한님의 JPA 기본편을 듣고 작성한 글입니다.

https://inf.run/87Mz

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

'JPA' 카테고리의 다른 글

JPA 연관관계 매핑 기초  (0) 2022.05.13
JPA 엔티티 매핑  (0) 2022.05.11
JPA에 대해..  (0) 2022.05.09
JPA 웹 계층 개발 - 홈 화면과 레이아웃  (0) 2022.04.22
JPA 주문 도메인 개발  (0) 2022.04.20

댓글