JPA 개념 및 원리

Codren·2021년 9월 17일
1

Spring Boot 쇼핑몰

목록 보기
2/32

Section 1. JPA

1. JPA (Java Persistence API)

Java 객체와 관계형 DB 사이를 매핑하는 ORM 기술 표준

  • 인터페이스 (=기술 표준) 이므로 실제 구현체는 Hibernate 등등




2. JPA 장점

  • 특정 데이터베이스에 종속되지 않음
    - 데이터베이스마다 쿼리문이 조금씩 다르기 때문에 데이터베이스 변경에 어려움이 많음, 하지만 JPA 는 추상화한 데이터 접근 계층을 제공하므로 설정 파일에 사용 데이터베이스만 지정하면 됨

  • 객체 지향적 프로그래밍 및 생산성 향상
    - 개발자가 직접 SQL을 작성하는 데이터베이스 설계 중심에서 Java 객체에 집중하도록 지원
    - 테이블 컬럼 수정 시 매핑된 클래스만을 변경하면 적용됨




3. JPA 단점

  • 복잡한 쿼리 처리 불가
  • 자동으로 생성되는 쿼리로 인해서 개발자가 의도하지 않는 성능 저하
  • 방대한 JPA 기술 학습에 필요한 시간과 노력



Section 2. JPA 동작 원리

1. JPA 동작 원리



2. Entity

데이터베이스의 테이블에 대응하는 클래스

  • 데이터베이스에 item 테이블 ⟷ Item.java 클래스
  • @Entity 어노테이션 붙은 클래스를 JPA 가 관리




3. Entity Manager Factory

엔티티 매니저 인스턴스를 관리하는 주체

  • Application 실행 시 한 개만 만들어짐
  • 사용자로부터 요청이 오면 엔티티 매니저를 생성




4. Entity Manager

Persistence Context 에 접근하여 DB 작업을 제공하는 객체

  • 내부적으로 DB Connection 을 이용해서 DB 에 접근




5. Persistence Context

Entity 를 영구 저장하도록 지원하는 환경으로써 엔티티 매니저를 통해 접근 가능함




6. Entity Life Cycle

  • 비영속 (new)
    - new 키워드를 통해 생성된 상태로 아직 영속성 컨텍스트에 저장되지 않음

  • 영속 (managed)
    - 엔티티가 영속성 컨텍스트에 저장되어 관리되는 상태
    - 아직 DB 에 저장된 상태 X, 트랜잭션 Commit 후에 DB 에 반영

  • 준영속 상태 (detached)
    - 영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태

  • 삭제 상태 (removed)
    - 영속성 컨텍스트와 데이터베이스에서 삭제된 상태




7. Example Code

Item item = new Item();		// 1
item.setItemNm("테스트 상품");	

EntityManager em = entityManagerFactory.createEntityManager();	// 2
EntityTransaction transaction = em.getTransaction();		// 3
	
transaction.begin();		
em.persist(item);		// 4
transaction.commit();		// 5

em.close();			// 6

    ① new 키워드로 영속성 컨텍스트에 담을 상품 엔티티 생성 (아직 안에 담기지 않음)
    ② 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성
    ③ 데이터 변경 시 무결성을 위해 트랜잭션 시작
    ④ 영속성 컨텍스트에 저장된 상태, 아직 DB에 INSERT SQL 보내기 전
    ⑤ 트랜잭션을 DB에 반영, 이 때 실제로 INSERT SQL 수행
    ⑥ 엔티티 매니저와 엔티티 매니저 팩토리 자원을 close() 호출로 반환




8. Persistence Context 사용 시 이점

  • 1차 캐시
    - 영속성 컨텍스트 내에 저장되는 캐시로 Map<KEY,VALUE>로 저장됨
    - entityManager.find() 메소드 호출 시 1차 캐시 조회
    - 존재할 경우 반환, 없으면 DB 조회 후 1차 캐시에 저장 및 반환

  • 동일성 보장
    - 하나의 트랜잭션에서 같은 키값으로 같은 엔티티 조회를 보장받음

  • 트랜잭션을 지원하는 쓰기 지연
    - entityManager.persist() 호출하면 1차 캐시에 저장과 동시에 지연 SQL 저장소에 저장
    - Commit 호출 시 쌓인 SQL문들이 flush() 되면서 DB 에 반영
    - 한 번에 처리하기 때문에 성능 이점

  • 변경 감지
    - JPA 는 1차 캐시에 DB 에서 처음 불러온 엔티티의 스냅샷을 저장
    - 스냅샷과 비교하여 변경 내용이 있따면 UPDATE SQL 수행

0개의 댓글