๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒพBackEnd/๐ŸŒฑ Spring

JPA ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ

by MuGeon Kim 2023. 2. 4.
๋ฐ˜์‘ํ˜•

EntityManager Factory

EMF๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด Entity Manager๋ฅผ ์ƒ์„ฑ์„ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ดํ›„ EM์ด ์ปค๋„ฅ์…˜ํ’€์„ ์ด์šฉํ•˜์—ฌ DB์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค.

 

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ( ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ)

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด์— ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฐ€์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

์—”ํ‹ฐํ‹ฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ

  1. ๋น„์˜์†
    1. ์˜์†์„ฑ ์ปจํ…Œ์ŠคํŠธ์™€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ
    Member m = new Member();
    member.setId("1");
    

 

  1. ์˜์†
    1. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
    2. Entity Manager์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ Entity๊ฐ€ ๊ด€๋ฆฌ๊ฐ€ ๋œ๋‹ค.
    Member member = new Member();
    member.setUserName("๊น€๋ฌด๊ฑด");
    member.setAge(10);
    em.persist(member);
    

 

  1. ์ค€์˜์†
    1. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถˆ๋ฆฌ๋œ ์ƒํƒœ
    2. em.detach(member)
    3. ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌ → ์ค€์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.

 

  1. ์‚ญ์ œ
    1. ์‚ญ์ œ๋œ ์ƒํƒœ
    2. em.remove(member) → ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•œ ์ƒํƒœ

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์žฅ์ 

 

[1] - 1์ฐจ ์บ์‹œ ์‚ฌ์šฉ

๋”๋ณด๊ธฐ
  1. ์กฐํšŒ ์‹œ ์ฒ˜์Œ 1์ฐจ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ํƒ์ƒ‰ → DB์— ์ฒ˜๋ฆฌ ํ•„์š”์—†์ด ๋ฐ”๋กœ ๋ฆฌํ„ด
  2. ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ 1์ฐจ ์บ์‹œ์— ์—†๋‹ค๋ฉด ? → DB์— ์ ‘๊ทผํ•ด ๊ฐ’์„ ํƒ์ƒ‰
  3. DB์— ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.
  4. 1์ฐจ ์บ์‹œ์—์„œ ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์–ป๋Š”๋‹ค.

1์ฐจ ์บ์‹œ๋Š” EntityManager์˜ ํŠธ๋žœ์žญ์…˜์˜ ๋‹จ์œ„์—ฌ์„œ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๋ฉด 1์ฐจ ์บ์‹œ์— ์‚ญ์ œ

  • ์œ„์— ๋”ฐ๋ฅธ ํŠน์ง•์œผ๋กœ ์งง์€ ์‹œ๊ฐ„์—๋งŒ ์žฅ์ ์ด ์žˆ๋‹ค.
  • 1์ฐจ ์บ์‹œ๋ž€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์ €์žฅ์†Œ
Member member = new Member();
member.setId("1");
member.setUserName("๊น€๋ฌด๊ฑด");
member.setAge(10);
em.persist(member);//์˜์† -> 1์ฐจ ์บ์‹œ์— ์ €์žฅ

//1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒ
Member member1 = em.find(Member.class, "1");

 

[2] - ๋™์ผ์„ฑ ๋ณด์žฅ

๋”๋ณด๊ธฐ
Member member1 = em.find(Member.class, "1");
Member member2 = em.find(Member.class, "1");
  • ์œ„์— ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋™์ผ์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์‰ฝ๋‹ค. 
  1. member1์—์„œ 1์ฐจ ์บ์‹œ์— ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— DB์— Select ์ฟผ๋ฆฌ๊ฐ€ ๋‚ ๋ผ๊ฐ„๋‹ค.
  2. ์ดํ›„์— 1์ฐจ ์บ์‹œ์— {”member”,”1”}์ด ์ €์žฅ์ด ๋œ๋‹ค.
  3. member2๋Š” 1์ฐจ ์บ์‹œ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. → DB์— ์กฐํšŒ X → SELECT ์ฟผ๋ฆฌ๊ฐ€ ์—†์Œ

 

 

 

[3] - ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ

๋”๋ณด๊ธฐ
tx.begin(); -> [ํŠธ๋žœ์žญ์…˜]์˜ ์‹œ์ž‘
Member member = new Member();
Member member2 = new Member();
em.persist(member);
em.persist(member2);
tx.commit(); -> ์ปค๋ฐ‹ํ•˜๋Š” ์ˆœ๊ฐ„ DB์— INSERT SQL์„ ๋ณด๋‚ธ๋‹ค.
  • ์˜์†(Persist)๋ฅผ ํ•˜๋ฉด ๋ฐ”๋กœ DB์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
  • ์ดํ›„ Commit์„ ํ•˜๊ฒŒ ๋˜๋ฉด Insert SQL ์ฟผ๋ฆฌ๊ฐ€ ๋‚ ๋ผ๊ฐ„๋‹ค.
  • tx.begin(); -> [ํŠธ๋žœ์žญ์…˜]์˜ ์‹œ์ž‘ Member member = new Member(); Member member2 = new Member(); em.persist(member); em.persist(member2); tx.commit(); -> ์ปค๋ฐ‹ํ•˜๋Š” ์ˆœ๊ฐ„ DB์— INSERT SQL์„ ๋ณด๋‚ธ๋‹ค.

 

[๋‚ด๋ถ€์ ์ธ ๋™์ž‘]

[1] Persist

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ
  1. ์˜์†ํ™”๋ฅผ ํ•˜๋ฉด (1) 1์ฐจ ์บ์‹œ์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  2. (2) JPA๋Š” Entity๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  3. (3) ์ž‘์„ฑ๋œ ์ฟผ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์— ๊ด€๋ฆฌํ•œ๋‹ค.

[2] Commit

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ
  1. commit()์ด ์‹คํ–‰์ด ๋˜๋ฉด
  2. ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ์žˆ๋˜ ์ฟผ๋ฆฌ๋Š” Flush()๊ฐ€ ๋˜๋ฉด์„œ ์ฟผ๋ฆฌ๊ฐ€ ๋‚ ๋ผ๊ฐ„๋‹ค.
  3. ์ดํ›„ DB์— Commit()์ด ๋œ๋‹ค.[1] Persist
    1. ์˜์†ํ™”๋ฅผ ํ•˜๋ฉด (1) 1์ฐจ ์บ์‹œ์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    2. (2) JPA๋Š” Entity๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
    3. (3) ์ž‘์„ฑ๋œ ์ฟผ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์— ๊ด€๋ฆฌํ•œ๋‹ค.
    [2] Commit
    1. commit()์ด ์‹คํ–‰์ด ๋˜๋ฉด
    2. ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ์žˆ๋˜ ์ฟผ๋ฆฌ๋Š” Flush()๊ฐ€ ๋˜๋ฉด์„œ ์ฟผ๋ฆฌ๊ฐ€ ๋‚ ๋ผ๊ฐ„๋‹ค.
    3. ์ดํ›„ DB์— Commit()์ด ๋œ๋‹ค.

 

 

[4] - ๋ณ€๊ฒฝ ํƒ์ง€ (Dirty Checking)

๋”๋ณด๊ธฐ

DB์— ๊น€๋ฌด๊ฑด ์ด๋ผ๋Š” ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ณด์ž

 ๐Ÿ’ก ๋งŒ์•ฝ์— ์ด ๊น€๋ฌด๊ฑด → ํ™๊ธธ๋™ ์œผ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ๋˜๋‚˜??
Member member = em.find(Member.class, 1L);
member.setUserName("ํ™๊ธธ๋™");
tx.commit();

์ด๋ ‡๊ฒŒ ๊ฐ’์„ ๋ณ€๊ฒฝ์„ ํ•˜๋ฉด commit์ด ๋˜๋Š” ์ˆœ๊ฐ„์— userName์˜ ๊ฐ’์€ ํ™๊ธธ๋™์œผ๋กœ ๋ณ€ํ™˜์ด ๋œ๋‹ค.

 

Mybatis์˜ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐ์„ ํ•ด๋ณด์ž

๊ธฐ์กด์˜ ๊ฐ’์„ set์„ ํ†ตํ•˜์—ฌ ๋ณ€๊ฒฝ์„ ํ•˜๊ณ  DB์— ์ €์žฅ์„ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด

→ update() ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰์„ ํ•ด์„œ DB์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝ์„ ํ•˜์˜€๋‹ค.

 

ํ•˜์ง€๋งŒ JPA๋Š” ์ด๋Ÿฌํ•œ ๊ณผ์ •์ด ์—†๋‹ค. → ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ
  1. Commit์„ ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ Flush๊ฐ€ ํ˜ธ์ถœ์ด ๋œ๋‹ค.
  2. Flush()๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๊ณ  ์—”ํ‹ฐํ‹ฐ๋ž‘ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•œ๋‹ค.
  3. ๋งŒ์•ฝ์— ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์ด ์Šค๋ƒ…์ƒท์˜ ๊ฐ’๊ณผ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ์“ฐ๊ธฐ ์ง€์—ฐ SQL์— ๋งŒ๋“ ๋‹ค.(UPDATE)
  4. ์ดํ›„ ์ง€์—ฐ ์ €์žฅ์†Œ์— ์žˆ๋Š” ์ฟผ๋ฆฌ๋ฅผ DB์— ๋ฐ˜์˜ํ•˜๊ณ  ์ปค๋ฐ‹์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

[5] - ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)

๋ฐ˜์‘ํ˜•