프로그래밍 언어/Spring

<JPA> JPA 1. 내부 동작 방식 영속성

창조적생각 2021. 11. 18. 11:00

본 포스팅은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편를 듣고 배운 것을 정리하는 글입니다.

정확하게 JPA에 대해서 배우고 싶으시다면 

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com

위의 강의를 보시는 것을 추천드립니다.

 

1. 프로젝트 구성

pom.xml

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
32
33
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>JPA_Basic</groupId>
    <artifactId>JPA_Basic</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.10.Final</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
        </dependency>
    </dependencies>
 
</project>
cs

resources.META-INF.persistence.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
 
            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>
cs

 

 

1.JPA

1)Java Persistance API

ORM 기술 표준

ORM -> Object-Relational Mapping

객체지향의 패러다임을 가지는 스프링에서 객체는 객체대로 설계하고 관계형 데이터베이스에 설계대로 매핑하기 위해 존재하는 중간 프레임워크

 

2)JPA를 사용하는 이유

-SQL 중심적인 개발에서 객체 중심으로 개발

-생산성 향상, 유지보수 용이 성능향상

-데이터 접근 추상화와 벤더 독립성 등

 

3) JPA 구동 방식

 

영속성(Persistence) 컨텍스트

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

EntityManager.perisst(entity)

-> 엔티티 매니저를 통해서 영속성 컨텍스트에 접근

 

엔티티의 생명주기

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
32
33
34
35
36
37
38
package hellojpa;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
 
public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
 
        EntityManager em = emf.createEntityManager();
 
        EntityTransaction tx = em.getTransaction();
 
        tx.begin();
 
        try{
           
            Member member = new Member();
            member.setId("1L")
            member.setUserName("memberA");
            
            em.persist(member);
 
            Member findMember = em.find(Member.class,"1L");
 
          
 
            tx.commit();
        }catch(Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}
cs

1. EntityManagerFactory을 emf로 객체생성

2. emf 안에 EntityManager을 em으로 객체 생성 

3.  em 안에 Transaction을 tx로 객체 생성

4. 영속성 등록은 트랜잭션 단위로 등록 되므로 트랜잭션 시작 -> tx.begin()

5. Member 클래스에 id와 username을 setter메소드로 지정(1L, "memberA")

6. 엔티티매니저 안의 영속성에 member 객체를 등록

7. 아직 데이터베이스에 저장하기 전의 캐쉬 내에서 member 객체 조회 가능(em.find)

8. tx.commit()으로 데이터베이스에 저장

 

**flush() -> 영속성 내에 있는 캐쉬값을 데이터베이스에 즉시 반영

 

728x90