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();
}
}