JPA μμ
JPA(Java Persistnce API) λ μλ° μ§μμμ ORM(Object-Relational Mapping) κΈ°μ νμ€μΌλ‘ μ¬μ©λλ μΈν°νμ΄μ€μ λͺ¨μμ΄λ€. μλ° μ ν리μΌμ΄μ κ³Ό DB μ¬μ΄μμ λμνλ©°, SQLμ μμ‘΄μ μ΄μλ κΈ°μ‘΄ λ°©μμ λ¨μ μ 극볡νκΈ° μν΄ λ°μ΄ν°λ₯Ό κ°μ²΄ μ§ν₯ κ΄μ μΌλ‘ λ°λΌλ³΄κ³ λ€λ£° μ μκ² λ§λ€μ΄μ‘λ€.
𧩠ORM ?
κΈ°μ‘΄ λ°©μμΌλ‘ κ°μ²΄μ λ°μ΄ν°λ² μ΄μ€λ₯Ό κ΄λ¦¬ν λμ λ¬Έμ μ μ ν μ΄λΈμ λ§μΆ°μ κ°μ²΄λ₯Ό λ§λ€κ³ , λ°μ΄ν°λ₯Ό CRUDν λλ§λ€ μλ§μ 쿼리λ₯Ό μμ±ν΄μΌ νλ€λ 볡μ‘ν¨μ΄ μμλ€.
λ§μ½ μλ° μ»¬λ μ μ μ μ₯νλ―μ΄ CRUD μμ μ ν μ μλ€λ©΄ ν¨μ¬ κ°νΈν κ°λ°μ΄ κ°λ₯ν΄μ§ κ²μ΄λ€.
κ°μ²΄λ κ°μ²΄λλ‘ μ€κ³νκ³ , κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λλ‘ μ€κ³νκ³ , ORM νλ μμν¬λ μ€κ°μμ κ·Έ λμ 맀νν΄μ£Όλ μν μ νλ€.
JPA λ μλ° μ§μμμ ORM μν μ λ΄λΉνλ μΈν°νμ΄μ€μ΄λ©°, νμ΄λ²λ€μ΄νΈ(Hibernate)κ° κ΅¬ν체λ‘μ JPAμ νμ€ λͺ μΈλ₯Ό ꡬννκ³ μλ€.
𧩠JPAμ CRUD
- JPA λ μλ° μ»¬λ μ μ λ°μ΄ν°λ₯Ό μ μ₯νλ―μ΄ (λ§μΉ list.add() λ‘ μ μ₯νλ―μ΄) CRUD λ©μλλ₯Ό μ 곡νλ€.
CRUD | λ©μλ |
---|---|
C | jpa.persist(member) |
R | Member member = jpa.find(memberId) |
U | member.setName(βλ³κ²½ν μ΄λ¦β) |
D | jpa.remove(member) |
𧩠μ±λ₯ μ΅μ ν κΈ°λ₯
JPA λ κ°μ νΈλμμ μμμ κ°μ μν°ν°λ₯Ό λ°ννλ€. (μμμ± μ»¨ν μ€νΈμμ 1μ°¨ μΊμλ‘ κ΄λ¦¬νλ©°, λμΌμ±μ 보μ₯νλ€)
μ°κΈ° μ§μ° : νΈλμμ μ 컀λ°ν λ κΉμ§ SQL 쿼리문μ λͺ¨μλλ€κ° 컀λ°νλ μκ° νλ²μ μ μ‘νλ€.
μ§μ° λ‘λ©κ³Ό μ¦μ λ‘λ© : μ§μ° λ‘λ©μ΄λ κ°μ²΄κ° μ€μ μ¬μ©λ λ 쿼리문μ μ€ννμ¬ λ‘λ©νλ κ²μ λ§νλ©°, μ¦μ λ‘λ©μ Join SQLλ‘ νλ²μ μ°κ΄λ κ°μ²΄κΉμ§ 미리 μ‘°νν΄λλ κ²μ λ§νλ€.
π₯ μ½λλ‘ μ΄ν΄ν΄λ³΄μ
package org.example;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
// EntityManagerFactory : μ ν리μΌμ΄μ
λ‘λ© μμ μ λ± νλ² μμ±.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// EntityManager : νΈλμμ
μ νλ μ€νν λ λ§λ€ μμ±ν΄μ μ¬μ©νκ³ λ²λ¦°λ€. μ°λ λκ°μ 곡μ νλ©΄ μ λ¨.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
/**
* JPAμ λͺ¨λ λ°μ΄ν° λ³κ²½μ νΈλμμ
μμμ μ€νν΄μΌ νλ€. λ³κ²½μ΄ λλλ©΄ λ°λμ em.close() λ‘ μ’
λ£ν΄μΌ νλ€.
*/
try {
/**
* (C)
* λΉμμ μν.
*/
Member member = new Member();
member.setId(1L);
member.setName("Hello JPA");
/**
* μμ μν.
* persist ν΄μΌ JPA μμμ± μ»¨ν
μ€νΈ μμ member κ°μ²΄κ° λ€μ΄κ°.
* 컨ν
μ€νΈ μμμ 1μ°¨ μΊμλ‘ μ μ₯λ¨. (ν€ : db pk , κ° : entity κ°μ²΄)
*/
em.persist(member);
/**
* (R)
* find νλ©΄ JPAλ λλΉλ₯Ό μ‘°ννλκ² μλ 컨ν
μ€νΈμ 1μ°¨ μΊμλ₯Ό λ¨Όμ μ‘°νν¨.
* λ§μ½ 1μ°¨ μΊμμ μλ€λ©΄ κ·Έμ μΌ λλΉλ₯Ό μ‘°ννκ³ , μ‘°νν κ°μ 1μ°¨ μΊμμ μ μ₯ ν κ·Έ κ°μ λ°ννλ€.
*/
Member findMember = em.find(Member.class, 2L);
/**
* JPQL : 쿼리λ₯Ό μ§μ μμ±ν μλ μλ€.
* μ€μν μ μ λλΉ ν
μ΄λΈμ΄ μλ μν°ν° κ°μ²΄λ₯Ό λμμΌλ‘ 쿼리λ₯Ό μ§ λ€λ μ μ΄λ€.
* μλ μ½λμμ Member λ ν
μ΄λΈμ΄ μλ μλ° ν΄λμ€μ΄λ€. (νλΌλ―Έν°λ‘ Member.class λ₯Ό λͺ
μν¨)
*/
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
for (Member member : result) {
System.out.println("member : " + member.getName());
}
/**
* (U)
* JPAμ μμμ± μ»¨ν
μ€νΈ μμ μλ κ°μ²΄λ JPAκ° ν΄λΉ μν°ν°λ₯Ό κ΄λ¦¬νκ³ μλ€κ³ μκ°νλ©΄ λλ€.
* λλ¬Έμ λ³κ²½μ΄ λ°μνλ©΄ λ°λ‘(μλμΌλ‘) DBμ λ°μνλ€.
*/
findMember.setName("Bye JPA");
/**
* (D)
*/
em.remove(findMember);
/**
* 컀λ°ν΄μΌ μΏΌλ¦¬λ¬Έμ΄ μ€νλλ©°,
* νλμ νΈλμμ
μ΄ μ’
λ£λλ©΄ λ°λμ em(entity manager)λ₯Ό λ«μμΌ νλ€.
*/
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}