ํฐ์คํ ๋ฆฌ ๋ทฐ
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 2 (JPA ์์ํ๊ธฐ)
chaewonni 2024. 4. 19. 15:53๐กJPA ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
๐ป JPA ๊ตฌ๋ ๋ฐฉ์
package hellojpa;
import jakarta.persistence.*;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
//์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์์ฑ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//์ํฐํฐ ๋งค๋์ ์์ฑ
EntityManager em = emf.createEntityManager();
//ํธ๋์ญ์
EntityTransaction tx = em.getTransaction();
tx.begin(); //ํธ๋์ญ์
์์
try{
//๋น์ฆ๋์ค ๋ก์ง
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
//ํธ๋์ญ์
์ปค๋ฐ
tx.commit();
} catch (Exception e) {
//ํธ๋์ญ์
๋กค๋ฐฑ
tx.rollback();
} finally {
//์ํฐํฐ ๋งค๋์ ์ข
๋ฃ
em.close();
}
//์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์ข
๋ฃ
emf.close();
}
}
์ฝ๋๋ฅผ ๋ณด๋ฉด EntityManagerFactory(์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ), EntityManager(์ํฐํฐ ๋งค๋์ ), Transaction(ํธ๋์ญ์ )์ด ๋ณด์ผ ๊ฒ์ด๋ค. ๋ ์์ธํ ์์๋ณด์.
๋จผ์ JPA์ ๊ตฌ๋๋ฐฉ์์ ์์ ๊ฐ๋ค.
- ์ค์ ์ ๋ณด ์กฐํ (Configuration Load):
- JPA๋ ์์๋ ๋ persistence.xml์ด๋ผ๋ XML ํ์ผ์ ์ฐธ์กฐํ๋ค. ์ด ํ์ผ์ META-INF ๋๋ ํ ๋ฆฌ์ ์์นํ๋ฉฐ, JPA๊ฐ ๋์ํ๋ ๋ฐ ํ์ํ ์ฌ๋ฌ ์ค์ ์ ํฌํจํ๋ค. ์ด ์ค์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด, ์ํฐํฐ ๋งค๋์ ์ค์ , ํธ๋์ญ์ ํ์ ๋ฑ์ด ํฌํจ๋ ์ ์๋ค.
<?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="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="jakarta.persistence.jdbc.user" value="sa"/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="jakarta.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>
2. EntityManagerFactory ์์ฑ (Bootstrap):
- ์ค์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก JPA๋ EntityManagerFactory๋ฅผ ์์ฑํ๋ค. Persistence ํด๋์ค๋ ์ด ๊ณผ์ ์์ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๋จ ํ๋์ EntityManagerFactory ์ธ์คํด์ค๋ง ์กด์ฌํ๋ฉด ์ถฉ๋ถํ๋ค. EntityManagerFactory๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฐ์ฒด์ด๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ฌ์ฌ์ฉ๋๋ค.
3. EntityManager ์์ฑ (Run-time):
- EntityManagerFactory๋ฅผ ํตํด ์์ฒญํ ๋๋ง๋ค EntityManager ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. EntityManager๋ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , CRUD ์์ ์ ์ํ API๋ฅผ ์ ๊ณตํ๋ค.
- ๊ฐ EntityManager ์ธ์คํด์ค๋ ํ๋์ ์์ ๋จ์(๋ณดํต ํ๋์ ํธ๋์ญ์ )์ ๋ํด ์์ฑ๋๋ฉฐ, ์์ ์ด ๋๋ ํ์๋ ์ข ๋ฃ๋๋ค. ๊ฐ๊ฐ์ EntityManager๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๊ณผ ์บ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ๋น ํ๋์ฉ ์ฌ์ฉ๋๊ณ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๋๋ ํ์๋ ํ๊ธฐ๋๋ค.
์ฃผ์
- EntityManagerFactory(์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ)๋ ํ๋๋ง ์์ฑํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ํ๋ค.
- EntityManager(์ํฐํฐ ๋งค๋์ )๋ ์ฐ๋ ๋ ๊ฐ์ ๊ณต์ ํ์ง ์๋๋ค. (์ฌ์ฉํ๊ณ ๋ฒ๋ ค์ผ ํ๋ค.)
- JPA์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ์์์ ์คํํด์ผ ํ๋ค.
EntityTransaction tx = em.getTransaction();
tx.begin(); //ํธ๋์ญ์
์์
try{
//๋น์ฆ๋์ค ๋ก์ง
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
//ํธ๋์ญ์
์ปค๋ฐ
tx.commit();
} catch (Exception e) {
//ํธ๋์ญ์
๋กค๋ฐฑ
tx.rollback();
} finally {
//์ํฐํฐ ๋งค๋์ ์ข
๋ฃ
em.close();
}
๋ณดํต ๋น์ฆ๋์ค ๋ก์ง์ด ์ ์์ ์ผ๋ก ๋์ํ๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ (tx.commit()), ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ ๋กค๋ฐฑ(tx.rollback())ํ๋ค.
๐ป ์ค์ต - ํ์ ์ ์ฅ
JPA๋ฅผ ํ์ฉํ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ ์์ฉ์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ์ถ์ํํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ธ SQL ํธ๋ค๋ง ์์ด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํ๋ค.
์ํฐํฐ ๋ฑ๋ก
Member member = new Member();
member.setId(2L);
member.setName("helloB");
em.persist(member);
- 'persist()' ๋ฉ์๋๋ ์๋ก์ด ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ถ๊ฐํ๋ค. ์ด ๋ ๋ฐ์ํ๋ SQL์ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋๋ค.
๋จ์ผ ์ํฐํฐ ์กฐํ
Member member = em.find(Member.class, id);
- 'find()' ๋ฉ์๋๋ ์ฃผ์ด์ง ์ํฐํฐ ํ์ ๊ณผ ์๋ณ์๋ฅผ ์ฌ์ฉํด ์ํฐํฐ ๋งค๋์ ์ ์ํด ๊ด๋ฆฌ๋๋ ์ํฐํฐ ์ธ์คํด์ค๋ฅผ ์ฐพ๋๋ค.
- ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ์์์ฑ ์ปจํ ์คํธ ๋ด์ ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ์ง ์๊ณ ์บ์๋ ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค.
- ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ์์์ฑ ์ปจํ ์คํธ์ ๋ฑ๋กํ๋ค.
์ํฐํฐ ์ญ์
em.remove(member);
- 'remove()' ๋ฉ์๋๋ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์์ ์ ๊ฑฐํ๋ฉฐ, ํด๋น ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ญ์ ํ๋ค.
์ํฐํฐ ์์
Member member = em.find(Member.class, id);
member.setName("member01");
- ์ํฐํฐ์ ์์ ์ 'em.update()'๋ 'em.persist()'๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ ํ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ฐ์๋๋ค.
- JPA๋ ํธ๋์ญ์ ์ปค๋ฐ ์์ ์ ์ํฐํฐ์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ('Dirty Checking'), ๋ณ๊ฒฝ๋ ์ํฐํฐ์ ๋ํ 'UPDATE' SQL์ ์์ฑํ๊ณ ์คํํ๋ค.
๐ป ์ค์ต - JPQL(Java Persistence Query Language) ์๊ฐ
- JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, ์ด ๋ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ด ๊ฒ์ ์ฟผ๋ฆฌ์ด๋ค.
- ํ ์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด์ ๊ธฐ๋ฐํ์ฌ ๊ฒ์์ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ์ ํํ์ฌ ๊ฒ์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
- ๊ทธ ๊ฒฐ๊ณผ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์๋ก ํ๋ ํน์ ๋ฐ์ดํฐ๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋, ๊ฒ์ ์กฐ๊ฑด์ ํฌํจํ๋ SQL ์์ฑ์ด ํ์์ ์ด๋ค.
- ๋ฐ๋ผ์ JPA๋ SQL์ ์ถ์ํํ JPQL์ด๋ผ๋ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ ๊ณตํ๋ค.
JPQL์ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ก, ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค. ์ด๋ SQL์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ ๊ฒ๊ณผ ๋์กฐ๋๋ค.
JPQL์ 'SELECT', 'FROM', 'WHERE', 'GROUP BY', 'HAVING', 'JOIN' ๋ฑ์ SQL๊ณผ ์ ์ฌํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง๋ง, ์ฒ๋ฆฌ์ ๋์์ด ๊ฐ์ฒด์ ์ํ์ ๊ด๊ณ๋ฅผ ๋ฐ์ํ๋ ํด๋์ค์ ํ๋์ด๋ค.
์๋ฅผ ๋ค์ด,
List<Member> result = em.createQuery("SELECT m FROM Member m", Member.class)
.setFirstResult(5)
.setMaxResults(8) //ํ์ด์ง (5๋ฒ๋ถํฐ 8๊ฐ ๊ฐ์ ธ์)
.getResultList();
for (Member member : result) {
System.out.println("member.name = " + member.getName());
}
- createQuery() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ JPQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก TypedQuery ๊ฐ์ฒด๋ฅผ ์ป๋๋ค.
- ์ด ์ฟผ๋ฆฌ ๊ฐ์ฒด์ getResultList() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, JPA๋ JPQL์ ๋ถ์ํ๊ณ ํด๋นํ๋ SQL์ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค. ์กฐํ๋ ๋ฐ์ดํฐ๋ ์ง์ ๋ ์ํฐํฐ ํ์ ์ ๊ฐ์ฒด ๋ชฉ๋ก์ผ๋ก ๋ฐํ๋๋ค.
๐ก๊ฒฐ๋ก
JPA์ ์ด๋ฌํ ์์ ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ ์์ฉ์ ๊ฐ๋ฐ์๋ก๋ถํฐ ์ถ์ํํ๊ณ , ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ๋ฐ์ดํฐ ์ก์ธ์ค๋ฅผ ํต์ผ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
์ด๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฐ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํค๋ ์ด์ ์ ์ ๊ณตํ๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- SQL
- SQL ๋ ๋ฒจ์
- EnumType.ORDINAL
- ์คํ๋ง
- ์นMVC
- ๋ฐฑ์ค ํ์ด์ฌ
- ํ์ํํด
- elasticsearch
- ์น MVC
- ๋น์์
- ์คํ๋ง ๋ถ๋งํฌ
- ์คํ๋ง ์ปค๋ฎค๋ํฐ
- ๋ก๊น
- ์คํ๋ง๋ถํธ
- ์๋ฐ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ๋ก๊ทธ์์
- SQLD
- DP
- ์๋ฐ ์คํ๋ง
- ์ธํ ๋ฆฌ์ ์ด
- ํ๋ก ํธ์๋
- ์ค์์
- ์ง์ฐ๋ก๋ฉ
- ์์
- ๋ฐฑ์ค
- ํ์ด์ฌ
- ์ปค๋ฎค๋ํฐ
- ๋ถ๋งํฌ
- JPA
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |