프로젝트 환경 및 라이브러리 세팅
- 자바 8 이상(권장)
- H2 데이터베이스
- Maven
- 하이버네이트 (JPA 구현체)
라이브러리 추가 - pom.xml
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.222</version>
</dependency>
</dependencies>
JPA 설정하기
resources 폴더 하위에
/META-INF/persistence.xml 생성
persistence.xml
<?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"> // 이부분은 나중에 EntityManageFactory 만들때 사용
<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.jdbc.batch_size" value="10"/> <!-- jdbc batch 사이즈 설정 -->
<property name="hibernate.hbm2ddl.auto" value="create" /> <!-- ddl option -->
</properties>
</persistence-unit>
</persistence>
데이터베이스 방언
JPA 는 특정 데이터베이스에 종속 되어 있지 않습니다.
따라서 각각의 데이터베이스가 제공하는 SQL 문법에 따라 SQL을 매핑합니다.
ex) 가변문자의 경우 MySQL 은 VARCHAR 를 사용하고 Oracle 의 경우 VARCHAR2 를 사용합니다.
이를 방언 설정을 통해 어떤 데이터베이스를 사용하고 있는지 알려주어야합니다.
하이버네이트는 40가지 이상의 데이터베이스 방언을 지원하기 떄문에 사용하시는 데이터베이스를 선택하시면 됩니다.
필수 속성에서 javax 와 hibernate 를 보실수 있는데,
먼저 저희가 사용하는 JPA의 구현체의 경우 hibernate 입니다.
따라서 javax 부분은 JPA의 다른 구현체를 사용할때 변경가능하지만
hibernate 부분은 hibernate 구현체를 사용하실때만 사용할 수 있습니다.
따라서 방언 설정은 hibernate의 기능중 하나입니다.
JPA 구동 방식
1. 설정 정보 조회 - persistence.xml
2. Persistence 로 부터 EntityManagerFactory 생성
3. EntityManagerFactory 로부터 EntityManager 생성
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// hello 설정파일 설정정보, Persistence.xml 에서 <persistence-unit name="hello"> 이부분
EntityManager em = emf.createEntityManager();
// db 작업은 EntityManager 로함
EntityTransaction tx = em.getTransaction();
// 모든 변경은 트랜잭션 안에서만 해야한다.
tx.begin();
try {
// 이부분 에서 JPA CRUD 작업
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close(); // EntityManager 닫기
}
emf.close(); // EntityManagerFactory 닫기
}
}
JPA 사용하기
객체와 테이블을 생성하고 매핑하기
@Entity // JPA 가 관리할 객체라는 것을 알림
public class Member {
@Id // 데이터베이스의 PK를 나타냄
@GeneratedValue // PK 생성 전략을 나타냄
private Long id;
private String name;
// setter, getter ...
}
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
Member 객체를 통해 아래와 같은 테이블을 생성 할 수 있습니다.
JPA 는 영속성 컨텍스트 라는 곳에 Entity를 등록하여 관리합니다.
이때 변화를 감지하여 등록, 수정, 삭제를 실행합니다.
등록 - 영속성 컨텍스트에 Entity를 추가하는 작업
public class Main {
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.setName("memberA");
em.persist(member); // 이부분에서 JPA 는 영속성 컨텍스트에 member 를 등록한다.
tx.commit(); // commit 이 실행되면 jpa는 쿼리를 실행한다.
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
수정 - 영속성 컨텍스트에 등록된 Entity 의 값을 변경하는 작업
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// hello 설정파일 설정정보
EntityManager em = emf.createEntityManager();
// db 작업은 EntityManager 로함
EntityTransaction tx = em.getTransaction();
// 모든 변경은 트랜잭션 안에서만 해야한다.
tx.begin();
try {
Member member = new Member();
member.setName("memberA");
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
findMember.setName("memberAA");
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
삭제 - 영속성 컨텍스트에서 삭제하는 작업
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// hello 설정파일 설정정보
EntityManager em = emf.createEntityManager();
// db 작업은 EntityManager 로함
EntityTransaction tx = em.getTransaction();
// 모든 변경은 트랜잭션 안에서만 해야한다.
tx.begin();
try {
Member member = new Member();
member.setName("memberA");
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
em.remove(findMember);
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
참조
자바 ORM 표준 JPA 프로그래밍 - 김영한
'Java' 카테고리의 다른 글
JPA 객체와 테이블 매핑 (0) | 2024.01.31 |
---|---|
JPA Unknown entity 해결방법 (0) | 2024.01.29 |
JPA 란? (1) | 2024.01.21 |
[Spring] variable not initialized in the default constructor 에러 (0) | 2024.01.11 |
[Java] Reactive Streams 란? (1) | 2024.01.10 |