본문 바로가기
JPA Basic

JPA Basic - 1

by 완두완두콩 2021. 11. 16.

 

JPA Basic


이번 챕터에서는

Spring Framework와 떼어놓을 수 없는 JPA 에 대해서 공부해보도록 하겠다.

 

JPA 란 ? 


JPA 란 Java Persistence API 의 줄일맘로 , 자바 진영의 표준 *ORM 기술이다. Hibernate와 EclipesLink 등 여러 구현체를 상속받아 만든 인터페이스의 모음이다.

*ORM 이란 ? Object Relational Mapping 의 줄임말로 , 객체는 객체대로 설계하고 , 관계형 데이터베이스는 관계형 데이터베이스대로 설계하는 것을 뜻한다. 객체지향적인 설계를 하면 할수록 관계형 데이터베이스와 연동하면 join 이 복잡해지고 어려워지는 문제점을 가지고 있었는데 이를 해결해주는 것이 ORM 이다. 

객체와 관계형 데이터베이스를 지탱하는 다리라고 생각하면 된다.

 

동작방식


 

JPA 를 사용해야 하는 이유


1. SQL 중심적인 개발에서 객체 중심의 개발로 바뀐다 & 생산성 향상

CRUD 의 단순 반복적인 부분에서 벗어나 반복을 줄인다. 또한 간단한 Query 문의 작성이 가능하다.

생성 : em.persit(member);

조회 : em.find(memberId);

수정 : em.setName("helloJpa);

삭제 : em.remove(member);

 

2. 유지보수성을 높인다.

 

3. Object 와 RDB 간의 패러다임 불일치를 해결해 준다.

원래라면 'Album' 테이블에 값을 넣기 위해서는 Item 과 Album 각각의 테이블에 값을 넣어주는 쿼리문을 작성해야 하지만 , em.persist(album); 의 단순한 작성으로 JPA가 두 개의 INSERT 쿼리문을 작성해서 보내준다.

TEAM 테이블과 관계를 맺는 Member 테이블이 있다고 가정하는 경우 , 

member.setTeam(team);

em.persist(member); 과 같이 객체간의 참조를 통해 연관관계도 간편하게 작성이 가능하다.

 

4. 성능 최적화(지연로딩)

Lazy Loading 전략을 통해 , insert 문이 세번 반복된다면 해당 insert 문을 버퍼에 저장하듯 메모리에 저장해놨다가 한번에 실행하여 성능을 최적화한다.

 

 

CRUD


JPA 를 사용하기 위해서는 persistence.xml 에 설정 정보를 저장하고 이를 이용해서 JPA를 사용한다.

 

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Entity
public class Member {
 
    @Id
    private Long id;
    private String name;
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
cs

 

@Entitiy : @Entity 가 붙은 클래스는 JPA 가 관리하는 클래스로 인식한다. JPA 를 사용하기 위해서는 반드시 필요한 어노테이션이다. @Entity(name = "Member") 방식으로 이름을 지정해 줄 수도 있다. 디폴트값은 클래스명 이다.

@Id : Primary Key 값의 경우 , @Id 를 통해 기본키로 매핑해준다.

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package hellojpa;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.transaction.Transactional;
import java.util.List;
 
 
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 {
 
            // Create
            Member member = new Member();
            member.setId(1L);
            member.setName("helloJpa");
 
            em.persist(member);
 
            // Read
            List<Member> result = em.createQuery("select m from Member as m", Member.class)
                            .getResultList();
 
            // Update
            member.setName("HelloKong");
 
            // Delete
            em.remove(member);
 
            
            // Iter 를 이용한 출력.
            for (Member member : result) {
                System.out.println("member = " + member.getName());
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
 
        }
        emf.close();
    }
}
 
cs

- 간단해진 CRUD.

데이터베이스는 항상 Transaction 안에서 작동한다. 고로 Transaction 의 Commit 없이는 Read 를 제외한 쿼리문들은 동작하지 않는다.

 

 

* 해당 글은 'Infleran'의 김영한 강사님의 자료를 참조하였습니다.

'JPA Basic' 카테고리의 다른 글

JPA Basic - 6  (0) 2021.12.30
JPA Basic - 5  (0) 2021.12.29
JPA Basic - 4  (0) 2021.12.28
JPA Basic - 3  (0) 2021.11.18
JPA Basic - 2  (0) 2021.11.16

댓글