๋ฐ˜์‘ํ˜•
JPA (Java Persistence API)

์ž๋ฐ” ์ง„์˜์—์„œ ๋งŒ๋“  ORM ๊ธฐ์ˆ  ํ‘œ์ค€

์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์— ์˜์กดํ•˜๋Š” ๊ฐœ๋ฐœ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด์žˆ๊ธฐ์—, ์ƒ์‚ฐ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ํšจ์œจ์ 
๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• DB์˜ ์ฐจ์ด๋ฅผ ์ค‘๊ฐ„์—์„œ ํ•ด๊ฒฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ต์ฒดํ•˜๋”๋ผ๋„ ์œ ์ง€๋ณด์ˆ˜ ์˜ํ–ฅ๋„๊ฐ€ ํฌ์ง€ ์•Š์Œ.
    → mysql,, oracle ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ฟผ๋ฆฌ ๋ณ€๊ฒฝ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

JPA ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

โ€ฃ ์—”ํ‹ฐํ‹ฐ ์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•˜๋Š” ์„ค๊ณ„ ๋ถ€๋ถ„
โ€ฃ ๋งคํ•‘ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„.

โœข ์—”ํ‹ฐํ‹ฐ ? 
์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋‹จ์œ„์ด๊ธฐ๋„ํ•˜๋ฉฐ
JPA ์—์„œ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์†ํ™” ํ•ด์•ผํ•  ์ž๋ฐ” ๊ฐ์ฒด (๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๋กœ ํ‘œํ˜„)๋ฅผ ๋‚˜ํƒ€๋ƒ„.

 

 

์˜์†์„ฑ ๊ด€๋ฆฌ

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ์ด ๋˜์—ˆ์ง€๋งŒ, ๋ณ„๊ฐœ๋กœ ์œ ์ง€๋˜๋Š” ์ƒํƒœ์˜ ํŠน์ง•์ค‘ ํ•˜๋‚˜.
์ด๋ฅผ ๋ณ„๋„์˜ ๊ธฐ์–ต์žฅ์น˜์— ๋ณด์กด ๋ฐ ๊ด€๋ฆฌํ•˜๋Š”๊ฒƒ.

https://www.youtube.com/watch?v=PMNSeD25Qko&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U&index=6

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋ ๋•Œ ์ปค๋„ฅ์…˜์„ ์–ป์Œ

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");

โ€ฃ JPA ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•จ.
โ€ฃ JPA ๋™์ž‘ ์œ„ํ•ด ๊ธฐ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ปค๋„ฅ์…˜ํ’€์„ ์ƒ์„ฑํ•จ → ๋น„์šฉ์ด ํฌ๋‹ค.
โ€ฃ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋”ฑ ํ•œ๋ฒˆ ์ƒ์„ฑ ํ›„ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

 

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €
EntityManager em = emf.createEntityManager();

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

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ (persistence context)

https://www.youtube.com/watch?v=PMNSeD25Qko&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U&index=6

โ€ฃ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ 
โ€ฃ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ

โ€ฃ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌ (์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ)
โ€ฃ 1์ฐจ์บ์‹œ, ๋™์ผ์„ฑ๋ณด์žฅ(identity), ์“ฐ๊ธฐ์ง€์—ฐ, ๋ณ€๊ฒฝ๊ฐ์ง€(Dirty Checking), ์ง€์—ฐ๋กœ๋”ฉ(Lazy Loading) ๋จ

โœข 1์ฐจ ์บ์‹œ ? 
์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ. 
์˜์†์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ชจ๋‘ ์ด๊ณณ์— ์ €์žฅ๋จ.
Map ํ˜•ํƒœ์ด๊ณ  [key: @Id๋กœ ๋งคํ•‘ํ•œ ์‹๋ณ„์ž, value: ์—”ํ‹ฐํ‹ฐ ์ธ์Šคํ„ด์Šค] ์ด๋‹ค

 

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

https://www.youtube.com/watch?v=PMNSeD25Qko&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U&index=6

โ€ฃ ๋น„์˜์† (new/transient): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ƒํƒœ
    → ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•˜์ง€ ์•Š์€ ์ƒํƒœ.
    → ๊ฐ์ฒด๋งŒ ์ƒ์„ฑํ•œ ์ƒํƒœ 
โ€ฃ ์˜์† (managed): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ (์˜์†์ƒํƒœ)
โ€ฃ ์ค€์˜์† (detached): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ 
   → ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
   → 1์ฐจ ์บ์‹œ์—์„œ ์‚ฌ๋ผ์ง..
   → ์ง€์—ฐ๋กœ๋”ฉ(LAZY LOADING) ํ•  ์ˆ˜ ์—†๋‹ค.
   → ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
   → ์‹๋ณ„์ž๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ฑฐ์˜ ๋น„์˜์† ์ƒํƒœ์ž„.
   → ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“œ๋ ค๋ฉด merge() ํ•˜๋ฉด ๋จ. (์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ›์•„ ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ฌ)
โ€ฃ ์‚ญ์ œ (removed): ์‚ญ์ œ 

 

์—”ํ‹ฐํ‹ฐ ์ €์žฅ (insert)

์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ ์ƒํƒœ, ์•„์ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ €์žฅํ•˜์ง€ ์•Š์€ ์ƒํƒœ.

 

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ

โ€ฃ ์“ฐ๊ธฐ์ง€์—ฐ(transactional write-behind)
    → ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์ง์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ ,
        ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— INSERT ์ฟผ๋ฆฌ๋ฅผ ๋ชจ์•„๋‘๊ณ  ์ปค๋ฐ‹์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋‚ด๋Š” ์ƒํƒœ (๋ณด๋‚ด๋Š” ์ž‘์—…=flush)

 

์—”ํ‹ฐํ‹ฐ ์กฐํšŒ (read)

1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒํ•œ ์ƒํƒœ

โ€ฃ ๋™์ผ์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค!

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ ์ƒํƒœ

 

๋ณ€๊ฒฝ ๊ฐ์ง€ (dirty checking) - ์ˆ˜์ •

โ€ฃ ์—”ํ‹ฐํ‹ฐ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ๊ธฐ๋Šฅ
โ€ฃ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ณ€๊ฒฝ๋ถ€๋ถ„ ํŒŒ์•… ํ›„ ์—…๋ฐ์ดํŠธ
โ€ฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ์—๋งŒ ์ ์šฉ
โ˜ž ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ด€๋ จ ์ƒํ™ฉ (๋งํฌ)

๋ณ€๊ฒฝ๊ฐ์ง€ ์ฒ˜๋ฆฌ์ƒํƒœ 

 

ํ”Œ๋Ÿฌ์‹œ (flush)

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

 

 


์ฐธ๊ณ 

- ์ฑ…: http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330 

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ต๋ณด๋ฌธ๊ณ 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” ์ „์ž์ •๋ถ€ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋ ˆ์ž„ | โ˜… ์ด ์ฑ…์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ โ˜…โ–  JPA ๊ธฐ์ดˆ ์ด๋ก ๊ณผ ํ•ต์‹ฌ ์›๋ฆฌโ–  JPA๋กœ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ์ œ ์ค‘์‹ฌ์œผ๋กœ

www.kyobobook.co.kr

- ๋งํฌ: https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%84%B1

- ๋งํฌ: https://www.baeldung.com/jpa-entities

 

์ง€์†์„ฑ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

 

ko.wikipedia.org

- ๋งํฌ: https://cupping.tistory.com/2

 

Programming language png Logo (transparent)

Jpa logo.png MariaDB logo.png ECMA6 logo.png python logo.png elasticSearch logo.png gradle logo.png node.js logo.png

cupping.tistory.com

- ๋งํฌ: https://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_overview_emfactory_perscontext.html

 

3.  Persistence Context

Example 7.1.  Behavior of Transaction Persistence Context The following code illustrates the behavior of entites under an EntityManager using a transaction persistence context. EntityManager em; // injected ... // outside a transaction: // each operation

openjpa.apache.org

- ๋งํฌ: https://www.baeldung.com/jpa-hibernate-persistence-context

- ๊ฐ•์˜: https://www.youtube.com/playlist?list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U 

 

ํ† ํฌON 41์ฐจ. JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ๊ธฐ ๋‹ค์ง€๊ธฐ | T์•„์นด๋ฐ๋ฏธ

T์•„์นด๋ฐ๋ฏธ ์˜จ๋ผ์ธ ๊ฐ•์˜- [ํ† ํฌON์„ธ๋ฏธ๋‚˜] JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ๊ธฐ ๋‹ค์ง€๊ธฐ (์ด8๊ฐ•) https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=149 [๊ณผ์ • ์†Œ๊ฐœ] ๋งˆํ” ํ•œ๋ฒˆ์งธ ์„ธ๋ฏธ๋‚˜ ์ฃผ์ œ๋Š” ‘JPA(Java...

www.youtube.com

 

๋ฐ˜์‘ํ˜•

+ Recent posts