Spring MVC - JPA 기반 데이터 액세스 계층 part 1
1.JPA(Java/Jakarta Persistence API) |
-Java진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(Specification)
-JPA 표준 사양을 구현한 구현체로는 Hibernate ORM, EclipseLink, DataNucleus 등이 있음
1-1.데이터 액세스 계층에서의 JPA 위치
-데이터 액세스 계층에서 JPA는 위의 그림과 같이 데이터 액세스 계층의 상단에 위치함
-데이터 저장, 조회 등의 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해서 이루어짐
-Hibernate ORM은 내부적으로 JDBC API를 이용해서 데이터베이스에 접근하게 됨
1-2.JPA에서 Persistence의 의미
-Persistence : 영속성, 지속성, 무언가를 금방 사라지지 않고 오래 지속되게 함
-영속성 컨텍스트(Persistence Context)
● JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(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