๋ชฉ๋กBack-end/JPA (7)

DevLog ๐Ÿ˜ถ

[JPA] @OneToMany ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘ ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ JPA์—์„œ @OneToMany ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘๋ณด๋‹ค๋Š” ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ๊ถŒ์žฅํ•œ๋‹ค๋Š” ๋ง์„ ๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ์ฒด์ง€ํ–ฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๋‹ค ๋ณด๋ฉด ๋‹ค๋Œ€์ผ์˜ ์ƒํ™ฉ๋ณด๋‹ค๋Š” 1์ธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ N์ธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ๊ณ , (์ ์–ด๋„ ๋‚ด ๊ฒฝํ—˜์—์„œ๋Š” ๊ทธ๋žฌ๋‹ค) N์ธ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ตณ์ด 1์ธ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ชฐ๋ผ๋„ ๋๋˜ ์ ์ด ๋งŽ์•˜๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ์™œ ๊ทธ๋žฌ๋˜ ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ด์„œ ๋‚˜๋ฆ„๋Œ€๋กœ ์‹คํ—˜์„ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. (ex. ๊ฒŒ์‹œ๊ธ€๊ณผ ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€์˜ ๊ด€๊ณ„์—์„œ, ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ์ •๋ณด๋ฅผ ์ฐพ์•„์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๊ฒŒ์‹œ๊ธ€์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒŒ ๋” ๋งŽ์•˜์Œ) ๐ŸŒฑ ๊ธฐ๋ณธ ์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„ํ•˜๊ธฐ @Entity class Board( @Id @..

Back-end/JPA 2023. 7. 16. 20:13
[JPA] CascadeType.REMOVE vs orphanRemoval=true ์ฐจ์ด์  ์•Œ์•„๋ณด๊ธฐ - 1ํŽธ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ JPA๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ CascadeType.REMOVE์™€ orphanRemoval = true ์˜ต์…˜์— ๋Œ€ํ•ด์„œ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์ œ๋Œ€๋กœ ์ธ์ง€ํ•œ ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ, ์ด๋ฒˆ์— ๊ณต๋ถ€ํ•  ๊ฒธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋ฉฐ ๋‘ ์˜ต์…˜์˜ ์ฐจ์ด๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด Cascade ์˜ต์…˜์€ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์™€ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ์˜์† ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๊ณ , orphanRemoval์€ ์กฐ๊ธˆ ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๊ณ ์•„ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ์ผ€์ŠคํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ฉฐ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž. ๐ŸŒฑ ์—”ํ‹ฐํ‹ฐ ์„ธํŒ…ํ•˜๊ธฐ 1:N ๊ด€๊ณ„๋ฅผ ๋‹ด๋‹นํ•ด์ค„ '์ฝ˜์„œํŠธ' ์—”ํ‹ฐํ‹ฐ์™€ '์ฝ˜์„œํŠธ ํ‹ฐ์ผ“' ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. ๋‘˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ •ํ•˜์˜€์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ์ฝ˜์„œํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ˜์„œํŠธ ํ‹ฐ์ผ“์„ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜์˜€..

Back-end/JPA 2023. 6. 29. 23:58
[JPA] OSIV ์ฐ๋จนํ•˜๊ธฐ 2ํŽธ - ์ค€์˜์† ์ƒํƒœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•˜๊ธฐ (FetchType.EAGER์™€ N+1 ๋ฌธ์ œ, fetch join)

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ง€์—ฐ ๋กœ๋”ฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ–ˆ๋‹ค. ์ด๋Š”, ์ง€์—ฐ ๋กœ๋”ฉ์„ ์œ„ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๊ด€๋ฆฌ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ? ๐ŸŒฑ ๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜ ์ „๋žต์„ LAZY์—์„œ EAGER๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ž๋Š” ๊ฒƒ์ด๋‹ค ๐Ÿ˜… @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Crew { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private ..

Back-end/JPA 2023. 5. 21. 19:22
[JPA] OSIV ์ฐ๋จนํ•˜๊ธฐ 1ํŽธ - ํ”„๋ก์‹œ ๊ฐ์ฒด์™€ ์ค€์˜์† ์ƒํƒœ ์—”ํ‹ฐํ‹ฐ

๊ธˆ์š”์ผ์— ๊ทผ๋กœํ•˜๋ฉด์„œ ๊ตฌ๊ตฌ์™€ ๊ทผ๋กœ ํฌ๋ฃจ๋“ค์˜ ๋„์›€ ๋•๋ถ„์— JPA๋ฅผ ๋‹ค์‹œ๊ธˆ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋๋‹ค ๐Ÿ˜… ๋‚˜๋„ ์™„์ „ํ•˜๊ฒŒ ์ž˜ ์•„๋Š” ๋‚ด์šฉ์€ ์•„๋‹Œ์ง€๋ผ ์•„๋Š”๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๐ŸŒฑ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ํŠธ๋žœ์žญ์…˜ ๐Ÿ’ก ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€? ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†ํ™”์‹œํ‚ค๋Š” ํ™˜๊ฒฝ. EntityManager๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€๋œ ์—”ํ‹ฐํ‹ฐ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. EntityManager ์ƒ์„ฑ ์‹œ 1๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๐Ÿ’ฌ ํŠน์ง• - ์‹๋ณ„์ž ๊ฐ’์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. - ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์— flush. (์“ฐ๊ธฐ ์ง€์—ฐ - ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— SQL ์ €์žฅ ํ›„ ํ•œ ๋ฒˆ์— ํ”Œ๋Ÿฌ์‹œ) - 1์ฐจ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์ฒ˜์Œ์— 1์ฐจ ์บ์‹œ์—์„œ ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ > ์—†์œผ๋ฉด DB ์กฐํšŒ > 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ = '์˜์†ํ™”') - ..

Back-end/JPA 2023. 5. 21. 16:44