HyeLog

[๊น€์˜ํ•œ_์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 2. ์˜์†์„ฑ ๊ด€๋ฆฌ ๋ณธ๋ฌธ

์›น ๊ฐœ๋ฐœ/Spring Boot

[๊น€์˜ํ•œ_์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 2. ์˜์†์„ฑ ๊ด€๋ฆฌ

shj718 2022. 6. 8. 17:29

๐ŸŒฟ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€?

- ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€ Entity๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์ด๋‹ค. EntityManager๋ฅผ ํ†ตํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•œ๋‹ค.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋ผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

EntityManager.persist(entity);

- Entity๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ๋ฅผ ์˜์†์ด๋ผ๊ณ  ํ•˜๊ณ , ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋น„์˜์†์ด๋ผ๊ณ  ํ•œ๋‹ค.

persist()๋ฅผ ํ•˜๋ฉด, ์˜์† ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์ฆ‰, persist()๋Š” ์‚ฌ์‹ค ์—”ํ‹ฐํ‹ฐ๋ฅผ DB์— ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋„ฃ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‹ค์ œ๋กœ DB์— ์ €์žฅ๋˜๋Š” ์‹œ์ ์€ ํŠธ๋žœ์žญ์…˜์ด commit() ๋  ๋•Œ์ด๋‹ค.

 

๐ŸŒฟ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์ 

- 1์ฐจ ์บ์‹œ (ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ)

Ex 1)

Member member = new Member();
member.setId(103L);
member.setName("HelloJPA");
entityManager.persist(member);
            
Member findMember3 = entityManager.find(Member.class, 103L);

์ด๋ ‡๊ฒŒ persist()๋ฅผ ํ•˜๋ฉด, 1์ฐจ ์บ์‹œ์— ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ find()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, DB์— SELECT ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ์ง€ ์•Š๊ณ , 1์ฐจ ์บ์‹œ์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ์•„์˜จ๋‹ค.

 

Ex 2)

Member findMember1 = entityManager.find(Member.class, 101L);
Member findMember2 = entityManager.find(Member.class, 101L);

์ด๋ ‡๊ฒŒ ์—ฐ์†์ ์œผ๋กœ find()๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ฒซ๋ฒˆ์งธ find()์—์„œ๋Š” DB์— SELECT ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ์ง€๋งŒ, ๋‘๋ฒˆ์งธ find()์—์„œ๋Š” DB์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ , 1์ฐจ ์บ์‹œ์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

- ์˜์† Entity์˜ ๋™์ผ์„ฑ ๋ณด์žฅ

Member a = em.find(Member.class, 100L); 
Member b = em.find(Member.class, 100L);
System.out.println(a == b); //๋™์ผ์„ฑ ๋น„๊ต true

 

- ์“ฐ๊ธฐ ์ง€์—ฐ

persist()๋ฅผ ํ•˜๋ฉด 1์ฐจ ์บ์‹œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์—๋„ ํ•ด๋‹น INSERT๋ฌธ์ด ์ €์žฅ๋œ๋‹ค.

์ €์žฅ๋œ INSERT๋ฌธ๋“ค์€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ํ•  ๋•Œ DB์— ์‹คํ–‰๋œ๋‹ค.

em.persist(memberA);
em.persist(memberB);
//์—ฌ๊ธฐ๊นŒ์ง€ INSERT SQL์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค.
//์ปค๋ฐ‹ํ•˜๋Š” ์ˆœ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— INSERT SQL์„ ๋ณด๋‚ธ๋‹ค.
transaction.commit();

 

- ๋ณ€๊ฒฝ ๊ฐ์ง€

์ €๋ฒˆ ๊ธ€์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Entity์˜ ์†์„ฑ(Ex. name)์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๋•Œ set()๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (= persistํ•  ํ•„์š” X)

์ด๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ DB์— commit()ํ•˜๊ธฐ ์ „์—, 1์ฐจ ์บ์‹œ์— ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ์ฒ˜์Œ ์ƒํƒœ(findํ•  ๋‹น์‹œ์˜ ์ƒํƒœ)์™€ ๋งˆ์ง€๋ง‰ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Member findMember = entityManager.find(Member.class, 160L);
findMember.setName("Changed");

 

- Entity ์‚ญ์ œ

Member findMember = entityManager.find(Member.class, 160L);
entityManager.remove(findMember);

 

๐ŸŒฟ ํ”Œ๋Ÿฌ์‹œ(Flush)๋ž€?

ํ”Œ๋Ÿฌ์‹œ๋ž€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ DB์— ์‹ค์ œ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŠธ๋žœ์žญ์…˜ commit()์€ ์ž๋™์œผ๋กœ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. JPQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋„ ํ”Œ๋Ÿฌ์‹œ๋Š” ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ์ง์ ‘ em.flush()๋กœ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ”Œ๋Ÿฌ์‹œ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋น„์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ DB์— ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.