* ํด๋น ๊ธ์ ๊น์ํ ๊ฐ์ฌ๋์ ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ์ ๋ณด๊ณ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.(์์ธํ ๋ด์ฉ์ ๊ฐ์๊ฐ ์ต๊ณฑ๋๋ค. ๊ฐ์ ์ฌ์ธ์)
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ ๊ฐ์ - ์ธํ๋ฐ
์ ๋ ์ผ์ํ์ด ์๋๋ผ ํ์ํ์ธ๊ฐ๋ด์^^ ํ์ฉํธ ๋์ด๊ฐ๋ค 30% ์ ๋ ๋ฃ๊ณ ๋์ ํ ๋ต๋ตํด์ ๊ธฐ๋ณธํธ์ ๋ค์ด๋ฒ๋ ธ๋ค์^^. ํ์ฃผ ํ์ฃผ ๊น์ํ๋ ๊ฐ์ ๋ค์ผ๋ ๋ ์ ๋๋ ๋ชจ์ต์ ์ค์ค๋ก ๋๋๋๋ค. ํนํ ์ค
www.inflearn.com
JPA์ ์ญํ ๊ณผ ํ์ ๋ฐฐ๊ฒฝ
๐ถ JPA์ ์ญํ
JPA๋ ๊ฐ๋ฐ์ ๋์ SQL๋ฌธ์ ์์ฑํด์ค๋ค.
๐ถ JPA๋ฅผ ์ค๋ฌด์์ ์ฌ์ฉํ ๋ ์ฐ๋ฆฌ๊ฐ ์ ๋๋ก ๋ชป์ฌ์ฉํ๋ ์ด์
1๏ธโฃ ๊ฐ์ฒด์ ํ ์ด๋ธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋งคํํ๊ณ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ์
2๏ธโฃ JPA ๋ด๋ถ ๋์ ๋ฐฉ์์ ์ดํดํ์ง ๋ชปํด์
JPA์ ํ์ ๋ฐฐ๊ฒฝ
์ง๊ธ ์๋๋ ๊ฐ์ฒด๋ฅผ ๊ด๊ณํ DB์ ๊ด๋ฆฌ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด ๊ฐ์ฒด๋ฅผ ๊ด๊ณํ DB์ ๋ฃ์ผ๋ ค๋ฉด ์๋ง์ SQL๋ฌธ์ ์์ฑํ๊ณค ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ๊ฐ์ฒด์ ๊ด๊ณํ DB๊ฐ์ ํจ๋ฌ๋ค์์ ๋ถ์ผ์น๋ก ์ ๋ฐ๋๋ค.
์์ ์ ์กฐํํ ๋๋ JOIN SQL์ ๋งค๋ฒ ์์ฑํด์ผ ํ ๋ฟ๋๋ฌ, ๊ฐ์ฒด๋ ๊ณ์ ์์ฑํด์ฃผ์ด์ผ ํ๋ค. ์ฐ๊ด๊ด๊ณ์ ๋ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ๋๋ ์ด๊ธฐ์ SQL๋ก JOINํ ๊ฒ์ ๋ฐ๋ผ ํ์ ๋ฒ์๊ฐ ๋ฌ๋ผ์ง๋ค. ์ด๋ ๊ฐ์ฒด ๊ทธ๋ํ์ ๋ํ ์ ๋ขฐ์ฑ ๋ฌธ์ ๋ก๋ ์ด์ด์ง ์ ์๋ค. ๋ํ ๋น๊ตํ ๋๋ ๋งค๋ฒ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋๋ผ๋ == ์ฐ์ฐ์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
์ฆ, "SQL ์ค์ฌ ๊ฐ๋ฐ์ ๋ฌธ์ "๊ฐ JPA ํ์ ๋ฐฐ๊ฒฝ์ ํ ๋ชซ์ ํ ๊ฒ์ด๋ค.
JPA์ JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์
JPA๋?
JPA๋ Java Persistence API๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ ORM์ ์ผ์ข ์ด๋ค. ORM์ด๋ผ ํจ์ ๊ฐ์ฒด์ ๊ด๊ณํ DB ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ด๋ผ ์๊ฐํ ์ ์๋๋ฐ, JPA๋ Entity๋ฅผ ์์์ ๋ถ์ํ๊ณ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ SQL์ ์์ฑํด DB์ ์ฐ๊ฒฐ์์ผ์ค๋ค.
๐ถ JPA์ ๋ฑ์ฅ ์ด์ ์ฌ์ฉํ๋ ๊ฒ๋ค
EJB โก๏ธ ํ์ด๋ฒ๋ค์ดํธ(์คํ ์์ค) โก๏ธ JPA(ํ์ค๋ช ์ธ)
EJB๊ฐ ๋๋ฌด ์ด๋ ค์ด ๋๋จธ์ง ํ๋ ๊ฐ๋ฐ์๋ถ์ด ์คํ ์์ค๋ก ์ฝ๊ฒ ๋ง๋ ๊ฒ์ด ํ์ด๋ฒ๋ค์ดํธ์ด๋ค. ๊ทผ๋ฐ ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์๊ฐ๋ณด๋ค ํจ์ฌ ์ข์, ํ์ค ๋ช ์ธ๋ก ๊ตณ์ด์ง ๊ฒ์ด ๋ฐ๋ก JPA์ด๋ค.
์ JPA์ธ๊ฐ?
1๏ธโฃ SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋ค.
2๏ธโฃ ์์ฐ์ฑ์ด ์ข๋ค.
3๏ธโฃ ์ ์ง๋ณด์๊ฐ ์ฝ๋ค.
4๏ธโฃ ํจ๋ฌ๋ค์์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
5๏ธโฃ ์ฑ๋ฅ ํฅ์ํ ์ ์๋ค.(1์ฐจ ์บ์์ ๋์ผ์ฑ ๋ณด์ฅ, ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์, ์ง์ฐ ๋ก๋ฉ๊ณผ ์ฆ์ ๋ก๋ฉ)
๐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๋ฐฉ์ธ
JPA๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ์๋์ง ์๋๋ค.
๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ณตํ๋ SQL ๋ฌธ๋ฒ๊ณผ ํจ์๋ ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค.
์ด๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋งํ๋ ๋ฐฉ์ธ์ SQL ํ์ค์ ์งํค์ง ์๋ ํน์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ง์ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ๋งํ๋ค.
์ฆ, JPA์๊ฒ ์ด๋ ํ ๋ฐฉ์ธ์ ์ฌ์ฉํ ์ง ์๋ ค์ฃผ๋ฉด ๊ทธ์ ๋ง์ถ์ด์ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ง ์์์ ๊ฒฐ์ ํ๋ค.
ํ์ด๋ฒ๋ค์ดํธ๋ 40๊ฐ์ง ์ด์์ ๋ฐฉ์ธ์ ์ ๊ณตํ๊ณ ์๋ค.
javax๋ ํ์ค์ ์งํค๋ ๊ฒ์ด๊ณ , hibernate๊ฐ ์๋ ๊ฒ์ ์ ์ฉ ์ต์ ์ด๋ผ ๋ค๋ฅธ ๊ตฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋์ง๋ ์๋๋ค.
JPA๋ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
1๏ธโฃ ๋จผ์ JPA๊ฐ ๊ตฌ๋๋ ๋, META-INF/persistence.xml์ ์ ๋ ฅ๋ ์ค์ ์ ๋ณด์ ๋ฐ๋ผ ๊ธฐ๋ณธ ์ ํ ์ด ์ค์ ๋๋ค.
2๏ธโฃ EntityManagerFactory๋ฅผ ์์ฑํ๋ค.
3๏ธโฃ EntityManagerFactory์์ EntityManager๋ฅผ ์์ฑํ๋ค.
4๏ธโฃ EntityManager์์๋ EntityTransaction์ ๋ง๋ค ์ ์๊ณ , JPA์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํด๋น ํธ๋์ญ์ ์์์ ์ํ๋๋ค.
์ฃผ์ํ ์ ์ ์ํฐํฐ ๋งค๋์ ๋ ์ฐ๋ ๋ ๊ฐ์ ๊ณต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ํ์๋ ๋ฒ๋ ค์ผํ๋ค.
์์์ฑ ์ปจํ ์คํธ
๐ฒ "์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ" ์ด๋ผ๋ ๋ป์ด๋ค.
๐ฒ EntityManager.persist(entity) ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์์ ์ ์ฅํ ์ ์๋ค.
๐ฒ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ ์ด๋ฉฐ, ๋์ ๋ณด์ด์ง ์๋๋ค. ์ํฐํฐ ๋งค๋์ ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผํ ์ ์๋ค.
์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
๐ฒ ๋น์์(new/transient)
์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ๊ฐ ์๋ ์๋ก์ด ์ํ์ด๋ค.
๐ฒ ์์(managed)
์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋๋ ์ํ์ด๋ค.
๐ฒ ์ค์์(detached)
์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ์ด๋ค.
๐ฒ ์ญ์ (removed)
์ญ์ ๋ ์ํ์ด๋ค.
๋น์์ ์ํ
Member member = new Member();
member.setId(100L);
member.setName("HelloJPA");
์์
em.persist(memeber);
์ค์์ ์ํ
em.detach(member);
์ญ์
em.remove(member);
์์์ฑ ์ปจํ ์คํธ์ ์ด์
๐ถ ์ํฐํฐ ์กฐํ(1์ฐจ ์บ์)
em.persist()๋ฅผ ํตํด ์์ํํ๊ฒ ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก 1์ฐจ ์บ์์ ํด๋น Entity์ ์ํ๊ฐ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ 1์ฐจ ์บ์์ ์ ์ฅ๋ ์ํ์์ em.find()๋ช ๋ น์ ์ํํ๊ฒ ๋๋ฉด DB๋ฅผ ์กฐํํ ํ์์์ด ๋ฐ๋ก ๊ฐ์ ์ฐพ์ ์ ์๋ค.
๋น์ฆ๋์ค๊ฐ ๋ณต์กํ๋ฉด ์ด๋์ ๋ ๋์์ด๋๋, ์ฌ๋ฌ ๋ช ์ ๊ณ ๊ฐ์ด ์ฌ์ฉํ๋ ๋๋ ์ฒ๋ฆฌํ์ง ๋ชปํด ํฐ ์ด์ ์ ์๋ค๊ณ ๋ณธ๋ค.
๐ถ ์์ ์ํฐํฐ์ ๋์ผ์ฑ ๋ณด์ฅ
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); // ๋์ผ์ฑ ๋น๊ต true
๋๋ค 1์ฐจ์บ์์์ ๊ฐ์ ธ์จ ๊ฐ์ด๋ฏ๋ก ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๐ถ ์ํฐํฐ ๋ฑ๋ก, ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(memberA);
em.persist(memberB);
transaction.commit();
em.persist()๋ฅผ ์ํํ๋ฉด ์์ํ๋์ด ์์์ฑ ์ปจํ ์คํธ์ ๋ค์ด๊ฐ๋ค๊ณ ํ์๋ค. ์ด๋, ๋์์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ INSERT SQL๋ฌธ์ด ๋์์ ๋ง๋ค์ด์ง๋ค.
๊ทธ๋ฆฌ๊ณ transaction.commit()๋ฅผ ํ๊ฒ๋๋ฉด ๊ทธ๋์์ผ ์์ฌ์๋ SQL๋ฌธ์ด ํ๋ฒ์ DB๋ก ์ ์ก๋์ด ์ํ๋๋ค.
hibernate์ batch size๋ผ๋ ์์ฑ์ด ์๋ค. ๋ง์น ๋ฒํผ๋ง ๊ฐ์ ๊ธฐ๋ฅ์ธ๋ฐ, ์ผ๋ง๋ ํ๋ฒ์ ๋ชจ์์ ๋ณด๋ผ์ง ์ ํ๋ ๊ธฐ๋ฅ๋ ์๋ค.
๐ถ ์ํฐํฐ ์์ , ๋ณ๊ฒฝ ๊ฐ์ง
Member member = em.find(Member.class, 150L);
member.setName("ZZZZZ");
tx.commit();
์์ ์ ์์ด์๋ persist()๋ฅผ ํ์ง์๋๋ค. ๊ทธ์ ์๋ฐ ์ปฌ๋ ์ ๋ค๋ฃจ๋ฏ์ด ๊ฐ๋ง ๋ฐ๊พธ์ด์ฃผ๋ฉด ๋์ธ ๊ฒ์ด๋ค. ์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ JPA์ ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking)์ด๋ผ๋ ๊ธฐ๋ฅ ๋๋ฌธ์ด๋ค.
1์ฐจ ์บ์ ์์๋ Id ๊ฐ๊ณผ Entity, ๊ทธ๋ฆฌ๊ณ ์ต์ด ์ํ๋ฅผ ์ง์ด๋ฃ์ ์ค๋ ์ท์ ๊ฐ์ง๊ณ ์๋ค.
์ด๋, memberA๋ผ๋ ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด(flush ํธ์ถ ์) ์ค๋ ์ท๊ณผ ์ํฐํฐ๋ฅผ ๋น๊ตํ๋ค. ๋ง์ฝ Entity์ ์ค๋ ์ท์ด ๋ค๋ฅด๋ค๋ฉด, UPDATE SQL์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ๋ฃ๊ฒ ๋๋ค. ๊ทธ๋์ ๊ตณ์ด ์ฐ๋ฆฌ๊ฐ persist๋ฅผ ํ์ง ์๋๋ผ๋ ์์์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ SQL๋ฌธ์ ์์ฑํด์ค ์ ์๋ค.
์ํฐํฐ์ ์ญ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋๋๋ค.
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA);
ํ๋ฌ์(flush)
๐ฒ ์์์ฑ ์ปจํ ์คํธ์ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋ ๊ฒ
ํ๋ฌ์(flush)๋ ์ธ์ ๋ฐ์ํ๋๊ฐ?
๐ฒ ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking)
๐ฒ ์์ ๋ ์ํฐํฐ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ๋ฑ๋ก
๐ฒ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ก
์์์ฑ ์ปจํ ์คํธ์ ํ๋ฌ์ํ๋ ๋ฐฉ๋ฒ
๐ฒ ์ง์ ํธ์ถ : em.flush()
๐ฒ ์๋ ํธ์ถ : ํธ๋์ญ์ ์ปค๋ฐ, JPQL ์ฟผ๋ฆฌ ์คํ ์
๐ค flush๋ฅผ ํ๊ฒ ๋๋ฉด 1์ฐจ ์บ์๋ ์์ ๋๋๊ฐ?
์๋๋ค. 1์ฐจ ์บ์๋ ์์ ๋์ง ์๋๋ค.
๐ค JPQL ์คํ ์ ์๋์ผ๋ก ํ๋ฌ์๊ฐ ํธ์ถ๋๋ ์ด์
em.persist(memberA); em.persist(memberB); em.persist(memberC); query = em.createQuery("select m from Member m", Member.class); List<Member> members = query.getResultList();
em.persist()์์๋ ์ค์ ๋ก ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ธฐ์ง๋ ์๋๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฉค๋ฒ๋ฅผ JPQL๋ก ๊ฐ์ ธ์๋ Insert ๋์ง ์์์ ๊ฐ์ ธ์์ง์ง ์๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ JPQL ์ฟผ๋ฆฌ ์คํ ์ ํ๋ฌ์๊ฐ ์๋์ผ๋ก ํธ์ถํ์ฌ DB์ ๋ฏธ๋ฆฌ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์ค์์ ์ํ(detached)
์์ ์ํ์ ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ๋๋ ์ํ์ด๋ค. ๊ทธ๋์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๋ค.
๐ฒ em.detach(entity)
ํน์ ์ํฐํฐ๋ง ์ค์์ ์ํ๋ก ์ ํํ๋ค.
๐ฒ em.clear()
์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํํ๋ค.
๐ฒ em.close()
์์์ฑ ์ปคํ ์คํธ๋ฅผ ์ข ๋ฃํ๋ค. ์์ ํ 1์ฐจ์บ์๋ฅผ ํต์ผ๋ก ๋น์ด๋ค.
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ ๊ฐ์ - ์ธํ๋ฐ
์ ๋ ์ผ์ํ์ด ์๋๋ผ ํ์ํ์ธ๊ฐ๋ด์^^ ํ์ฉํธ ๋์ด๊ฐ๋ค 30% ์ ๋ ๋ฃ๊ณ ๋์ ํ ๋ต๋ตํด์ ๊ธฐ๋ณธํธ์ ๋ค์ด๋ฒ๋ ธ๋ค์^^. ํ์ฃผ ํ์ฃผ ๊น์ํ๋ ๊ฐ์ ๋ค์ผ๋ ๋ ์ ๋๋ ๋ชจ์ต์ ์ค์ค๋ก ๋๋๋๋ค. ํนํ ์ค
www.inflearn.com
'๐ฃ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ณ ๊ธ ๋งคํ ์์๋ณด๊ธฐ (1) | 2024.03.16 |
---|---|
[JPA] ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ ์์๋ณด๊ธฐ (2) | 2024.03.09 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ์ ๊ธฐ์ด (4) | 2024.03.08 |
[JPA] JPA Entity ๋งคํํ๊ธฐ (0) | 2024.03.02 |