๋ชฉ๋กJPA (9)

DevLog ๐Ÿ˜ถ

[JPA] @Embedded ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ , ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๊ธฐ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „๋„ˆ๋ฌด ์˜ค๋žœ๋งŒ์— ์ž‘์„ฑํ•˜๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€...! ์ตœ๊ทผ์— ์‚ฌ๋‚ด์—์„œ ๋งค์šฐ ๋งŽ์ด ์“ฐ์ด๋Š” ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ฑฐ๊ธฐ์„œ ๋งŒ๋‚ฌ๋˜ ์ด์Šˆ๋“ค๊ณผ ๊ฐ„๋‹จํ•œ ์ƒ๊ฐ ๊ธฐ๋ก์„ ๋ธ”๋กœ๊ทธ์— ๋‚จ๊ธฐ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ด๋ฏธ ํŒ€ ๋‚ด์—์„œ ๊ณต์œ ๋„ ํ–ˆ์—ˆ๊ณ , ๋™๊ธฐ๋“ค์—๊ฒŒ๋„ ๊ณต์œ ํ•œ ๋‚ด์šฉ์ด๊ธฐ๋„ ํ•˜๊ณ , ์‚ฌ์‹ค ๋ณ„๊ฑฐ ์•„๋‹Œ ๊ฑฐ๋ผ ๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค. ๐ŸŒฑ ๋ฌธ์ œ ์ƒํ™ฉ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•œ ๋„๋ฉ”์ธ์€ ์šฐ๋ฆฌ ํŒ€์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜์˜€๊ณ , ์ด๋ฏธ ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์šด์˜๋˜๊ณ  ์žˆ์ง€๋งŒ ๊ต‰์žฅํžˆ ์˜›๋‚ ๋ถ€ํ„ฐ ๋ ˆ๊ฑฐ์‹œ๋กœ ๋‚ด๋ ค์˜ค๊ณ  ์žˆ๋˜ ๊ฐ์ฒด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ทœ ์ž…์‚ฌ์ž๊ฐ€ ๋ณด๊ธฐ์— ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์‚ฌ๋‚ด ๋„๋ฉ”์ธ์ธ ๋งŒํผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋น„์Šทํ•œ ๋А๋‚Œ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ธํŒ…์„ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค.CREAT..

๊ฐœ๋ฐœ์ผ์ง€ 2023. 12. 16. 10:00
[Spring] @SpringBootTest์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ ์‚ฌ์šฉํ•˜๊ธฐ - no Session ๋ฐฉ์ง€ํ•˜๊ธฐ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฐ๋ฆฌ ํŒ€์˜ ๊ฒฝ์šฐ E2E ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ @SpringBootTest๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ ํŒ€์˜ ํŒ€์›๋ถ„์ด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค. failed to lazily initialize a collection of role: co.kirikiri.domain.roadmap.RoadmapContent.nodes.values: could not initialize proxy - no Session ์ƒํ™ฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. (์ถ”ํ›„ ์ฝ”๋“œ๋กœ ๋” ์ž˜ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ด๋‹ค.) A๋ผ๋Š” ์ƒ์„ฑ API์™€ B๋ผ๋Š” ์กฐํšŒ API๊ฐ€ ์žˆ์„ ๋•Œ, ํŒ€ ๋‚ด์—์„œ ๊ธฐ๋Šฅ์„ ์„ธ๋ถ„ํ™”ํ•œ ๋‹ค์Œ ๊ฐ์ž ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ B๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‹œ์ ์— A๋ผ๋Š” API๊ฐ€ ์—†์–ด, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋•Œ repository๋ฅผ ..

[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