# [JPA] ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์—”ํ‹ฐํ‹ฐ
Study Repository

[JPA] ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์—”ํ‹ฐํ‹ฐ

by rlaehddnd0422

 JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํฌ๊ฒŒ ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•˜๋Š” ์„ค๊ณ„ ๋ถ€๋ถ„๊ณผ ๋งคํ•‘ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € EntityManager์™€ EntityManagerFactory์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


EntityManager

๋งคํ•‘ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” EntityManager๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

EntityManager๋Š” ๋ง ๊ทธ๋Œ€๋กœ Entity๋ฅผ ์ €์žฅ, ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒ ํ•˜๋Š” ๋“ฑ ์—”ํ‹ฐํ‹ฐ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ผ๋“ค์„ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

+ ๋‚ด๋ถ€์˜ DataSource๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปค๋„ฅ์…˜์„ ์–ป์–ด DB์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

EntityManagerFactory

EntityManager๋Š” EntityManagerFactory๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด X
  • ๋”ฐ๋ผ์„œ EntityMnager๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์˜ฌ ๋•Œ ๋งˆ๋‹ค EntityManagerFactory๋ฅผ ํ†ตํ•ด์„œ EntityManager ์ƒ์„ฑ 

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

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ณต๊ฐ„์ด ์•„๋‹Œ ๋…ผ๋ฆฌ์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด EntityManager์˜ persist ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ member Entity๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” EntityManager๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , EntityManager๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Entity์˜ ์ƒ๋ช…์ฃผ๊ธฐ

Entity์—๋Š” 4๊ฐ€์ง€ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์—”ํ‹ฐํ‹ฐ 4๊ฐ€์ง€ ์ƒํƒœ

1. ๋น„์˜์† : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ํ•œ ๊ฐ์ฒด ์ƒํƒœ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ DB์™€ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋น„์˜์†

 

2. ์˜์† : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ๋กœ persist(entity)์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์˜์† ์ƒํƒœ์ธ ์—”ํ‹ฐํ‹ฐ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์˜์†

3. ์ค€์˜์† : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ค€์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ค๋ ค๋ฉด em.detach(entity) ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ em.close()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹ซ๊ฑฐ๋‚˜, em.clear()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ค€์˜์† ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

4. ์‚ญ์ œ : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ญ์ œ๋œ ์ƒํƒœ๋กœ em.remove(entity)์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.


์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ํŠน์ง•

1. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋Š” ์‹๋ณ„์ž ๊ฐ’(@Id๋กœ ํ…Œ์ด๋ธ”์˜ PK์™€ ๋งคํ•‘ํ•œ ๊ฐ’)์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋–„๋ฌธ์— ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์‹๋ณ„์ž ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹๋ณ„์ž ๊ฐ’์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.  

 

2. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€๋œ ์—”ํ‹ฐํ‹ฐ(์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ)๋ฅผ ์ €์žฅ ์‹œ(em.persist()) ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜์–ด์•ผ DB์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.  


์—”ํ‹ฐํ‹ฐ CRUD๋ฅผ ํ†ตํ•œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์žฅ์  ์‚ดํŽด๋ณด๊ธฐ

1. ์กฐํšŒ em.find() : ์„ฑ๋Šฅ ํ–ฅ์ƒ by 1์ฐจ ์บ์‹œ (CRUD) 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋‚ด๋ถ€์— ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์†์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ชจ๋‘ ์บ์‹œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. (์บ์‹œ๋Š” Map<@Id, Entity>๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ)

EntityManager๋ฅผ ํ†ตํ•ด persist ๋ฉ”์†Œ๋“œ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ณด๊ด€๋จ๊ณผ ๋™์‹œ์— 1์ฐจ ์บ์‹œ์— ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

์ด ์ƒํƒœ์—์„œ ์ €์žฅํ•œ ์—”ํ‹ฐํ‹ฐ member๋ฅผ ์กฐํšŒํ•˜๋ ค๊ณ  ํ•  ๋•Œ, JPA๋Š” ์šฐ์„ ์ ์œผ๋กœ 1์ฐจ์บ์‹œ์—์„œ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์กฐํšŒํ•˜๊ณ , ๋งŒ์•ฝ 1์ฐจ ์บ์‹œ์— ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ DB์—์„œ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. DB์— ์šฐ์„ ์ ์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋จผ์ € ์บ์‹œ๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ ์ƒ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ์กฐํšŒ em.find() : ๋™์ผ์„ฑ ๋ณด์žฅ by 1์ฐจ ์บ์‹œ (CRUD)

Member a = em.find(Member.class,"1L");
Member b = em.find(Member.class,"1L");

์—ฌ๊ธฐ์„œ a==b๋Š” ์ฐธ์ผ๊นŒ์š”? ๊ฑฐ์ง“์ผ๊นŒ์š”?

๋‹ต์€ ์ฐธ์ž…๋‹ˆ๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” em.find()๋ฅผ  ๋ฐ˜๋ณต ํ˜ธ์ถœํ•ด๋„ 1์ฐจ ์บ์‹œ์—์„œ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹๋ณ„์ž @Id๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์„ฑ๋Šฅ์ƒ ์ด์ ๊ณผ ์—”ํ‹ฐํ‹ฐ์˜ ๋™์ผ์„ฑ(๊ฐ™์€ ์ธ์Šคํ„ด์Šค์ž„)์„ ๋ณด์žฅํ•ด์ค๋‹ˆ๋‹ค.


3. ์ €์žฅ em.persist() : ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ (CRUD)

  • EntityManager๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ง์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— SQL์„ ๋ชจ์•„๋‘ก๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋Š” ์ˆœ๊ฐ„ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— ์ €์žฅ๋œ SQL์„ flush()ํ•˜์—ฌ DB์— ์ „๋‹ฌํ•จ์œผ๋กœ์จ, ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— ์ €์žฅ๋œ SQL์„ DB์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • flush()๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…์œผ๋กœ ์ด๋•Œ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ DB์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • commit()์€ ์ž๋™์œผ๋กœ flush()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ์— ์ „๋‹ฌํ•ด์„œ ์ปค๋ฐ‹ํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์ˆ˜์ • : ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ ๊ฐ์ง€ (CRUD)

SQL์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜์ • ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋Š˜์–ด๋‚˜๋ฉด์„œ ์†์„ฑ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์ˆ˜์ • ์ฟผ๋ฆฌ๋„ ์ ์  ์ปค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ JPA์˜ EntityManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋Š” ๋‹จ์ˆœํžˆ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Member member = em.find(Member.class, "1L");
member.setUsername("hi");
member.setAge(10);

๋ญ”๊ฐ€ ๋ณ„๋„์˜ update ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์—†์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.

 

๋™์ž‘ ๊ณผ์ •์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

  • 1. JPA๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€ํ•  ๋•Œ, ์ตœ์ดˆ ์ƒํƒœ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ €์žฅํ•ด๋‘ก๋‹ˆ๋‹ค. (์Šค๋ƒ…์ƒท)
  • 2. flush() ์‹œ์  (commit ์‹œ์ )์— ์Šค๋ƒ…์ƒท๊ณผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • 3. ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ˆ˜์ • ์ฟผ๋ฆฌ(Update/set/where)๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ์ด ๋•Œ ๊ธฐ๋ณธ์ „๋žต์€ ์—”ํ‹ฐํ‹ฐ์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. 
  • 4. ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์—”ํ‹ฐํ‹ฐ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝ ๊ฐ์ง€๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
* ๋ณ€๊ฒฝ ๊ฐ์ง€๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ์—๋งŒ ์ ์šฉ

๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ธฐ๋Šฅ ์žฅ์ 

1. ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜์ •์ฟผ๋ฆฌ๊ฐ€ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— ์ˆ˜์ • ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

2. ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด์ „์— ํ•œ ๋ฒˆ ํŒŒ์‹ฑ๋œ ์ฟผ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

๋ฌผ๋ก  ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์ง€ ์•Š๊ณ , org.hibernate.annotations.DynamicUpdate ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ๋™์  Update SQL์„ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์‚ญ์ œ : em.remove() 

์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ์‚ญ์ œ ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Member member = em.find(Member.class, "1L");
em.remove(member);

๋ฌผ๋ก  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ commit() ์„ ํ˜ธ์ถœํ•ด์•ผ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์‚ญ์ œ ์ฟผ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ๋•Œ ์ฐธ๊ณ ๋กœ remove๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ๊ฐ„ member๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • rollback์‹œ์—๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ ๋ณต๊ตฌ๋จ.

ํ”Œ๋Ÿฌ์‹œ 

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

 

ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1. ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ๋™์ž‘ํ•ด์„œ, ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•ด์„œ ์ˆ˜์ •๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ์Œ.

 

2. ์ˆ˜์ •๋œ ์—”ํ‹ฐํ‹ฐ๋Š” ์ˆ˜์ •์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€ SQL ์ €์žฅ์†Œ์— ๋ณด๊ด€.

 

3. ๋‚ด๋ถ€ SQL ์ €์žฅ์†Œ์— ๋“ฑ๋ก๋œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „์†ก(๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ์ฟผ๋ฆฌ)

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š”

  • em.flsuh()๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•
  • commit()์„ ํ†ตํ•ด ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์ž๋™ํ˜ธ์ถœ ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • JPQL ์ฟผ๋ฆฌ ์‹คํ–‰์„ ํ†ตํ•ด ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• 

์ด ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ง์ ‘ em.flush()๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ณดํ†ต commit()์„ ํ†ตํ•ด ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์ž๋™ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

JPQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์™œ ์ž๋™์œผ๋กœ flush()๋ฅผ ํ˜ธ์ถœํ• ๊นŒ์š”?

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

// ์ค‘๊ฐ„์— JPQL ์ฟผ๋ฆฌ ์‹คํ–‰ 
query = em.createQuery("select m from Member m", Member.class);
List<Member> list = query.getResultList();

1. ๋จผ์ € persist๋ฅผ ํ†ตํ•ด memberA, memberB, memberC๋ฅผ ์˜์†์ƒํƒœ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

2. ์ด๋•Œ JPQL์„ ์‹คํ–‰ํ•˜๋ฉด JPQL์€ SQL๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

3. ํ•˜์ง€๋งŒ memberA, memberB, memberC๋Š” ์•„์ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋œ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ ์กฐํšŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4. ๋”ฐ๋ผ์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ง์ „์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ flush()ํ•ด์„œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ JPA๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ  ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ JPQL์„ ์‹คํ–‰ํ•  ๋•Œ๋„ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

์ฃผ์˜ : ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ find() ๋ฉ”์†Œ๋“œ๋Š” ์‹คํ–‰ ์ง์ „ flush()๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ find ๋กœ๋Š” ์กฐํšŒ๋ถˆ๊ฐ€

ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ ์˜ต์…˜ 

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์— ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋ ค๋ฉด javax.persistence.FlushModeType์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

FlushModeType.AUTO : ์ปค๋ฐ‹์ด๋‚˜ ์ฟผ๋ฆฌ(JPQL,SQL)๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ”Œ๋Ÿฌ์‹œ (Default)

FlushModeType.COMMIT : ์ปค๋ฐ‹ํ•  ๋•Œ๋งŒ ํ”Œ๋Ÿฌ์‹œ

COMMIT์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ.


์ค€์˜์† ์ƒํƒœ (์˜์† โžก๏ธ ์ค€์˜์†)

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌ๋œ ๊ฒƒ์„ ์ค€์˜์† ์ƒํƒœ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜์†์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ค€์˜์† ์ƒํƒœ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

  • 1. em.detach(entity) : ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋งŒ ์ค€์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜ 
    • entity๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด entity ๊ด€๋ จ๋œ 1์ฐจ ์บ์‹œ ๋ฐ  ๋‚ด๋ถ€ SQL ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์—์„œ ์‚ญ์ œ๋˜๊ณ  ํ•ด๋‹น entity๋Š” ์ค€์˜์† ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • 2. em.clear() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ 1์ฐจ์บ์‹œ์™€ ๋‚ด๋ถ€ SQL ์ฟผ๋ฆฌ ์ €์žฅ์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ณ  ์ €์žฅ๋˜์–ด ์žˆ๋˜ entity๋“ค์€ ์ค€์˜์† ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • 3. em.close() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…๋ฃŒ
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ 1์ฐจ์บ์‹œ์™€ ๋‚ด๋ถ€ SQL ์ฟผ๋ฆฌ ์ €์žฅ์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ณ  ์ €์žฅ๋˜์–ด ์žˆ๋˜ entity๋“ค์€ ์ค€์˜์† ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    • ์ถ”๊ฐ€์ ์œผ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…๋ฃŒ

์ค€์˜์† ์ƒํƒœ ํŠน์ง•

1. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฑฐ์˜ ๋น„์˜์† ์ƒํƒœ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

2. ๋น„์˜์† ์ƒํƒœ์™€ ๋‹ฌ๋ฆฌ ์‹๋ณ„์ž ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (์˜์† ์ƒํƒœ์ผ ๋•Œ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์‹๋ณ„์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ)

3. ์ง€์—ฐ๋กœ๋”ฉ ๋ถˆ๊ฐ€ : ์ค€์˜์† ์ƒํƒœ์—์„œ๋Š ์‹ค์ œ ๊ฐ์ฒด๋Œ€์‹  ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋กœ๋”ฉํ•ด๋‘๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์ธ ์ง€์—ฐ๋กœ๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์† ์ƒํƒœ๋กœ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?


์ค€์˜์† ์ƒํƒœ (์ค€์˜์† โžก๏ธ ์˜์†)

๋ณ‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ( em.merge() )

merge() ๋ฉ”์†Œ๋“œ๋Š” ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ›์•„์„œ ๊ทธ ์ •๋ณด๋กœ ์ƒˆ๋กœ์šด ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

TestCode

public class MergeMain_115 {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        Member member = new Member();

        // 1. member ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ €์žฅ -> ์ปค๋ฐ‹ํ•จ์œผ๋กœ์จ DB์— ์ˆ˜์ •์‚ฌํ•ญ ๋ฐ˜์˜
        try {
            member.setId(6301L);
            member.setName("๊น€๋™์›…");
            em.persist(member);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            // 1.1 member ์ค€์˜์† ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
            em.close();
        }

        // 2. ์ค€์˜์† ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ˆ˜์ •์‚ฌํ•ญ DB์— ๋ฐ˜์˜ X
        member.setName("๊น€๋™์›…2");

        EntityManager em2 = emf.createEntityManager();
        EntityTransaction tx2 = em2.getTransaction();
        tx2.begin();

        // 3. ์ค€์˜์† ์ƒํƒœ์˜ member ๊ฐ์ฒด -> ์˜์†์ƒํƒœ๋กœ ๋ณ€๊ฒฝ 
        try {
            // merge()ํ•˜์—ฌ ์˜์†์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
            Member mergeMember = em2.merge(member);
            tx2.commit();

            // ์ค€์˜์† ์ƒํƒœ์˜ member
            System.out.println("member = " + member);
            // merge๋กœ ์ธํ•ด ์˜์†์ƒํƒœ๋กœ ๋ฐ”๋€ member
            System.out.println("mergeMember = " + mergeMember);

        } catch (Exception e) {
            tx2.rollback();
        } finally {
            em2.close();
        }
    }
}

1.  member ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  persist๋กœ ์ €์žฅํ•˜์—ฌ ์˜์†์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„ commitํ•จ์œผ๋กœ ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ฟผ๋ฆฌ๋ฅผ DB์— ์ „๋‹ฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

2. 1์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹ซ์Œ์œผ๋กœ์จ ์ค€์˜์† ์ƒํƒœ๋กœ ๋ฐ”๋€ member๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ DB์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

3.. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹ซ์œผ๋ฉด์„œ ์ค€์˜์† ์ƒํƒœ๋กœ ๋ฐ”๋€ member ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด merge() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

em.merge(member) ๋™์ž‘ ๋ฐฉ์‹

โ–ถ๏ธŽ em.merge(member) ์‹คํ–‰

โ–ถ๏ธŽ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž ๊ฐ’์œผ๋กœ 1์ฐจ ์บ์‹œ์—์„œ ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ ( 1์ฐจ ์บ์‹œ์— ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ ์—†์œผ๋ฉด DB์—์„œ ์กฐํšŒํ•˜๊ณ  1์ฐจ ์บ์‹œ์— ์ €์žฅ)

โ–ถ๏ธŽ ์กฐํšŒํ•œ ์˜์† ์—”ํ‹ฐํ‹ฐ์— member ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์„ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค. ( member ์—”ํ‹ฐํ‹ฐ์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ(mergeMember์— ์ฃผ์ž… )

โ–ถ๏ธŽ mergeMember ๋ฆฌํ„ด 

 

merge() ๋ฉ”์†Œ๋“œ๋Š” ์ค€์˜์† ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋น„์˜์†์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋„ ์˜์† ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. 
์‹๋ณ„์ž ๊ฐ’์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ถˆ๋Ÿฌ์„œ ๋ณ‘ํ•ฉํ•˜๊ณ , ์—†์œผ๋ฉด, ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. 

<์ •๋ฆฌ>

  • EntityManager๋Š” EntityManagerFactory์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” Application๊ณผ DB์‚ฌ์ด์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฐ€์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ™์€ ์—ญํ• ๋กœ, ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ App๊ณผ DB์‚ฌ์ด์—์„œ์˜ Entity์˜ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” flush() ์‹œ์ ์— ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์˜ SQL ์ €์žฅ์†Œ๊ฐ€ DB์— ์ „๋‹ฌ๋˜๋ฉด์„œ ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒ, ์ƒ์„ฑ์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹์‹œ์ ์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ flush() ๋ฉ๋‹ˆ๋‹ค.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋Š” ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋กœ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ, ๋ณ€๊ฒฝ ๊ฐ์ง€, ์ง€์—ฐ ๋กœ๋”ฉ, 1์ฐจ ์บ์‹œ, ๋™์ผ์„ฑ ๋ณด์žฅ ๊ฐ™์€ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ค€์˜์†(detach), ๋น„์˜์†(remove) ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

<์ฐธ๊ณ ์ž๋ฃŒ>

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ