1. JPA (Java Persistence API)
Java 객체와 관계형 DB 사이를 매핑하는 ORM 기술 표준
2. JPA 장점
특정 데이터베이스에 종속되지 않음
- 데이터베이스마다 쿼리문이 조금씩 다르기 때문에 데이터베이스 변경에 어려움이 많음, 하지만 JPA 는 추상화한 데이터 접근 계층을 제공하므로 설정 파일에 사용 데이터베이스만 지정하면 됨
객체 지향적 프로그래밍 및 생산성 향상
- 개발자가 직접 SQL을 작성하는 데이터베이스 설계 중심에서 Java 객체에 집중하도록 지원
- 테이블 컬럼 수정 시 매핑된 클래스만을 변경하면 적용됨
3. JPA 단점
1. JPA 동작 원리
2. Entity
데이터베이스의 테이블에 대응하는 클래스
3. Entity Manager Factory
엔티티 매니저 인스턴스를 관리하는 주체
4. Entity Manager
Persistence Context 에 접근하여 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 에 반영
- 한 번에 처리하기 때문에 성능 이점