JiwonDev

Spring JPA์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด

by JiwonDev

https://www.youtube.com/watch?v=rYj8PLIE6-k&list=PL42XJKPNDepZVLkCM4yEKmU4LHyXjzChy&index=8 

 

 

ํ…Œ์ด๋ธ”์€ ์ •๊ทœํ™”๋ฅผ ํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋†’์€ ์„ฑ๋Šฅ์œผ๋กœ ์กฐํšŒ, ๋ณ€๊ฒฝํ•œ๋‹ค.

Entity๋Š” ์‹๋ณ„์ž์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์ฐธ์กฐ ๊ฐ’์œผ๋กœ ๋งŒ๋“ ๋‹ค.

ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ํ‚ค ํ•˜๋‚˜๋กœ ์–‘๋ฐฉํ–ฅ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ

Entity๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ๊ฐ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.

 

ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฃผ์ธ์€ 1๊ฐœ์ง€๋งŒ

Entity๋Š” 2๊ฐœ์ด๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ•˜๊ฑฐ๋‚˜

 

๐Ÿ“‘ ๋ณดํ†ต์€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

๋งž๋Š” ๋ง์ด๋‹ค.

 

์ค‘๊ฐ„์— Cascade๋กœ ์˜์†์„ฑ ์ƒํƒœ ์ „์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

memberDetail์—์„œ member๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๋ฉด, ์•Œ์•„์„œ ์ „ํŒŒ๋˜์–ด Member ํ…Œ์ด๋ธ”์—๋„ insert ๋œ๋‹ค.

 

 

๋ฌผ๋ก  ๋ฐ˜๋Œ€๋ฐฉํ–ฅ (1:N)๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

๋‹ค๋งŒ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ด ์•„๋‹ˆ๋ฏ€๋กœ, Member๋ฅผ ๋จผ์ € ์ €์žฅํ•ด์„œ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋Š” ๊ธฐ๋Œ€ํ•œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ถ”๊ฐ€์ ์ธ update ์ฟผ๋ฆฌ๊ฐ€ 2๊ฐœ ์ฐํ˜”๋‹ค.

์™ธ๋ž˜ํ‚ค๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ถ”๊ฐ€์ ์ธ update ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•œ ์ผ. member ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ insert, ์ดํ›„ ์™ธ๋ž˜ํ‚ค ์ง€์ •ํ• ๋•Œ update๊ฐ€ ํ•„์š”.

๋‹จ๋ฐฉํ–ฅ์ด ๋ฌด์กฐ๊ฑด ์ข‹์€๊ฒŒ ์•„๋‹ˆ๋ผ ์œ„ํ—˜ํ•ด์„œ ๊ทธ๋ ‡๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค.

๊ธฐ๋ณธํ‚ค๋ฅผ ์™ธ๋ž˜ํ‚ค๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด @MapsId๋กœ ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์„ ์ง€์ •. (JoinColumn ๋ถˆ๊ฐ€๋Šฅ)

์ด๋ ‡๊ฒŒ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”๊พธ๋ฉด, ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

cascade๋ฅผ ์“ฐ๋Š”๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡๋‹ค.

 

 


๐Ÿ“‘ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์ „๋žต

N+1์€ ORM์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ.

 

์ฐธ๊ณ ๋กœ ์‹œ์ ์˜ ์ฐจ์ด์ผ ๋ฟ, Lazy๋„ N+1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (๋ฌผ๋ก  ์‹ค์ œ ์ฐธ์กฐ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ์‹œ์ ์— ๋ฐœ์ƒ)

 

ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ฟผ๋ฆฌ์— fetch Join = ์กด๋‚˜ ์œ„ํ—˜ํ•˜๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ํ•  ๋•Œ์—๋Š” Limit ๊ฐœ์ˆ˜๋งŒ ๊ฐ€์ ธ์˜ฌ๊ฑฐ ๊ฐ™์ง€๋งŒ fetch ์กฐ์ธ์ด ์ ์šฉ๋˜๋ฉด ํŽ˜์ด์ง€ ๋ฒ”์œ„ ๋‚ด์— ์–ผ๋งŒํผ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”์ง€ ์•Œ๊ธฐ ์–ด๋ ค์›€. ๊ทธ๋ž˜์„œ Limit ์กฐ๊ฑด์ด ์—†์ด ๋‹ค ๊ฐ€์ ธ์˜ค๊ณ , ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋„ํ•จ.

 

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋งŒ์œผ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์ด์ง€๋งŒ, DB์ชฝ์—์„œ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ฏธ์นœ๋“ฏ์ด ์ฐํžˆ๋Š”๊ฑฐ์ž„ ใ…Žใ…Ž.. ๋ถ„๋ฆฌํ•ด์•ผํ•œ๋‹ค.

 

 

๐Ÿ“‘ Spring Data JPA ๊ธฐ๋Šฅ

Repository๋Š” JPA๋Š” ์—†๋Š” ๊ฐœ๋…์ด๋‹ค.

 

JOIN์ฟผ๋ฆฌ๋Š” ๊ผญ JPQL ์ด๋Ÿฐ๊ฑธ ์จ์•ผํ•˜๋‚˜์š”?

 

์–ด...์ด๋ฆ„์ด ๋‹ค๋ฅธ๊ฐ€์š”? (* ์ฟผ๋ฆฌ๋Š” ๊ฐ™์Œ)

 

๋ฆฌํ„ด ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค. (Page Slice). ์ด ๋‘˜์˜์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ

์ƒ์†๊ด€๊ณ„! Page๊ฐ€ ์ƒ์œ„! (์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜, ์ „์ฒด ์—˜๋ฆฌ๋จผํŠธ ์ˆ˜๋ฅผ ๊ฐ€์ง)

 

Page๋Š” ์ฟผ๋ฆฌ๊ฐ€ 2๊ฐœ ์ฐํžŒ๋‹ค (Count)
Slice๋Š” ์นด์šดํŠธ ์ฟผ๋ฆฌ๊ฐ€ ์—†๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์ŒํŽ˜์ด์ง€ ์—ฌ๋ถ€๋Š” ์–ด๋–ป๊ฒŒ ์•Œ์•„์š”..?

โžก limit๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ ์€ ๊ฒƒ ๋ณด๋‹ค ํ•˜๋‚˜ ๋”๊ฐ€์ ธ์˜ด.(์žˆ์œผ๋ฉด ๋‹ค์Œ ๊ฐ’์ด ์žˆ๋Š”๊ฑฐ)

ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์˜ค์ง€๊ฒŒ๋งŽ์•„์„œ, Count๊ฐ€ ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค๋ฉด Slice๋„ ๊ณ ๋ คํ•ด๋ณด๋ผ

๋‹ค๋งŒ Page๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ Limit ๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ˜ํ™˜๋˜๋ฉด Count๊ฐ€ ๋‚˜๊ฐ€์ง€ ์•Š์Œ. ๊ทธ๊ฑด ์ฐธ๊ณ 

 

 

 

๊ผฌ๋กฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

DTO๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค? (๋˜๋Š” QueryDSL ๊ฐ™์€๊ณณ์—์„œ ํ”„๋กœ์ ์…˜ ๊ธฐ๋Šฅ์„ ์ด์šฉ?)

 

๋Š” ๋ฉ๋‹ˆ๋‹ค.

final๋กœ ์„ ์–ธ๋œ ๊ฐ’์„ Repository์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉ์‹œ

๋ญ˜ ์ข‹์•„ํ• ์ง€ ๋ชฐ๋ผ์„œ Dynamic Projection์œผ๋กœ ์ค€๋น„ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

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

JiwonDev

JiwonDev

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