[์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA] 6. ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ๋ถ„์„

2022. 10. 3. 12:36ใ†์ธํ”„๋Ÿฐ/์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

728x90

 

1๏ธโƒฃ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ๊ตฌํ˜„์ฒด ๋ถ„์„ 

org.springframework.data.jpa.repository.support.SimpleJpaRepository

-> ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด 

 

SimpleJpaRepository

@Repository

: ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์˜ ๋Œ€์ƒ์ด ๋˜๊ณ , JPA ์˜ˆ์™ธ๋ฅผ ์Šคํ”„๋ง์ด ์ถ”์ƒํ™”ํ•œ ์˜ˆ์™ธ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ๋„ ํ•œ๋‹ค. 

-> ์Šคํ”„๋ง์ด ๊ฐ•์กฐํ•˜๋Š” ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ JPA ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ JDBC ๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ํ•ด๋„ ์˜ˆ์™ธ ๊ฐ™์€๊ฑธ ์Šคํ”„๋ง ๊ด€๋ จ ์˜ˆ์™ธ๋กœ ์•Œ์•„์„œ ๋ณ€ํ™˜ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋กœ์ง์€ ๋™์ผํ•˜๊ฒŒ ๋Œ์•„๊ฐ€๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ๋‹ค.

 

@Transactional

: ํŠธ๋žœ์žญ์…˜ ์ ์šฉ, JPA์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋™์ž‘ 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ๋ณ€๊ฒฝ(๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ) ๋ฉ”์„œ๋“œ๋ฅผ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ 

- ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌํŒŒ์ง€ํ† ๋ฆฌ์—์„œ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ 

- ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด ๋ฆฌํŒŒ์ง€ํ† ๋ฆฌ๋Š” ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์ „ํŒŒ ๋ฐ›์•„์„œ ์‚ฌ์šฉ 

๊ทธ๋ž˜์„œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜ ์—†์–ด๋„ ๋ฐ์ดํ„ฐ ๋“ฑ๋ก, ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ–ˆ์Œ ( ์‚ฌ์‹ค ํŠธ๋žœ์žญ์…˜์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์— ๊ฑธ๋ ค์žˆ๊ธฐ ๋•Œ๋ฌธ) 

 

@Transactional(readonly = true)

: ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ์กฐํšŒ๋งŒ ํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” readOnly = true ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”Œ๋Ÿฌ์‹œ๋ฅผ ์ƒ๋žตํ•ด์„œ ์•ฝ๊ฐ„์˜ ์กฐํšŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ ์ „์ฒด์—๋Š” readOnly = true๋ฅผ ๊ฑธ์–ด์ฃผ๊ณ , ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์—๋Š” @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฑธ์–ด์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์—์„œ๋งŒ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋„๋ก ์„ค์ •ํ•ด์ฃผ๋ฉด ์•ฝ๊ฐ„์˜ ์กฐํšŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. 

(๊ธฐ๋ณธ์ด readOnly = false) 

 

 

save()

- ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฉด ์ €์žฅ -> persist()

- ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ณ‘ํ•ฉ -> merge()

 

โ—๏ธ merge ์‚ฌ์šฉ์€ ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š”๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฐˆ์•„ ๋ผ์šฐ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฑธ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ํฐ์ผ์ด๋‹ค. ์žˆ๋˜ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋’ค์ง‘์–ด ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ!! ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ˆ˜์ •์„ ํ•  ๋•Œ๋Š” ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , merge๋Š” ์˜์† ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ค๋•Œ ~ 

๋ญ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ( merge๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค.) 

 

 

 

 

2๏ธโƒฃ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ• 

 

์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ธฐ๋ณธ ์ „๋žต 

- ์‹๋ณ„์ž๊ฐ€ ๊ฐ์ฒด์ผ ๋•Œ๋Š” Null ๋กœ ํŒ๋‹จ  (ex) Long) 

- ์‹๋ณ„์ž๊ฐ€ ์ž๋ฐ” ๊ธฐ๋ณธ ํƒ€์ž…์ผ ๋•Œ๋Š” 0์œผ๋กœ ํŒ๋‹จ (ex) long -> ๊ธฐ๋ณธ ํƒ€์ž…์€ null ์ด ์•ˆ๋˜๋‹ˆ๊นŒ~) 

- Persistable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ํŒ๋‹จ ๋กœ์ง ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ 

 

Persistable

 

Item

์˜ˆ์ œ๋ฅผ ์œ„ํ•ด์„œ Item ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์ด๋•Œ pk ๊ฐ’์„ Long ์ด ์•„๋‹Œ ์–ด๋–ค ์ด์œ ๋กœ String์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ @GeneratedValue ๋ฅผ ์ƒ๋žตํ•˜๊ณ  ์ง์ ‘ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ id ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

ItemRepositoryTest

๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋กœ save ํ•˜๋Š” ํ…Œ์ŠคํŠธ์ด๋‹ค. 

๊ทผ๋ฐ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฅผ ํŒ๋‹จํ•˜๋Š” ์ „๋žต์œผ๋กœ ์šฐ์„  ๊ฐ์ฒด์˜ ์‹๋ณ„์ž๊ฐ€ null ์ผ๋•Œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ 

์ง€๊ธˆ Item์—๋Š” 'A' ๋กœ ์‹๋ณ„์ž ๊ฐ’์ด ์ฃผ์–ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— jpa๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ํŒ๋‹จ์„ ๋ชปํ•˜๊ณ , merge() ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋ณด๋ฉด 

์šฐ์„  select๋ฅผ ํ•ด์„œ ์‹๋ณ„์ž๊ฐ€ 'A'์ธ item์„ ์šฐ์„  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒ๋ฅผ ํ•˜๊ณ , ์ด๋•Œ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ์ œ์„œ์•ผ insert๋ฅผ ํ•œ๋‹ค๋Š” ์น˜๋ช…์ ์ธ ๋‹จ์ ์ด ์žˆ๋‹ค. 

-> merge๋Š” persist์— ๋น„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ํ•œ๋ฒˆ ๋” ๋‚ ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ๋น„ํšจ์œจ์ ์ด๋‹ค. 

 

 

โญ๏ธ ์ฐธ๊ณ  โญ๏ธ 

JPA ์‹๋ณ„์ž ์ƒ์„ฑ ์ „๋žต์ด @GeneratedValue ๋ฉด save() ํ˜ธ์ถœ ์‹œ์ ์— ์‹๋ณ„์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋กœ ์ธ์‹ํ•ด์„œ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ JPA ์‹๋ณ„์ž ์ƒ์„ฑ ์ „๋žต์ด @Id๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ํ• ๋‹น์ด๋ฉด ์ด๋ฏธ ์‹๋ณ„์ž ๊ฐ’์ด ์žˆ๋Š” ์ƒํƒœ๋กœ save() ๋ฅผ ํ˜ธ์ถœํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” merge()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.  merge()๋Š” ์šฐ์„  DB๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฐ’์„ ํ™•์ธํ•˜๊ณ , DB์— ๊ฐ’์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋กœ ์ธ์ง€ํ•˜๋ฏ€๋กœ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.  ๋”ฐ๋ผ์„œ Persistable๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ ํ™•์ธ ์—ฌ๋ถ€๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ํšจ๊ณผ์ ์ด๋‹ค. 

 

์ฐธ๊ณ ๋กœ ๋“ฑ๋ก์‹œ๊ฐ„(@CreatedDate)๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ด ํ•„๋“œ๋กœ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ ์—ฌ๋ถ€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

(@CreatedDate์— ๊ฐ’์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋กœ ํŒ๋‹จ) 

 

Persistable ๊ตฌํ˜„ 

Persistable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. 

์ด๋•Œ @CreatedDate๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด ๊ฐ’์ด null ์ด๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ Auditing์„ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ @EntityListener(AuditingEntityListener.class)๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค~~

 

์ด๋Ÿฌ๊ณ  ๋‹ค์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋ณด๋ฉด 

์ด๋ฒˆ์—๋Š” selectํ•ด์„œ ๋จผ์ € DB ์กฐํšŒ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋กœ ํŒ๋‹จํ•˜๊ณ  insert ํ•œ ์ฟผ๋ฆฌ๋ฅผ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90