
자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션2 JPA 시작하기
🔲 Hello JPA - 프로젝트 생성
◻ JPA 설정 - persistence.xml
• JPA 실행을 위한 기본 설정 파일
• /META-INF/persistence.xml 위치
• persistence-unit name으로 이름 지정
• javax.persistence로 시작: JPA 표준 속성
• hibernate로 시작: 하이버네이트 전용 속성
◻ 데이터베이스 방언
- JPA는 특정 데이터베이스에 종속 X
- 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다.
- 가변 문자: MySQL은 VARCHAR, Oracle은 VARCHAR2
- 문자열을 자르는 함수: SQL 표준은 SUBSTRING(), Oracle은SUBSTR()
- 페이징: MySQL은 LIMIT , Oracle은 ROWNUM
- 방언: SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능

<?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">
<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.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
◻ JPA 구현체로하이버네이트를 사용하기 위한 핵심 라이브러리
- hibernate-core: 하이버네이트 라이브러리
- hibernate-entitiymanager: 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리
- hibernate-jpa-2.1-api: JPA 2.1 표준 API를 모아둔 라이브러리
⬛ Hello JPA - 애플리케이션 개발

🟢 엔티티 매니저 생성 과정
1. 엔티티 매니저 팩토리 생성
- persistence 클래스가 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비한다.
- 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.
2. 엔티티 매니저 생성
- 엔티티 매니저를 사용해서 엔티티를 데이터 베이스에 CRUD 할 수 있다.
- 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용하면 안된다.
3. 종료
사용이 끝난 엔티티 매니저, 매니저 팩토리는 반드시 종료해야 한다.
🟢 트랜잭션
- JPA를 사용할땐 트랜잭션 안에서 데이터를 변경해야 한다.
- 트랜잭션을 시작하려면 엔티티 매니저에서 트랜잭션 API를 받아와야 한다.
- 트랜잭션 API에서 비즈니스 로직이 정상 작동하면 트랜잭션을 커밋(commit)하고 예외가 발생하면 롤백(rollback)한다.
🟢 객체 매핑 시작
1. 테이블 생성
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
2. 회원 클래스 생성
package hellojpa;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String name;
//Getter, Setter …
}
- @Entity 클래스를 테이블과 매핑한다고 JPA에 알려준다.
- @Table 엔티티 클래스에 매핑할 테이블 정보를 알려준다. 클래스 이름을 테이블 이름으로 매핑한다.
- @Column 필드를 컬럼에 매핑한다.
- 매핑 정보가 없는 필드 필드명을 사용해서 컬럼명으로 매핑한다.
🟢 실습 - 회원 CRUD
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에 서 공유
- 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager(); // java collection처럼 다룬다.
EntityTransaction tx = em.getTransaction();
tx.begin();
//code
try{
// 멤버 생성
Member member = new Member();
member.setId(2L);
member.setName("영한");
em.persist(member);
tx.commit();
// 멤버 조회
Member findMember = em.find(Member.class,1L);
System.out.println("findMember.id = " + findMember.getId());
System.out.println("findMember.name = " + findMember.getName());
// 멤버 수정
findMember.setName("쩡이");
tx.commit(); // 커밋 시점에 가져온데이터 변경되었는지 자동 체크.
// 멤버 삭제
em.remove(findMember);
tx.commit();
// ** JPQL (대상이 멤버 객체)
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.getResultList();
// pagination
List<Member> result2 = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(5) // 5번부터
.setMaxResults(8) // 8개 가져오기
.getResultList();
for (Member mem : result){
System.out.println("member.name = " + mem.getName());
}
}catch (Exception e){
tx.rollback();
} finally {
em.close();
emf.close();
}
em.close();
emf.close();
}
}
🟢 JPQL
- JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 (JPQL을 한마디로 정의하면 객체 지향 SQL)
- SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
- JPQL은 엔티티 객체를 대상으로 쿼리 (쉽게 말해 클래스, 필드 대상)
- SQL은 데이터베이스 테이블을 대상으로 쿼리
- SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
- JPQL은 데이터베이스 테이블을 전혀 알지 못한다.
참고) JPQL은 데소문자를 명확히 구분하지만 SQL은 관례상 대소문자를 구분하지 않고 사용하는 경우가 많다. 책에서는 JPQL,SQL 구분을 위해 SQL은 될 수 있으면 대문자로 표현한다.
'JPA' 카테고리의 다른 글
| 자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션4 영속성 관리 - 내부 동작 방식 (0) | 2025.01.17 |
|---|---|
| 자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션1 JPA 소개 (0) | 2024.03.28 |