순수 JPA로 한 번 애플리케이션 개발을 해보자
엔티티 매니저 팩토리 생성
- JPA를 시작하려면 우선persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성 → Persistence 클래스를 사용하는데 이 클래스는 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비
- persistence.xml의 설정 정보를 읽어서 JPA를 동작시키기 위한 기반 객체를 만들고 JPA 구현체에 따라서는 DB 커넥션 풀도 생성함 → 엔티티 매니저 팩토리를 생성하는 비용 아주 큼
- 그래서 이건 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용
엔티티 매니저 생성
- 엔티티 매니저 팩토리에서 엔티티 매니저를 생성
- JPA의 기능 대부분이 이 엔티티 매니저가 제공 → 대표적으로 이걸 사용해서 DB CRUD 가능
- 이건 내부에 데이터소스(DB 커넥션)를 유지하면서 DB와 통신
- 이건 DB 커넥션과 밀접환 관계가 있어서 스레드 간에 공유하거나 재사용 안 됨
종료
- 엔티티 매니저 및 엔티티 매니저 팩토리를 끝날 때 다 종료해야함
트랜잭션 관리
- JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야함 → 안 그러면 예외 발생
코드
package org.example;
import jakarta.persistence.*;
import java.util.List;
public class App
{
public static void main( String[] args )
{
//엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pure-jpa");
//엔티티 매니저 - 생성
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(20);
//등록
em.persist(member);
//수정
member.setAge(22);
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);
}
}
결과
findMember : 재윤, age =22
members.size=1
코드 - 등록
- 엔티티를 저장하려면 엔티티 매니저의 persist() 메소드에 저장할 엔티티를 넘겨줌
- JPA는 회원 엔티티의 매핑 정보(어노테이션)을 분석해서 SQL을 만들어 DB에 전달
em.persist(member);
JPQL
TypedQuery<Member> query = em.createQuery("select m from Member m" , Member.class);
List<Member> members = query.getResultList();
- JPA를 사용하면 애플리케이션 개발자는 → 엔티티 객체를 중심으로 개발하고 DB에 대한 처리는 JPA에게 맡겨야함.
- 위 코드에서 CR(한 건 조회)UD에서 SQL을 전혀 사용하지 않았지만 문제는 검색 쿼리
JPA → 엔티티 객체를 중심으로 개발하므로 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야함. 하지만 테이블이 아닌 엔티티 객체를 대상으로 검색하려면 DB의 모든 데이터를 애플리케이션으로 불러와서 엔티티 객체로 변경한 다음 검색해야하는데 불가능함…
필요한 데이터만 DB에서 불러오려면 검색 조건이 포함된 SQL을 사용해야함
JPA는 JPQL(Java Persistence Query Language)이라는 쿼리 언어로 이 문제 해결
- JPQL → 엔티티 객체를 대상으로 쿼리 == 클래스와 필드 대상으로 쿼리, DB 테이블을 전혀 알지 못함
- SQL → DB 테이블을 대상으로 쿼리
실행했을 때
- JPQL의 em.createQuery을 사용해서 → 쿼리 객체 생성 → 객체의 getResutList 메소드 호출
- JPA는 JPQL을 분석해서 적절한 SQL을 만들어서 DB에 Data를 조회
전체 코드
https://github.com/whitecy01/codyssey/tree/main/springAndJPA/pureJPA/pureJPA
codyssey/springAndJPA/pureJPA/pureJPA at main · whitecy01/codyssey
나만의 백엔드 세계를 탐험하는 여정 기초부터 실전까지 한 걸음씩 쌓아가는 개발자의 기록. Contribute to whitecy01/codyssey development by creating an account on GitHub.
github.com
'개발 지식 > Spring boot' 카테고리의 다른 글
| [Spring boot] JPA - 기본 키 매핑 전략 (0) | 2026.01.30 |
|---|---|
| [Spring boot] JPA - 영속성 컨텍스트(엔티티 매니저 팩토리와 엔티티 매니저, 커넥션풀, 영속성 컨텍스트, 준영속) (0) | 2026.01.30 |
| [Spring boot] JPA - 순수 JPA 프로젝트 설정(import 문제, 라이브러리 정리) (0) | 2026.01.30 |
| [Spring boot] JPA - Spring data JPA가 아닌 순수 JPA (0) | 2026.01.30 |
| [Spring boot] Maven VS Gradle (0) | 2026.01.22 |
