ð§ ë€ìŽê°êž° ì ...
JPA : Java Persistence API, ìë°ì ORM êž°ì íì€ìŒë¡ ì í늬ìŒìŽì 곌 JDBC ì¬ìŽìì ëìíë€.
JPAê° ì ê³µíë êž°ë¥ì í¬ê² ë ê°ì§ë¡ ëëë€.
- ìí°í°ì í ìŽëžì ë§€í
- ìí°í°ë¥Œ ì€ì ì¬ì©
JPAë ìí°í° ë§€ëì 륌 íµíŽì ìí°í°ë¥Œ ì¬ì©íê² ëëë°,
ìŽë ìí°í° ë§€ëì ë ì ì¥, ìì , ìì , ì¡°í ë±ì ìí°í°ì êŽë šë 몚ë ìŒì ì²ëЬíë€.
ê°ë°ì ì ì¥ììë ìí°í° ë§€ëì ë ìí°í°ë¥Œ ì ì¥íë ê°ìì ë°ìŽí°ë² ìŽì€ëŒê³ ìê°í멎 ëë€.
â ìí°í° ë§€ëì í©í 늬ì ìí°í° ë§€ëì
âïž ìí°í° ë§€ëì í©í 늬 VS ìí°í° ë§€ëì
- Entity Manager Factory:
- ìí°í° ë§€ëì 륌 ìì±íë€
- Persistence Unitì êž°ë°ìŒë¡ ìì±ëë ê°ì²Žë¡, ë°ìŽí°ë² ìŽì€ìì ì°ê²° ì€ì , JPA 구í첎 ìŽêž°í, ìºì± ì ëµ ë±ì êŽëЬíë€.
- ì í늬ìŒìŽì ì ììì ê³µì ëë©°, ìŒë°ì ìŒë¡ ì í늬ìŒìŽì ì€í ëì í ë²ë§ ìì±ëë€.
- ìì± ë¹ì©ìŽ ëêž° ë묞ì ë¹ë²íê² ìì±íê±°ë ì멞ìí€ì§ ìëë¡ ì€ê³íŽìŒ íë€.
- Entity Manager:
- í¹ì ë°ìŽí°ë² ìŽì€ ìì ì ìííë ê°ì²Žë¡, JPAì íµì¬ ìì (ìœì , ìì , ìì , ì¡°í ë±)ì ì²ëЬ
- ììì± ì»ší ì€íž(Persistence Context)륌 êŽëЬíë©°, ìí°í° ê°ì²Žì ë°ìŽí°ë² ìŽì€ ê°ì ìí ëêž°í륌 ëŽë¹
- ì í늬ìŒìŽì ì ë¹ìŠëì€ ë¡ì§ ëšì(ížëìì )ìì ì¬ì©ëë©°, ížëìì ìŽ ììë멎 컀ë¥ì íë ì¢ ë£ë멎 ë«í
âïž êŽê³
- ìì± êŽê³
- EntityManagerFactoryë EntityManager륌 ìì±íë í©í 늬 ìí ì íë€.
// EntityManagerFactory ë§ë€êž°, ë¹ì©ìŽ ì죌 ë§ìŽ ë ë€.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
// EntityManager ë§ë€êž°, ë¹ì©ìŽ ê±°ì ìë ë€.
EntityManager em = emf.createEntityManager();
persistence.createEntityManagerFactory("my-persistence-unit")륌 ížì¶í멎
META-INF/persistence.xmlì ìë ì 볎(Persistence Unit)륌 ë°íìŒë¡ EntityManagerFactory륌 ìì±íë€.
// persistence.xml ìœë
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="my-persistence-unit">
<properties>
<!-- ë°ìŽí°ë² ìŽì€ ì°ê²° ì 볎 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mydb" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="password" />
<!-- JPA 구í첎(Hibernate) êŽë š ì€ì -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
- ëŒìŽíì¬ìŽíŽ
- EntityManagerFactoryë ì í늬ìŒìŽì ì ì 첎 ìëª ëì ì ì§ëë©°, ì¬ë¬ EntityManager ìžì€íŽì€ë¥Œ ìì±í ì ë€.
- EntityManagerë ì§§ì ìëª ì£Œêž°ë¥Œ ê°ì§ë©°, í¹ì ìì (ížëìì )ìŽë ìì² ë²ì ëŽìì ì¬ì©ë í ë«íë€(em.close()).
- ì졎 êŽê³
- EntityManagerë íì EntityManagerFactoryì ìíŽ ìì±ëë©°, ë 늜ì ìŒë¡ ìì±ë ì ìë€.
- EntityManagerë ìì ì ìì±í EntityManagerFactoryì ì€ì ë° ëŠ¬ìì€ë¥Œ ì¬ì©íë€.
âïž í¹ì§
- ì€ë ë
- EntityManagerFactoryë ì¬ë¬ ì€ë ëìì ìì íê² ê³µì ê°ë¥íë€.
- EntityManagerë ê° ì€ë ëìì ë 늜ì ìŒë¡ ì¬ì©íŽìŒ íë©° ê³µì ê° ë¶ê°ë¥íë€.
- ë°ìŽí°ë² ìŽì€ 컀ë¥ì
- EntityManagerë ë°ìŽí°ë² ìŽì€ ì°ê²°ìŽ êŒ íìí ìì ê¹ì§ 컀ë¥ì
ì ì»ì§ ìëë€.
- ížëìì ì ììí ë 컀ë¥ì ì ì»ëë€.
- J2SE í겜ììë íìŽë²ë€ìŽížë¥Œ í¬íší JPA 구í첎ë€ì EntityManagerFactory륌 ìì±í ë 컀ë¥ì íë ë§ë ë€.
- J2EE í겜ììë íŽë¹ 컚í ìŽëê° ì ê³µíë ë°ìŽí°ìì€ë¥Œ ì¬ì©íë€.
- EntityManagerë ë°ìŽí°ë² ìŽì€ ì°ê²°ìŽ êŒ íìí ìì ê¹ì§ 컀ë¥ì
ì ì»ì§ ìëë€.
â ììì± ì»ší ì€ížë?
JPA륌 ìŽíŽíëë° ê°ì¥ ì€ìí ì©ìŽë ììì± ì»ší ì€ížìŽë€.
ììì± ì»ší ì€íž: persistence context, ìí°í°ë¥Œ ì구 ì ì¥íë í겜ì ì믞íë€.
ìí°í° ë§€ëì ë¡ ìí°í°ë¥Œ ì ì¥íê±°ë ì¡°íí멎 ìí°í° ë§€ëì ë ììì± ì»ší ì€ížì ìí°í°ë¥Œ 볎êŽíê³ êŽëЬíë€.
em.persist(member);
ì ííê² ìì ìœë륌 íŽìí멎
"persist() ë©ìëë ìí°í° ë§€ëì 륌 ì¬ì©íì¬ íì ìí°í°ë¥Œ ììì± ì»ší ì€ížì ì ì¥íë€" ëŒê³ ííí ì ìë€.
ììì± ì»ší ì€ížë ìí°í° ë§€ëì 륌 ìì±í ë íë ë§ë€ìŽì§ë€.
ê·žëŠ¬ê³ ìí°í° ë§€ëì 륌 íµíŽì ììì± ì»ší ì€ížì ì ê·Œí ì ìê³ , ììì± ì»ší ì€ížë¥Œ êŽëЬí ì ìë€.
ðšì¬ë¬ ìí°í° ë§€ëì ê° ê°ì ììì± ì»ší ì€ížì ì ê·Œíë ê²ë ê°ë¥íë€.
1ïžâ£ ììì± ì»ší ì€ížì í¹ì§
ììì± ì»ší ì€ížì í¹ì§ì ë€ì곌 ê°ë€.
1. ììì± ì»ší ì€ížì ìë³ì ê°
ììì± ì»ší ì€ížë ìí°í°ì ìë³ì ê°ì êž°ì€ìŒë¡ ìë³íë€.
ë°ëŒì, ììì± ì»ší
ì€ížë ìí°í°ì ìë³ìê°ì ë°ëì ê°ì§ê³ ììŽìŒ íë€.
2. ììì± ì»ší
ì€ížì ë°ìŽí°ë² ìŽì€ ì ì¥
ììì± ì»ší
ì€ížì ìë ìí°í°ê° ë°ìŽí°ë² ìŽì€ì ì ì¥ëë ìì ì 'íë¬ì'íë ìê°ìŽë€.
(íë¬ìë ë€ìì ë ììží ë€ë£šê² ë€.)
3. ì¥ì
- 1ì°š ìºì
- ëìŒì± 볎ì¥
- ížëìì
ì ì§ìíë ì°êž° ì§ì°
- ë³ê²œ ê°ì§
- ì§ì° ë¡ë©
âïž 1. ìí°í° ì¡°í
ììì± ì»ší
ì€ížë ëŽë¶ì '1ì°š ìºì'ëŒë ê²ì ê°ì§ê³ ìë€.
ê·žëŠ¬ê³ ëªšë ìì ìíì ìí°í°ë íŽë¹ ìºìì ì ì¥ëë€.
(í€ë @Idë¡ ë§€íí ìë³ì, Valueë ìí°í°ìŽë€.)
// ìí°í°ë¥Œ ìì±í ìí (ë¹ìì)
Member member = new Member();
member.setId("member1");
member.setUsername("íì 1");
// ìí°í°ë¥Œ ìì
em.persist(member);
ìì ìœë륌 ì€íí멎 귞늌ì²ëŒ 1ì°š ìºìì íì ìí°í°ë¥Œ ì ì¥íê² ëë€.
ìŽë, ìì§ íì ìí°í°ë ë°ìŽí°ë² ìŽì€ì ì ì¥ëì§ ììë€.
1ì°š ìºìì Keyë ìí°í°ì ìë³ì ê° "member1"ìŽë€.
ê·žëŠ¬ê³ ìë³ì ê°ì ë°ìŽí°ë² ìŽì€ì Ʞ볞 í€ì ë§€íëìŽ ìë€.
ë°ëŒì ììì± ì»ší
ì€ížì ë°ìŽí°ë¥Œ ì ì¥íê³ ì¡°ííë 몚ë êž°ì€ì ë°ìŽí°ë² ìŽì€ì Ʞ볞 í€ ê°ìŽë€.
ê·žë¬ë¯ë¡ ìí°í°ë¥Œ ì¡°ííë ìœëë ë€ì곌 ê°ë€.
// ìí°í° ì¡°í
Member member = em.find(Member.class, "member1");
find() ë©ìëì íëŒë¯ží°ë ë€ì곌 ê°ë€.
- 첫 ë²ì§ž íëŒë¯ží°: ìí°í° íŽëì€ì íì
- ë ë²ì§ž íëŒë¯ží°: ì¡°íí ìí°í°ì ìë³ì ê°
em.find()ìì ì°Ÿë ìí°í°ì ìë³ìê°ì ì°ì 1ì°š ìºììì ì°Ÿê³ ,
1ì°š ìºìì ìë€ë©Ž ë°ìŽí°ë² ìŽì€ìì ì¡°ííë€.
ð case1) 1ì°š ìºììì ì¡°í
`em.find()`륌 ížì¶í멎 ì°ì 1ì°š ìºììì ìë³ì ê°ìŒë¡ ìí°í°ë¥Œ ì°Ÿëë€.
ë§ìœ 1ì°š ìºìì ì°Ÿë ìí°í°ê° ìë€ë©Ž ë°ìŽí°ë² ìŽì€ë¥Œ ì¡°ííì§ ìê³ ë©ëªšëЬì ìë 1ì°š ìºììì ìí°í°ë¥Œ ì¡°ííë€.
ð case2) ë°ìŽí°ë² ìŽì€ìì ì¡°í
em.find()륌 ížì¶íëë° 1ì°š ìºìì ìí°í°ê° 졎ì¬íì§ ìë 겜ì°,
ìí°í° ë§€ëì ë ë°ìŽí°ë² ìŽì€ë¥Œ ì¡°ííŽì ìí°í°ë¥Œ ìì±íë€.
ê·žëŠ¬ê³ 1ì°š ìºìì ìí°í°ë¥Œ ì ì¥íê³ ìì ìíì ìí°í°ë¥Œ ë°ííë€.
ðšNOTE
ììì± ì»ší
ì€ížì ìë ìí°í°ë¥Œ ì¡°íí ë ëìŒì±ì 볎ì¥íë€.
ìŠ, em.find(Member.class, "member1")륌 ë°ë³µíŽì ížì¶íëëŒë 1ì°š ìºìììë ê°ì ìžì€íŽì€ë¥Œ ë°ííë€.
ë°ëŒì ììì± ì»ší
ì€ížë ì±ë¥ì ìŽì 곌 ìí°í°ì ëìŒì±ì 볎ì¥íë€.
ëìŒì±ê³Œ ëë±ì±
- ëìŒì±
ì€ì ìžì€íŽì€ê° ê°ë€.
ë°ëŒì ì°žì¡°íë ê°ì ë¹êµíë == ë¹êµì ê°ìŽ ê°ë€.
- ëë±ì±
ì€ì ìžì€íŽì€ë ë€ë¥Œ ì ìì§ë§ ê°ì§ê³ ìë ê°ìŽ ê°ë€.
ìë°ììë ëë±ì±ì equals() ë©ìëë¡ êµ¬ííŽìŒíë€.
âïž 2. ìí°í° ë±ë¡
ìí°í° ë§€ëì 륌 ì¬ì©íŽì ìí°í°ë¥Œ ììì± ì»ší ì€ížì ììíë 곌ì ì ìŽíŽë³Žì.
// ìí°í° ë±ë¡ ìœë
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// ìí°í° ë§€ëì ë ë°ìŽí° ë³ê²œì ížëìì
ì ììíŽìŒ íë€.
transaction.begin();
em.persist(memberA);
em.persist(memberB);
// ì¬êž°ê¹ì§ INSERT SQLì 볎ëŽì§ ìëë€.
// 컀ë°íë ìê° ë°ìŽí°ë² ìŽì€ì INSERT SQL묞ì 볎ëžë€.
transaction.commit();
ì°êž° ì§ì°
- ìí°í° ë§€ëì ë transactionìŽ commit íêž° ì ê¹ì§ INSERT SQL묞ì ëŽë¶ 쿌늬 ì ì¥ìì 몚ìëë€.
- transactionìŽ commit í멎 ë°ìŽí°ë² ìŽì€ì 몚ìë INSERT SQL묞ì ì ì¡íë€.
ìœë륌 ìŽíŽë³Žë©Ž íì A륌 뚌ì ììíê² ëëë°,
ìŽë ììì± ì»ší
ì€ížë 1ì°š ìºìì íì ìí°í°ë¥Œ ì ì¥í멎ì ëìì íì ìí°í° ì ë³Žë¡ ë±ë¡ 쿌늬륌 ë§ë ë€.
ê·žëŠ¬ê³ ë§ë€ìŽì§ ë±ë¡ 쿌늬ë ì°êž° ì§ì° SQL ì ì¥ìì 볎êŽëë€.
ë§ì°¬ê°ì§ë¡ íì Bì ëíŽìë íì ìí°í° ì ë³Žë¡ ë±ë¡ 쿌늬륌 ìì±íì¬ ì°êž° ì§ì° SQL ì ì¥ìì ì ì¥íë€.
íì¬ ì°êž° ì§ì° ì ì¥ìì ë ê°ì ì¿ŒëŠ¬ê° ì ì¥ëìŽ ìë€.
ìì 귞늌ì transaction commit()ì ëíëžë€.
- ížëìì ì commit í멎 ìí°í° ë§€ëì ë ììì± ì»ší ì€ížë¥Œ íë¬ì íë€.
- ììì± ì»ší
ì€ížì ëŽì©ì ë°ìŽí°ë² ìŽì€ì ëêž°ííë€.
- ìŠ, ì°êž° ì§ì° SQL ì ì¥ìì ëªšìž ì¿ŒëŠ¬ë¥Œ ë°ìŽí°ë² ìŽì€ì ì ë¬íë€.
âïž 3. ìí°í° ìì
ð§ SQL ìì 쿌늬ì 묞ì ì
ë°ìŽí°ë² ìŽì€ë¡ ì ì¡íë SQL ìì 쿌늬ì 묞ì ì ì ë€ì곌 ê°ë€.
- name곌 ageì 컬ëŒì ê°ì§ê³ ìë db륌 ìì íë 쿌늬륌 ìì±íë€ê° gradeëŒë 컬ëŒìŽ ì¶ê°ë멎 gradeì íŽë¹íë update묞ì ë ìì±íŽìŒ íë€.
- ìŽ ë°©ë² ê°ì 컬ëŒìŽ ê³ìíŽì ëìŽëë ê²œì° ë²ê±°ë¡ììŽ ì¡Žì¬íë€.
- name, age, grade륌 í꺌ë²ì ìì íë update묞 쿌늬륌 ìì±íê² ë멎 ê°ë°ìì ì€ìë¡ í¹ì 컬ëŒì ëí ê°ì ëì¹ ì ìë€.
ê²°êµ ì§ì ì ìŽë ê°ì ì ìŽë ë¹ìŠëì€ ë¡ì§ìŽ SQL묞ì ì졎íê² ëë€.
JPAë ìŽë¬í ì졎ì±ì 묞ì 륌 ë€ì곌 ê°ìŽ íŽê²°íìë€.
ð ë³ê²œ ê°ì§
JPAë¡ ìí°í°ë¥Œ ìì í ëìë ëšìí ìí°í°ë¥Œ ì¡°ííŽì ë°ìŽí°ë§ ë³ê²œí멎 ëë€.
ê·žëŠ¬ê³ ììì± ì»ší ì€ížììë ìŽë¬í ë³ê²œ ì¬íì ë°ìŽí°ë² ìŽì€ì ìëìŒë¡ ë°ìíë€.
ìŽë¬í êž°ë¥ì 'ë³ê²œ ê°ì§'ëŒê³ íëë° ììží 곌ì ì ë€ì곌 ê°ë€.
- ížëìì ì commit í멎 ìí°í° ë§€ëì ëŽë¶ìì 뚌ì íë¬ìê° ížì¶ëë€.
- ìí°í°ì ì€ë
ì·ì ë¹êµíì¬ ë³ê²œë ìí°í°ë¥Œ ì°Ÿëë€.
- JPAë ìí°í°ë¥Œ ììì± ì»ší ì€ížì 볎êŽí ë, ìµìŽ ìí륌 ë³µì¬íŽì ì ì¥íŽ ëë€. - ë³ê²œë ìí°í°ê° ìë€ë©Ž ìì 쿌늬륌 ìì±íì¬ ì°êž° ì§ì° SQL ì ì¥ìì 볎ëžë€.
- ì°êž° ì§ì° SQL ì ì¥ìì 쿌늬륌 ë°ìŽí°ë² ìŽì€ë¡ 볎ëžë€.
- ë°ìŽí°ë² ìŽì€ ížëìì ì 컀ë°íë€.
ð ë³ê²œ ê°ì§ì í¹ì§
ë³ê²œ ê°ì§ë ììì± ì»ší
ì€ížê° êŽëЬíë ìì ìíì ìí°í°ìë§ ì ì©ëë€.
ë¹ìì, ì€ììì²ëŒ ììì± ì»ší
ì€ížì êŽëŠ¬ë¥Œ ë°ì§ 못íë ìí°í°ë ê°ì ë³ê²œíŽë ë°ìëì§ ìëë€.
âïž 4. ìí°í° ìì
// ìí°í° ì¡°í í ìì
Memeber memberA = em.find(Memeber.class, "memberA");
em.remove(memberA);
ìí°í°ë¥Œ ìì íë €ë©Ž 뚌ì ìì ëì ìí°í°ë¥Œ ì¡°ííŽìŒ íë€.
ìí°í° ìì ì 곌ì ì ìí°í° ë±ë¡ì 곌ì 곌 ë§ì°¬ê°ì§ë¡
- 뚌ì ìì 쿌늬륌 ì°êž° ì§ì° SQL ì ì¥ìì ë±ë¡íë€.
- ìŽí ížëìì ìŽ ì»€ë°ë멎 íë¬ì륌 ížì¶íŽì ì€ì ë°ìŽí° ë² ìŽì€ì ìì 쿌늬륌 볎ëžë€.
em.remove("memberA")륌 ížì¶íë ìê° memberAë ììì± ì»ší ì€ížìì ë°ë¡ ì ê±°ëë€.
ìŽë ê² ìì ë ìí°í°ë ì¬ì¬ì©íì§ ë§ê³ ìì°ì€ëœê² ê°ë¹ì§ì»¬ë ì
ì ëììŽ ëëë¡ ëë ê²ìŽ ì¢ë€.
2ïžâ£ íë¬ì
íë¬ì(flush())ë ììì± ì»ší ì€ížì ë³ê²œ ëŽì©ì ë°ìŽí°ë² ìŽì€ì ë°ìíë€.
íë¬ìì ëì곌ì ì ë€ì곌 ê°ë€.
- ë³ê²œ ê°ì§ê° ëìíŽì ììì± ì»ší ì€ížì ìë 몚ë ìí°í°ë¥Œ ì€ë ì·ê³Œ ë¹êµíŽì ìì ë ìí°í°ë¥Œ ì°Ÿëë€.
- ìì ë ìí°í°ë ìì 쿌늬륌 ë§ë€ìŽ ì°êž° ì§ì° SQL ì ì¥ìì ë±ë¡íë€.
- ì°êž° ì§ì° SQL ì ì¥ìì 쿌늬륌 ë°ìŽí°ë² ìŽì€ì ì ì¡íë€(ë±ë¡, ìì , ìì 쿌늬).
ììì± ì»ší ì€ížë¥Œ íë¬ìíë ë°©ë²ì 3ê°ì§ë ë€ì곌 ê°ë€.
1. ì§ì ížì¶
ìí°í° ë§€ëì ì flush() ë©ìë륌 ì§ì ížì¶íŽì ììì± ì»ší ì€ížë¥Œ ê°ì ë¡ íë¬ì íë€.
(í ì€ížì ì£Œë¡ ì¬ì©)
2. ížëìì ì»€ë° ì ìë ížì¶
ë°ìŽí°ë² ìŽì€ì ë³ê²œ ëŽì©ì SQLë¡ ì ë¬íì§ ìê³ ížëìì ë§ ì»€ë°í멎 ë°ìŽí°ë² ìŽì€ì ë°ìëì§ ìëë€.
ììì± ì»ší ì€ížì ë³ê²œ ëŽì©ì ë°ìŽí°ë² ìŽì€ì ë°ìíë ëšê³ê° íë¬ìì í¬íšëë¯ë¡,ížëìì ì 컀ë°íêž° ì ì êŒ íë¬ì륌 ížì¶íŽìŒ íë€.
JPAë ìŽë° 묞ì 륌 ìë°©íêž° ìíŽ ížëìì ì 컀ë°í ë íë¬ì륌 ìëìŒë¡ ížì¶íë€.
3. JPQL 쿌늬 ì€í ì ìë ížì¶
JPQLìŽë Criteria ê°ì ê°ì²Žì§í¥ 쿌늬륌 ížì¶í ëë íë¬ìê° ì€íëë€.
JPQL 쿌늬륌 ì€íí ë íë¬ìê° ìë ížì¶ë ê¹?
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// ì€ê°ì JPQL ì€í
query = em.createQuery("select , from Meber m", Member.class);
List<Member> members = query.getResultList();
ìì ìœëìì, memberA, memberB, memberCë ìì ìíìŽë€.
ìŽ ìí°í°ë€ì ììì± ì»ší ì€ížìë ìì§ë§ ìì§ ë°ìŽí°ë² ìŽì€ìë ë°ìëì§ ììë€.
ìŽë JPQLì ì€ííê² ëë€ë©Ž?
JPQLì SQLë¡ ë³íëìŽ ë°ìŽí°ë² ìŽì€ìì ìí°í°ë¥Œ ì¡°ííë€.
ê·žë°ë° memberA, memberB, memberCë ìì§ ë°ìŽí°ë² ìŽì€ ììŒë¯ë¡ 쿌늬 ê²°ê³Œë¡ ì¡°íëì§ ìëë€.
ë°ëŒì 쿌늬륌 ì€ííêž° ì§ì ì ììì± ì»ší ì€ížë¥Œ íë¬ìíŽì ë³ê²œ ëŽì©ì ë°ìŽí°ë² ìŽì€ì ë°ìíŽìŒ íë€.
JPAë ìŽë° 묞ì 륌 ìë°©íêž° ìíŽ JPQLì ì€íí ëë íë¬ì륌 ìë ížì¶íë€.
âïž íë¬ì 몚ë ìµì
- FlushModeType.AUTO: 컀ë°ìŽë 쿌늬륌 ì€íí ë íë¬ì
- FlushModeType.COMMIT: 컀ë°í ëë§ íë¬ì
ðšNOTE
ë°ìŽí°ë² ìŽì€ì ëêž°í륌 ìµëí ëŠì¶ë ê²ìŽ ê°ë¥í ìŽì ë ížëìì ìŽëŒë ìì ëšìê° ìêž° ë묞ìŽë€.
ížëìì ì»€ë° ì§ì ìë§ ë³ê²œ ëŽì©ì ë°ìŽí°ë² ìŽì€ì ë³ŽëŽ ëêž°íí멎 ëë€.
ë°ìŽí°ë² ìŽì€ì ëêž°í륌 ìµëí ëŠì¶ë ìŽì ?
- ë°ìŽí°ë² ìŽì€ ì ê·Œ ë¹ì© ì ê°
- ë³ê²œ ì¬í ìŒêŽ ì²ëЬ
- 1ì°š ìºì íì©
- ížëìì ììì± ë³Žì¥
- 례백 ì²ëЬ 볎ì¥
3ïžâ£ìí°í°ì ìëª ì£Œêž°
ìí°í°ìë 4ê°ì§ ìíê° ì¡Žì¬íë€.
- ë¹ìì(new/transient)
: ììì± ì»ší ì€ížì ì í êŽê³ê° ìë ìí - ìì(Managed)
: ììì± ì»ší ì€ížì ì ì¥ë ìí - ì€ìì(detached)
: ììì± ì»ší ì€ížì ì ì¥ëìë€ê° ë¶ëЬë ìí - ìì (removed)
: ìì ë ìí
ê°ê°ì ìíì ëíŽì ë ììží ìŽíŽë³Žê² ë€.
âïž ë¹ìì
Member member = new Memeber();
member.setId("member1");
member.setUsername("íì1");
ìí°í° ê°ì²Žë§ ìì±í ìíìŽë€.
ììí ê°ì²Ž ìíìŽë©°, ììì± ì»ší ì€ížë ë°ìŽí°ë² ìŽì€ìë ì í êŽë šìŽ ìë€.
âïž ìì
// ê°ì²Žë¥Œ ì ì¥í ìí(ìì)
em.persist(member);
ìì±í ê°ì²Žë¥Œ ìí°í° ë§€ëì 륌 íµíŽ ììì± ì»ší ì€ížì ì ì¥íë ìœëìŽë€.
ìŽì Member ìí°í°ë ë¹ìì ìíìì ìì ìíê° ëìë€.
ìì ìíê° ëìë€ë ê²ì íŽë¹ ìí°í°ê° ììì± ì»ší ì€ížì ìíŽ êŽëЬëë€ë ë»ìŽë€.
âïž ì€ìì
ììì± ì»ší ì€ížê° êŽëЬíë ìì ìíì ìí°í°ë¥Œ ììì± ì»ší ì€ížê° êŽëЬíì§ ììŒë©Ž ì€ìì ìíê° ëë€.
í¹ì ìí°í°ë¥Œ ì€ìì ìíë¡ ë§ëë 곌ì ì ìž ê°ì§ê° ìë€.
- em.detach()
: í¹ì ìí°í°ë§ ì€ìì ìíë¡ ì ííë€. - em.clear()
: ììì± ì»ší ì€ížë¥Œ ìì í ìŽêž°ííë€. - em.close()
: ììì± ì»ší ì€ížë¥Œ ì¢ ë£íë€.
ð detach() : ìí°í°ë¥Œ ì€ìì ìíë¡ ì í
public void testDetached() {
...
// íì ìí°í° ìì±, ë¹ìì ìí
Member member = new Member();
member.setId("memberA");
member.setUsername("íìA");
// íì ìí°í° ìì ìí
em.persist(member);
// íì ìí°í°ë¥Œ ììì± ì»ší
ì€ížìì ë¶ëЬ, ì€ìì ìí
em.detach(member);
transaction.commit(); // ížëìì
컀ë°
}
em.detach() ë©ìë륌 ížì¶íë ìê°, í¹ì ìí°í°ë¥Œ ì€ìì ìíë¡ ë§ë ë€.
ìŽë, 1ì°š ìºìë¶í° ì°êž° ì§ì° SQL ì ì¥ìê¹ì§ íŽë¹ ìí°í°ë¥Œ êŽëЬíêž° ìí 몚ë ì ë³Žê° ì ê±°ëë€.
ð clear() : ìŽêž°í
// ìí°í° ì¡°í, ìì ìí
Member member = em.find(Member.class, "memberA");
em.clear(); // ììì± ì»ší
ì€íž ìŽêž°í
// ì€ìì ìí
member.setUsername("changeName");
em.clear()ë ììì± ì»ší ì€ížë¥Œ ìŽêž°ííŽì íŽë¹ ììì± ì»ší ì€ížì "몚ë " ìí°í°ë¥Œ ì€ìì ìíë¡ ë§ë ë€.
ì¬êž°ì em.detach()ìì ì°šìŽì ì em.detach()ë "í¹ì ìí°í° íë"륌 ì€ìì ìíë¡ ë§ë€ìë€ë ì ìŽë€.
ð close() : ì¢ ë£
public void closeEntityManager() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [ížëìì
] - ìì
Member memberA = em.find(Member.class, "memberA");
Member memberB = em.find(Member.class, "memberB");
transaction.commit(); // [ížëìì
] - 컀ë°
em.close(); // ììì± ì»ší
ì€íž ë«êž° (ì¢
ë£)
}
em.close()ë íŽë¹ ììì± ì»ší ì€ížê° êŽëЬíë ìììíì ìí°í°ê° 몚ë ì€ìì ìíê° ëë€.
ììì± ì»ší ì€ížê° ì¢ ë£ëìŽ ëë memberA, memberBê° êŽëЬëì§ ìëë€.
ìì ìíì ìí°í°ë ì£Œë¡ ììì± ì»ší ì€ížê° ì¢ ë£ë멎ì ì€ìì ìíê° ëë€.
(ê°ë°ìê° ì§ì ì€ìì ìíë¡ ë§ëë ìŒì ë묌ë€.)
ð§ close()륌 íµí ì€ìì ìíê° ëìì ë ìë³ì ê°ì ìŽëì?
clear()ì detach()ìë ë€ë¥Žê² close()륌 íµí ì€ìì ìíê° ëìì ëë ìì 컚í ì€ížì ëŽë¶ë¥Œ ìì í ì§ìë²ëаë€.
ê·žë ë€ë©Ž ìë³ìê°ì ìŽëì ê°ì§ê³ ìë ê²ìŒê¹?
ì°ì ìë³ì ê°ìŽ ì ì¥ëë ìì¹ì ëíŽ ììží ìŽíŽë³Žì.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
// ìì ìí ìí°í° ìì±
Member member = new Member();
member.setId(1L); // ìë³ì ì€ì
member.setUsername("íì1");
em.persist(member);
// ììì± ì»ší
ì€íž ì¢
ë£
em.close(); // ììì± ì»ší
ì€íž ì¢
ë£ -> ì€ìì ìí
// ìí°í° ê°ì²Žë ë©ëªšëЬì ëšììì
System.out.println(member.getId()); // ìë³ì ê° ì¶ë ¥: 1
System.out.println(member.getUsername()); // íì1
ìë³ì ê°ìŽ ì ì¥ëë ìì¹ë ìí°í° ê°ì²Ž ëŽë¶ìŽë€.
ìí°í°ë ë°ìŽí°ë² ìŽì€ì ëêž°íëêž° ì ìŽëŒë ìì ìŽ ê°ì§ ìë³ì ê°(ì£Œë¡ @Idë¡ ì§ì ë íë)ì ì ì§íë€.
- @Id private Long id;ì ê°ì ìë³ì íëì ê°ìŽ ì ì¥ëë€.
- ììì± ì»ší ì€ížê° ì¢ ë£ëëëŒë, ìí°í° ìžì€íŽì€ ì첎ë ë©ëªšëЬìì ì ì§ëêž° ë묞ì ìë³ì ê°ë íšê» ëšì ìê² ëë€.
ë°ëŒì ìë³ì ê°ì ìí°í° ê°ì²Žì ìë³ì íëì ì ì¥ë ìíë¡ ì ì§ëë©°, ììì± ì»ší ì€ížìë ë 늜ì ìŒë¡ 졎ì¬íë€.
ð§ close() vs remove()
- ì€ìì ìí:
- ë©ëªšëЬ ìµì í: ë ìŽì êŽëЬí íìê° ìë ìí°í°ë¥Œ ë¶ëЬíì¬ ë©ëªšëЬ ì¬ì©ëì ì€ì.
- ë¶ì° ìì€í : ížëìì ë²ì륌 ë²ìŽë ë°ìŽí° ê°ì²Žë¥Œ ì ì§íŽìŒ íë 겜ì°.
- ëª ìì ë³ê²œ êŽëЬ: ë³ê²œ ì¬íì ì§ì ë°ìíì§ ìê³ ëª ìì ìŒë¡ ë³í©(merge)ì íµíŽ ë°ìíê³ ì¶ì ë.
- ìì :
- ë°ìŽí°ë² ìŽì€ìì ìí°í°ë¥Œ ì구ì ìŒë¡ ì ê±°í ë ì¬ì©.
- ìí°í°ì êŽë šë ë°ìŽí°ê° ë ìŽì íì ìì ë ì¬ì©.
ðšNOTE
ì€ìì ìíì í¹ì§
- ê±°ì ë¹ìì ìíì ê°ê¹ë€.
- ììì± ì»ší ì€ížê° êŽëЬíì§ ììŒë¯ë¡ 1ì°š ìºì, ì°êž° ì§ì°, ë³ê²œ ê°ì§, ì§ì° ë¡ë©ì í¬íší ììì± ì»ší ì€ížê° ì ê³µíë ìŽë í êž°ë¥ë ëìíì§ ìëë€.
- ìë³ì ê°ì ê°ì§ê³ ìë€.
- ë¹ìì ìíë ìë³ì ê°ìŽ ìì ìë ìì§ë§ ì€ìì ìíë ìŽë¯ž í ë² ìì ìíììŒë¯ë¡ ë°ëì ìë³ì ê°ì ê°ì§ê³ ìë€.
- ì§ì° ë¡ë©ì í ì ìë€.
ð§ ì€ìì ìíê° ì íìí ê¹?
- ì±ë¥ ìµì í
ìì ìíì ìí°í°ë ììì± ì»ší ì€ížìì êŽëЬëë©°, 1ì°š ìºìì ì ì¥ëë€.
íì§ë§ ëê·ëªš ë°ìŽí°ë¥Œ ë€ë£° 겜ì°, 몚ë ìí°í°ë¥Œ ìì ìíë¡ ì ì§í멎 ë©ëªšëЬ ë¶ëŽìŽ ì»€ì§ ì ìë€.
ë°ëŒì ë¶íìíê² êŽëЬí íìê° ìë ìí°í°ë¥Œ ì€ìì ìíë¡ ì ííì¬ ë©ëªšëЬ ì¬ì©ëì ì€ìŒ ì ìë€. - ë°ìŽí°ì ë¬Žê²°ì± ë³Žíž
ë¶ì° ìì€í ìŽë ë¹ëêž° ì²ëЬ í겜ììë ížëìì ë²ì륌 ëìŽì ìí°í°ë¥Œ ì¬ì©í íìê° ìë€.
ìŽ ê²œì°, ìì ìíìì êŽëЬëì§ ìë ì€ìì ìíë¡ ìí°í°ë¥Œ ì ì§íšìŒë¡ìš ë°ìŽí° 묎결ì±ì 볎íží ì ìë€,
ëí, ë°ìŽí°ë² ìŽì€ì ë°ìíì§ ìê³ ìí°í°ë¥Œ ëšìí ì¡°ííê±°ë ì ì§íê³ ì¶ì 겜ì°, ìí°í°ë¥Œ ì€ìì ìíë¡ ì ííì¬ ë°ìŽí°ë² ìŽì€ìì ëêž°í륌 ë§ì ì ìë€.
ì€ìì ìíë ë°ìŽí°ì ìëª ì£Œêž°ë¥Œ ì ì°íê² êŽëЬíê³ , ì±ë¥ì ìµì ííë©°, ë°ìŽí° ë³ê²œì ëª ìì ìŒë¡ ì ìŽí ì ìê² ëìì€ë€. ë ëìê° ë¶ì° í겜, ë¹ëêž° ì²ëЬ, ì¬ì©ì ì ë ¥ ë°ìŽí° ë³í© ë± ë€ìí ìí©ìì íì©ëë©°, JPAì ë°ìŽí° êŽëЬ ì± ìì íšê³Œì ìŒë¡ ë¶ëЬíë ë° êž°ì¬íë€.
ð merge() : ë³í©
ì€ìì ìíì ìí°í°ë¥Œ ë€ì ìì ìíë¡ ë³ê²œíë €ë©Ž ë³í©ì ì¬ì©í멎 ëë€.
- ë°íê°ì íì ìë¡ìŽ ìì ìíì ìí°í°ìŽë€.
- Ʞ졎 ì€ìì ìí°í°ë ì¬ì í ì€ìì ìíë¡ ëšì ìë€.
- ë³í©ë ìí°í°ë ììì± ì»ší ì€ížê° êŽëЬíë¯ë¡ ìì íê² ì¬ì© ê°ë¥íë€
1. ì€ìì ë³í©
// ì€ìì ìí°í° ìì±
Member member = new Member();
member.setId("memberA");
member.setUsername("íì1");
// ë³í© ìí
EntityManager em2 = emf.createEntityManager();
EntityTransaction tx2 = em2.getTransaction();
tx2.begin();
// ì€ìì ë³í©
Member mergeMember = em2.merge(member);
// ë³í©ë ìí°í°ì ë³ê²œ ëŽì© ë°ì
mergeMember.setUsername("íìëª
ë³ê²œ");
tx2.commit();
- ì€ìì ìí°í°ë¥Œ merge() ë©ìëì ì ë¬
º ì€ìì ìíì ìí°í°(member)륌 merge(member) ë©ìëì ëꞎë€.
º merge()ë ììì± ì»ší ì€ížê° íŽë¹ ìí°í°ë¥Œ ë€ì êŽëЬí ì ìëë¡ ìì ì ììíë€. - 1ì°š ìºììì ìí°í° ì°Ÿêž°
º ììì± ì»ší ì€íž(EntityManager)ë merge(member) ížì¶ ì 뚌ì 1ì°š ìºììì ëìŒí ìë³ì륌 ê°ì§ ìí°í°ë¥Œ ì°Ÿëë€.
º 1ì°š ìºìì ìí°í°ê° ììŒë©Ž ë°ìŽí°ë² ìŽì€(DB)ìì ìí°í°ë¥Œ ì¡°ííë€. - ë³í©(ê° ì±ì°êž°)
º DBë 1ì°š ìºììì ì¡°íí ìì ìí ìí°í°ì ì€ìì ìí°í°(member)ì ê°ì ë³µì¬íë€.
(ë³í©ë ìí°í°ë Ʞ졎 ì€ìì ìí°í°ì ë³ê°ì ìë¡ìŽ ìžì€íŽì€ìŽë€.) - ë³í©ë ìí°í° ë°í
º ë³í© ìì ìŽ ìë£ë멎 ë³í©ë ìì ìíì ìí°í°(mergeMember)륌 ë°ííë€.
º ìŽ ë°íë ìí°í°ë ììì± ì»ší ì€ížì ìíŽ êŽëЬëë©°, ìŽí ë³ê²œ ì¬íì ížëìì ì»€ë° ì DBì ë°ìëë€.
ðšNOTE
- ë³í© í ë°íë ìí°í°(mergeMember)ë§ ìì ìíìŽë€.
ì€ìì ìí°í°(member)ë ì¬ì í ì€ìì ìíë¡ ëšì ìë€. - ë³í©ë ìí°í°ë Ʞ졎 ì€ìì ìí°í°ì ê°ì ë³µì¬í ì ê°ì²ŽìŽë€.
ë°ëŒì ì€ìì ìí°í°ë¥Œ ê³ì ì°žì¡°í멎 묞ì ê° ë°ìí ì ìë€. - ë³í©ë ìí°í°ë ììì± ì»ší ì€ížê° êŽëЬíë¯ë¡ ìì íê² ì¬ì©í ì ìë€.
2. ë¹ìì ë³í©
ë³í©ì ë¹ìì ìíë ìì ìíë¡ ë§ë€ ì ìë€.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
// ë¹ìì ìíì ìí°í° ìì±
Member member = new Member();
member.setId("memberA");
member.setUsername("íì1");
// ë¹ìì ë³í© ìí
Member newMember = em.merge(member); // ë³í©ë ìì ìí ìí°í° ë°í
tx.commit(); // ížëìì
컀ë°
em.close();
- ë¹ìì ìí°í°ë¥Œ merge() ë©ìëë¡ ì ë¬í멎, ììì± ì»ší ì€ížìì êŽëЬëë ìë¡ìŽ ìì ìí ìí°í°ê° ìì±ëë€.
- ë³í©ë ìí°í°ë ë°ìŽí°ë² ìŽì€ì ì ì¥ëë©°, ë°íë ìí°í°ë§ ììì± ì»ší ì€ížìì êŽëЬëë€.
- ìëì ë¹ìì ìí°í°ë ì¬ì í ììì± ì»ší ì€ížì ì°ê²°ëì§ ìì ìíë¡ ëšì ìë€.
ðšNOTE
- ë³í©ì ì ë¬ë°ì ìí°í°ì ìíì êŽê³ììŽ íì ìì ìíë¡ ì íí ì ìë€.
- ìë¡ìŽ ìí°í° ìì±ìŽ íìí 겜ì°ìë ë³í©ìŽ ìŽë¥Œ ì²ëЬíë€.
- ë³í©ë ìí°í°ë§ ììì± ì»ší ì€ížìì êŽëЬëë©°, Ʞ졎 ë¹ìì/ì€ìì ìí°í°ë ì¬ì í êŽëЬëì§ ìëë€.
âïž ìì
ìí°í°ë¥Œ ììì± ì»ší ì€ížì ë°ìŽí°ë² ìŽì€ìì ìì íë€.
// ê°ì²Žë¥Œ ìì í ìí(ìì )
em.remove(member);
ð¢ REF
<ìë° ORM íì€ JPA íë¡ê·žëë°> - ê¹ìí