부트캠프

Spring MVC - JPA 기반 데이터 액세스 계층 part 1

hunm719 2023. 2. 23. 20:21
1.JPA(Java/Jakarta Persistence API)

 -Java진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(Specification)
 -JPA 표준 사양을 구현한 구현체로는 Hibernate ORM, EclipseLink, DataNucleus 등이 있음


1-1.데이터 액세스 계층에서의 JPA 위치

데이터 액세스 계층에서의 JPA 위치

 -데이터 액세스 계층에서 JPA는 위의 그림과 같이 데이터 액세스 계층의 상단에 위치함
 -데이터 저장, 조회 등의 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해서 이루어짐
 -Hibernate ORM은 내부적으로 JDBC API를 이용해서 데이터베이스에 접근하게 됨


1-2.JPA에서 Persistence의 의미
 -Persistence : 영속성, 지속성, 무언가를 금방 사라지지 않고 오래 지속되게 함

 -영속성 컨텍스트(Persistence Context)
  ● JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)라는 곳에 보관해서 애플리케이션 내에서 오래 지속 되도록 함

그림으로 표현한 영속성 컨텍스트(Persistence Context)

   위의 그림과 같이 영속성 컨텍스트에는 '1차 캐시' 영역과 '쓰기 지연 SQL 저장소' 영역이 있음

 -영속성 컨텍스트 관련 JPA API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Configuration
public class JpaBasicConfig {
    private EntityManager em;
    private EntityTransaction tx;
 
 
    @Bean
    public CommandLineRunner testJpaBasicRunner(EntityManagerFactory emFactory) {
        this.em = emFactory.createEntityManager();
        this.tx = em.getTransaction();
 
        return args -> {
            example01();
        };
    }
    
    private void example01() {
 
        tx.begin();
 
        em.persist(new Member("hgd1@gmail.com"));
 
        member1.setEmail("hgd1@yahoo.co.kr");
 
        em.remove(member);
 
        tx.commit();
 
        Member resultMember1 = em.find(Member.class, 1L);
    }
}
cs

   tx.begin() : Transaction을 시작함

   em.persist() : 엔티티 클래스의 객체가 영속성 컨텍스트의 1차 캐시에 저장되고, 쓰기 지연 SQL 저장소에 INSERT 쿼리가 등록됨
   엔티티 객체의 setter 메서드(예시 : member.setEmail()) : setter 메서드로 값을 변경하면 update로직이 실행됨
    *(1)영속성 컨텍스트에 엔티티가 저장될 경우에는 저장되는 시점의 상태를 그대로 가지고 있는 스냅샷을 생성함
    *(2)해당 엔티티의 값을 setter 메서드로 변경한 후, tx.commit()을 하면 변경된 엔티티와 이 전에 이미 떠 놓은 스냅샷을 비교함
    *(3)비교 후, 변경된 값이 있으면 쓰기 지연 SQL 저장소에 UPDATE 쿼리를 등록하고 UPDATE 쿼리를 실행함
   em.remove() : 영속성 컨텍스트의 1차 캐시에 있는 엔티티의 제거를 요청함
   em.flush() : 영속성 컨텍스트의 변경 사항을 테이블에 반영함
  tx.commit : 쓰기 지연 SQL 저장소에 등록된 쿼리가 실행되고, 해당 쿼리는 쓰기 지연 SQL 저장소에서 사라짐
  em.find() : 테이블에 저장된 entity 객체를 먼저 1차 캐시에서 조회하고, 1차 캐시에 없는 경우에 테이블에 SELECT 쿼리를 전송해서 조회함

 

https://github.com/hunm719/be-template-jpa

 

 

 

-이미지 및 내용 출처 : code states