JPA 시작

* pom.xml 설정 
- hibernate-core : 하이버네이트 라이브러리
- hibernate-entitymanager : 하이버네이트가 JPA구현체로 동작하도록 JPA 표준을 구현한 라이브러리
- hibernate-jpa-2.1-api : JPA2.1 표준 API를 모아둔 라이브러리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
..
<properties>
  <hibernate.version>버전</hibernate.version>
</properties>
 
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>${hibernate.version}</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>${hibernate.version}</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-collections</artifactId>
      <groupId>commons-collections</groupId>
    </exclusion>
  </exclusions>
</dependency>
..
cs

* 객체 매핑
1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
@Table(name="MEMBER")
public class Member {
 
    @Id
    @Column(name = "ID")
    private String id;
 
    @Column(name = "NAME")
    private String username;
 
    private Integer age;
}
cs
- @Entity : 클래스를 테이블과 매핑한다고 JPA 에게 알림. 엔티티 클래스라고함.
- @Table : 엔티티 클래스에 매핑할 테이블 정보를 알림. 생략시 클래스이름을 테이블 이름으로 매핑함.
- @Id : 엔티티 클래스의 필드를 테이블의 기본 키에 매핑함.
- @Column : 필드를 컬럼에 매핑함. 생략시 필드명으로 컬럼명에 매핑함. 대소문자를 구분하는 데이터베이스 사용시 명시적으로 매핑해야함.


* persistence.xml 설정 
: JPA를 실행하기 위한 기본 설정파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
  <persistence-unit name="jpabook">
    <properties>
      <!-- 필수 속성 -->
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> // JDBC 드라이버
      <property name="javax.persistence.jdbc.user" value="root" /> // DB 접속 아이디
      <property name="javax.persistence.jdbc.password" value="" /> // DB 접속 비밀번호
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/test" /> // DB  접속 URL
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> // DB 방언
 
      <!-- 옵션 -->
      <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="validate" /> // 스키마 자동 생성
    </properties>
  </persistence-unit>
</persistence>
cs

- META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식함.
- JPA 설정은 영속성 유닛으로부터 시작하는데 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛을 등록함. 고유한 이름을 사용해야함.
- javax.persistence로 시작하는 속성은 JPA 표준 속성으로 특정 구현체에 종속되지 않음. 
  반면에 hibernate로 시작하는 속성은 하이버네이트 전용 속성이므로 하이버네이트에서만 사용 가능함.
hibernate.hbm2ddl.auto : 데이터베이스 스키마 자동 생성 설정
> create : 기존 테이블 삭제 후 재생성. 초기 개발시 사용.
> create-drop : create와 동일하나 종료시 테이블 삭제. 초기 개발시 사용.
> update : 스키마 변경 내역 반영. 초기 개발시 사용 .운영 DB에 사용해서는 안됨.
> validate : 엔티티와 테이블의 매핑 정상 여부 체크. 비정상시 예외 발생. 운영 DB에 사용.

* 데이터베이스 방언
- JPA는 애플리케이션에 특정 DB에 종속되지 않게 하는 벤더독립성을 가짐.
  하지만 각 데이터베이스마다 데이터 타입, 함수명, 페이징처리 등이 다르기 때문에
  SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언(Dialect)라고함.

- 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요없이 데이터베이스 방언만 교체하면됨.

- 대표적인 방언
  Mysql : org.hibernate.dialect.MySQLDialect
  Oracle : org.hibernate.dialect.OracleDialect
  H2 : org.hibernate.dialect.H2Dialect

* 애플리케이션 개발

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class JpaMain {
 
  public static void main(String[] args) {
 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); //엔티티 매니저 팩토리 생성
    EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
    EntityTransaction tx = em.getTransaction();   //트랜잭션 기능 획득
    
    try {
      tx.begin();    //트랜잭션 시작
      logic(em);     //비즈니스 로직
      tx.commit();   //트랜잭션 커밋
    } catch (Exception e) {
      e.printStackTrace();
      tx.rollback(); //트랜잭션 롤백
    } finally {
      em.close();    //엔티티 매니저 종료
    }
      emf.close();   //엔티티 매니저 팩토리 종료
    }
 
  }
 
}
cs

- 엔티티 매니저 팩토리 생성
persistence.xml 의 설정 정보를 조회해 이름이 jpabook인 영속성 유닛 persistence-unit을 찾아서 엔티티 매니저 팩토리를 생성.
설정 정보를 읽어서 JPA를 동작 시키기 위한 기반 객체를 만들고 JPA 구현체에 따라 데이터베이스 커넥션 풀도 생성.
엔티티 매니저 팩토리를 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야함.

- 엔티티 매니저 생성
엔티티 매니저 팩토리에서 엔티티 매니저 생성.
JPA 기능 대부분은 엔티티 매니저가 제공함.
엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회 할 수 있음.
엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용해서는 안됨.

- 트랜잭션 관리
엔티티 매니저에서 트랜잭션 API를 받아서 사용함.
비즈니스 로직이 정상 동작하면 트랜잭션을 커밋하고, 예외가 발생하면 트랜잭션을 롤백함.

- 비즈니스 로직
  저장 : em.persist(Object);
  조회 : em.find(Object, PK);
  삭제 : em.remove(Object);
  수정 : 엔티티 매니저를 통해 객체를 조회하여 Setter 메소드를 통해 값 변경. JPA의 변경감지 기능을 통해 수정.

- 엔티티 매니저 팩토리 & 엔티티 매니저 종료
사용이 끝난 엔티티 매니저는 반드시 종료해야함.
애플리케이션을 종료할 때는 엔티티 매니저 팩토리도 종료해야함.


참고서적 - 자바 ORM 표준 JPA 프로그래밍(김영한)

'Development > JPA' 카테고리의 다른 글

엔티티 매핑  (0) 2017.11.12
영속성 관리  (0) 2017.01.21
JPA 소개  (0) 2016.05.04

+ Recent posts