JPA
1. JPA (Java Persistence API)
Java 객체와 관계형 DB 사이를 매핑하는 ORM 기술 표준
- 인터페이스 (=기술 표준) 이므로 실제 구현체는 Hibernate 등등
2. JPA 장점
- 특정 데이터베이스에 종속되지 않음
- 데이터베이스마다 쿼리문이 조금씩 다르기 때문에 데이터베이스 변경에 어려움이 많음, 하지만 JPA 는 추상화한 데이터 접근 계층을 제공하므로 설정 파일에 사용 데이터베이스만 지정하면 됨 - 객체 지향적 프로그래밍 및 생산성 향상
- 개발자가 직접 SQL을 작성하는 데이터베이스 설계 중심에서 Java 객체에 집중하도록 지원
- 테이블 컬럼 수정 시 매핑된 클래스만을 변경하면 적용됨
3. JPA 단점
- 복잡한 쿼리 처리 불가
- 자동으로 생성되는 쿼리로 인해서 개발자가 의도하지 않는 성능 저하
- 방대한 JPA 기술 학습에 필요한 시간과 노력
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
# new 키워드로 영속성 컨텍스트에 담을 상품 엔티티 생성 (아직 안에 담기지 않음)
Item item = new Item();
item.setItemNm("테스트 상품");
# 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성
EntityManager em = entityManagerFactory.createEntityManager();
# 데이터 변경 시 무결성을 위해 트랜잭션 시작
EntityTransaction transaction = em.getTransaction();
transaction.begin();
# 영속성 컨텍스트에 저장된 상태, 아직 DB에 INSERT SQL 보내기 전
em.persist(item);
# 트랜잭션을 DB에 반영, 이 때 실제로 INSERT SQL 수행
transaction.commit();
# 엔티티 매니저와 엔티티 매니저 팩토리 자원을 close() 호출로 반환
em.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 수행
'JAVA > SpringBoot Shoppingmall' 카테고리의 다른 글
[VSCODE] SpringBoot 쇼핑몰(MVN) @Query 어노테이션 (0) | 2022.06.22 |
---|---|
[VSCODE] SpringBoot 쇼핑몰(MVN) 쿼리 메서드 (Query Method) (0) | 2022.06.22 |
[VSCODE] SpringBoot 쇼핑몰(MVN) 상품 Repository 설계 (0) | 2022.06.22 |
[VSCODE] SpringBoot 쇼핑몰(MVN) 상품 Entity 설계 (0) | 2022.06.22 |
[VSCODE] SpringBoot 쇼핑몰(MVN) 개발 환경 설정 (0) | 2022.06.21 |