[Spring] JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ƒ๋ช…์ฃผ๊ธฐ

๋ฐ˜์‘ํ˜•

Spring Framework๋ฅผ ์ด์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” DB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ DB Connection์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปค๋„ฅ์…˜์ด ์—ฐ๊ฒฐํ•˜๊ณ  ๋Š์–ด์ง€๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Connection Pool(DBCP, HikariCP), ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ CRUD๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ORM์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JPA๋Š” ์—ฌ๊ธฐ์„œ Java ์–ธ์–ด์˜ ํ‘œ์ค€ ORM์— ์†ํ•ฉ๋‹ˆ๋‹ค. Spring boot๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์š”์ฆ˜์—๋Š” Spring ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งž์ถฐ์ ธ ์žˆ๋Š” Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”. ๊ทธ๋Ÿฐ๋ฐ, Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐ์ฒด์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ์Šค์Šค๋กœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€ํ•˜๊ณ , ์ƒ์„ฑ, ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, ๋„๋Œ€์ฒด ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธธ๋ž˜ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ผ๊นŒ์š”? 

์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” ์ด๋Ÿฌํ•œ ์žฌ๋ฐŒ๋Š” ๊ถ๊ธˆ์ฆ์„ ์ดˆ๋ฐ˜๋ถ€๋กœ ์‹œ์ž‘ํ•˜์—ฌ, JPA์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

2020/05/23 - [Programming/Spring] - [Spring boot] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ  Spring Data JPA

 

[Spring boot] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ  Spring Data JPA

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ค„ ๋ณธ JDBC์™€ Spring JDBC๋Š” ์ž๋ฐ”์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ดˆ ์ธํ„ฐํŽ˜์ด์Šค์˜€๊ณ , ์ด๋“ค ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์ž‘์—…๋“ค, ์—ฐ๊ฒฐ ์„ธ์…˜, ๊ทธ๋ฆฌ๊ณ  ๊ด€์‹ฌ์ ์˜ ๋ถ„๋ฆฌ ๋“ฑ ๏ฟฝ

blog.neonkid.xyz

ํ˜น์‹œ JPA๋‚˜ Spring Data JPA, Hibernate๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด, ์œ„์˜ ๊ธ€์„ ์ฝ์–ด๋ณด์‹  ํ›„, ์ง„ํ–‰ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

 

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

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€, Entity๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. Spring์œผ๋กœ ํ•œ ๋ฒˆ ์ฏค JDBC๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•ด๋ณด์‹  ๋ถ„๋“ค์ด ๊ณ„์‹ ๋‹ค๋ฉด DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ์ฝํžˆ๊ณ  ์“ฐ๋Š” ๊ฑด์ง€๋ฅผ ์ดํ•ดํ•˜์‹ค ๊ฒ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

* ์ปค๋„ฅ์…˜ ์ƒ์„ฑ -> ์ปค๋„ฅ์…˜ ์—ฐ๊ฒฐ -> Statement ์ƒ์„ฑ -> Statement ์‹คํ–‰ -> Transcation ์ปค๋ฐ‹ -> ์ปค๋„ฅ์…˜ ์—ฐ๊ฒฐ ๋Š๊ธฐ

๊ทธ๋ ‡๋‹ค๋ฉด ORM์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ์š”? SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด, ๋จผ์ € ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ๋‹ค์Œ DB ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” DB ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๊ธฐ ์ด์ „, ๊ฐ์ฒด๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„ ์ฆ‰, ๊ทธ ์ดํ›„์˜ ๋‹จ๊ณ„ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์ ์ธ ๊ฐœ๋…์— ์†ํ•˜๋ฉฐ Spring์—์„œ๋Š” EntityManager๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” Java์—์„œ ๋ญ˜ ์‚ฌ์šฉํ•˜๋ƒ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. J2SE์˜ ๊ฒฝ์šฐ EntityManager์™€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ 1:1 ๊ด€๊ณ„๋ฅผ ๊ฐ–์ง€๋งŒ, Spring๊ณผ ๊ฐ™์€ J2EE์˜ ๊ฒฝ์šฐ ๊ฐ™์€ ํŠธ๋ Œ์žญ์…˜ ๋ฒ”์œ„์— ์žˆ๋Š” EntityManager๋Š” ๋™์ผํ•œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

์ฆ‰, Spring์˜ IoC ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋Šฅ์ธ ์˜์กด์„ฑ ์ฃผ์ž…์ฒ˜๋Ÿผ ์žฌํ™œ์šฉํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ธ ๊ฒƒ์ด์ฃ .

 

 

Entity์˜ Lifecycle

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ Entity๋“ค์ด ์–ด๋–จ ๋•Œ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ค์–ด๊ฐ€๊ณ , DB์— ๋ฐ˜์˜์ด ๋ ๊นŒ์š”? ๋จผ์ € ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์–ด๋–ค์‹์œผ๋กœ DB์— ๋“ค์–ด๊ฐ€๋Š”์ง€ ์ˆœ์œผ๋กœ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋น„์˜์†(new/transient)
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
// ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ๋งŒ ํ•œ ์ƒํƒœ
Cafe cafe = new Cafe();
cafe.setName("Americano");
cafe.setPrice(3000);

์ด ๋•Œ๋Š” DB์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ ์ƒํƒœ๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์˜์† (managed)
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ
    • Entity๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์ง€๋งŒ DB์—๋Š” ์—ญ์‹œ ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†์Œ
    • ์ปจํ…์ŠคํŠธ์— ๋ฏธ๋ฆฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ DB ํ˜•ํƒœ๋กœ ์ €์žฅ
    • Transaction๊ณผ ๊ด€๋ จ๋œ commit ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ DB์— ์ ์šฉ
// ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ๋งŒ ํ•œ ์ƒํƒœ
Cafe cafe = new Cafe();
cafe.setName("Americano");
cafe.setPrice(3000);

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

// ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ ์ƒํƒœ
em.persist(cafe);

JPA์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. DB์—์„œ ๋ฐ˜๋Œ€๋กœ ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ์บ์‹œ์— ์ €์žฅ๋˜๋ฉฐ ์ฐจํ›„ ๋‹ค์‹œ ํ˜ธ์ถœ๋  ๋•Œ 1์ฐจ ์บ์‹œ์— ์ด๋ฏธ ๋ถˆ๋Ÿฌ์™”๋˜ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด, ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ DB์— ์ €์žฅํ•  ๋•Œ ์—ญ์‹œ ์ปค๋ฐ‹ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ทธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ ๋งŒ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • ์ค€์˜์† (detached)
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ
// ์นดํŽ˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌ, ์ค€์˜์† ์ƒํƒœ
em.detach(cafe);

๋” ์ด์ƒ ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์„ ๊ฒฝ์šฐ์—๋Š” EntityManager์—์„œ ์ค€์˜์† ์ƒํƒœ๋กœ ๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ญ์ œ (Removed)
    • DB์—์„œ ์‚ญ์ œ๋œ ์ƒํƒœ
// ๊ฐ์ฒด๋ฅผ ์‚ญ์ œ
em.remove(cafe);

์‚ญ์ œ๋Š” DB์—์„œ๋„ ๋ฐ˜์˜์ด ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  remove ์ดํ›„์— ๋‹ค์‹œ ์˜์† ํ›„, commit์„ ์˜ฌ๋ฆฌ๋ฉด ๊ทธ ์ •๋ณด๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค๋งŒ ์ค€์˜์†์ด๋ž‘ ๊ด€๊ณ„ ์—†์ด ์‚ญ์ œ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด DB์— ๋ฐ˜์˜๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋งˆ์น˜๋ฉฐ...

์—ฌ๊ธฐ๊นŒ์ง€ JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. JPA๊ฐ€ ํ‘œ์ค€ ORM์œผ๋กœ์จ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ†ตํ•ด DB ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ๋„ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋ฐœ์ž๋กœ์จ ์•Œ์•„์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๊ตฌ์กฐ์™€ ์ด์ ์— ๋Œ€ํ•ด ์ข€ ๋” ์‹ฌ์ธต์ ์œผ๋กœ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ : https://www.slideshare.net/zipkyh/ksug2015-jpa3-jpa

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments