Spring/Spring Data JPA

[Spring Data JPA] JPA란? (Java Persistence API)

고해주 2023. 1. 18. 16:36

JPA (Java Persistence API)

 

- 자바 ORM 기술에 대한 표준 API

- 대표적 구현체 : Hibernate, EclipseLink, DataNucleus, OpenJpa, TopLink 등

 

*ORM (Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑해주는 것

 

  • 장점

   - 특정 데이터베이스에 종속되지 않음

   - 객체지향적 프로그래밍 - 직관적이고 비즈니스 로직에 집중할 수있음

   - 생산성 향상

 

  • 단점

   - 복잡한 쿼리 처리

   - 성능 저하 위험

   - 관계형 데이터베이스에 대한 이해필요

 

 

 

JPA 구성 및 동작방식

  • Entity Manager Factory 엔티티 매니저 팩토리

   - Entity Manager 관리하는 주체

   - 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성함

 

  • Entity Manager 엔티티 매니저 

   - 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공

   - 데이터베이스 커넥션을 사용하여 데이터베이스에 접근

   - find(), persist(), remove(), flush()

 

  • Persistence Context 영속성 컨텍스트

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

   

  •  Entity 엔티티

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

   - 클래스에 @Entity 어노테이션 붙임

 

 

 

 

 엔티티 생명주기

  • 비영속(new)

   - 엔티티 객체만 생성한 상태   

   - 영속성 컨텍스트에 저장되지 않은 상태  

  • 영속(managed)

   - 영속성 컨텍스트에 저장된 상태

   - DB에 바로 저장되지 않고 커밋 시점에 저장됨

  • 준영속 상태(detached)

   - 영속성 컨텍스트에 저장되었다가 분리된 상태

   - 식별자 값만 가지고 있고 영속성 컨텍스트의 기능을 쓸수 없음

  • 삭제상태(removed)

  

 

 

  • 엔티티 작동방식 예시
    Item item = new Item();		// 엔티티 생성. 영속성 컨텍스트와 관련없음
    item.setItemNm("테스트 상품");
    
    EntityManager em = entityManagerFactory.createEntityManager();
    // 엔티티 매니저 팩토리로부터 엔티티 매니저 생성
    
    EntityTransaction transaction = em.getTransaction();
    // 엔티티 매니저는 데이터 변경시 무결성을 위해 반드시 트랜잭션을 시작해야함
    // 여기서의 트랜잭션 =  DB의 트랜잭션
    transition.begin();
    
    em.persiste(item);			// 엔티티가 영속성 컨텍스트에 저장된 상태. 아직 insert 하기 전
    
    transition.commit();		// 트랜잭션을 DB에 반영. insert됨    							
                                
    // 엔티티 매니저와 매니저 팩토리의 자원반환    
    em.close();
    emf.close();

 

 

Persistence Context 영속성 컨텍스트

  • 영속성 컨텍스트란

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

   - 애플리케이션과 DB사이에서 객체를 보관하는 가상의 DB같은 역할

   - 엔티티를 식별자 값(@id)로 구분

   - 영속 상태는 식별자 값이 반드시 있어야하고 없을 경우 예외 발생

 

  • 장점

 - 1차 캐시 (Cache)

      · Map<KEY, VALUE> 저장

      · find() 메소드 호출시 영속성 컨텍스트 1 캐시 조회

      · 엔티티 존재시 해당값 반환, 없으면 데이터베이스에서 조회 1 캐시에 저장 반환 

 

   - 동일성(Identity) 보장

      · 하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회시 같은 엔티티 조회를 보장   

         (1 캐시에 저장된 엔티티를 조회하기 때문에 가능함)

 

   - 트랜잭션을 지원하는 쓰기 지연 (transactional write behind)

      · persist() 호출하면 1 캐시에 저장되는 것과 동시에 쓰기 지연 저장소에 SQL문이 저장됨

      · 저장된 SQL문은 트랜잭션을 커밋하는 시점에 저장된 SQL문을 flush되면서 DB 반영됨

      · 성능이 좋아짐

 

  - 변경감지 (Dirty Checking)

      · JPA 처음 불러온 엔티티의 스냅샷 값을 갖고 있음

      · 1 캐시에 저장된 엔티티와 스냅샷을 비교 변경내용이 있다면 쓰기 지연 SQL 저장소에 보관

      · 커밋 시점에 DB 변경내용을 자동으로 반영 (update문을 따로 부를 필요가 없음)