* 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 |
: 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 |