교재: 자바 ORM 표준 JPA 프로그래밍
깃허브: https://github.com/holyeye/jpabook
2026년 3월 기준으로 책 내용을 변경해서 실습을 진행했다: (1) 이클립스 → 인텔리제이 (2) Maven → Gradle
폴더 구조는 다음과 같다:

plugins {
id 'java'
}
group = 'hellojpa'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.hibernate:hibernate-core:5.6.15.Final'
implementation 'javax.persistence:javax.persistence-api:2.2'
runtimeOnly 'com.h2database:h2:2.2.224'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
persistence.xml은 JPA 설정 파일이다. 사용할 데이터베이스, 사용할 JPA 구현체, 엔티티 클래스, JPA 동작 옵션 등은 여기에서 설정한다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
version="2.2">
// persistence-unit은 JPA 설정 단위이다
<persistence-unit name="jpabook">
// JPA가 관리할 엔티티 클래스를 등록한다
<class>hellojpa.Member</class>
<properties>
<!-- database connection -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:~/test"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<!-- Hibernate -->
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!-- console SQL -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<!-- auto create table -->
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
</persistence>
이번 실습에서 Member 클래스는 JPA 엔티티 클래스이다. 데이터베이스 테이블과 매핑된다.
package hellojpa;
import javax.persistence.*;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "MEMBER")
@Getter
@Setter
public class Member {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String username;
// 매핑 정보가 없는 필드
private Integer age;
}
참고: JPA 어노테이션의 패키지는 javax.persistence이다.
package hellojpa;
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();
}
// 비지니스 로직
private static void logic(EntityManager em) {
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("유정");
member.setAge(2);
// 등록
em.persist(member);
// 수정
member.setAge(20);
// 한 건 조회
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
// 목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
// 삭제
em.remove(member);
}
}