이 책은 hibernate
로 JPA를 구현했다. 나는 properties 파일 기준으로 spring.jpa.hibernate.ddl-auto 옵션을 사용해 애플리케이션 구동 시 JPA의 데이터베이스 초기화 전략을 설정함으로써 hibernate를 사용한 경험이 있다.
참고로 구현체는 인터페이스인 JPA를 직접 구현한 라이브러리이다. JPA와 Hibernate는 마치 자바의 interface와 이를 구현한 class와 같은 관계라는 글의 도움받았다.
import javax.persistence.*;
@Entity
@Table(name = "MEMBER")
public class Member {
@Id
@Column(name="ID")
private String id;
@Column(name = "NAME")
private String name;
// 매핑 정보가 없는 필드
private Integer age;
}
각각의 매핑 어노테이션을 살펴보면
import javax.persistence.*;
import java.util.List;
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) {
tx.rollback(); // 트랜젝션 - 롤백
}
finally {
em.close(); // 엔티티 매니저 - 종료
}
emf.close(); // 엔티티 매니저 팩토리 - 종료
애플리케이션 개발 시작 코드는 크게 세 가지로 나뉜다.
엔티티 매니저의 생성 과정을 분석해보자
JPA를 시작하려면 우선 persistence.xml이나 build.gradle의 설정 정보를 사용해 엔티티 매니저 팩토리를 생성해야 하는데, 이때 엔티티 매니저 팩토리를 생성해 JPA를 사용케 하는 Persistence 클래스를 사용한다.
이러면 META-INF/persistence.xml에서 설정한 이름의 영속성 유닛을 찾아 팩토리를 생성한다.
이 비용은 매우 크기 때문에, 팩토리는 애플리케이션 전체에서 한번만 생성하고 공유해 사용하자.
이 엔티티 매니저로 CRUD가 가능하다.
엔티티 매니저는 내부에 DB 소스를 유지하며 통신한다.
이렇듯 DB 커넥션과 밀접한 관계가 있으므로 스레드 간 공유하거나 재사용해선 안된다.
jdbc처럼 close 메소드를 사용해서 끄면 된다.
예외 발생 시 롤백한다.
C: persist 메소드 인자에 엔티티를 넘겨준다.
R : 한 건을 조회할 땐 find 메소드를 사용한다.
U : 단순히 엔티티 내 수정하고픈 멤버만 set으로 변경하면 된다.
D : remove 메소드 사용한다.
하나 이상의 엔티티 값을 조회할 때 사용된다.
JPQL은 SQL과 비슷하지만
김영한, 『자바 ORM 표준 JPA 프로그래밍』 에이콘(2015)