๋ชฉ๋ก์ „์ฒด ๊ธ€ (124)

DevLog ๐Ÿ˜ถ

[QueryDSL] QueryDSL ์‚ฌ์šฉ ์‹œ NPE๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๊ฒฐํ•˜๊ธฐ

๐ŸŒฑ ๋ฌธ์ œ ์ƒํ™ฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ผ์ด ๋งŽ์•„ QueryDSL์„ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์— ์ƒ‰๋‹ค๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. java.lang.NullPointerException: Cannot read field "id" because "co.kirikiri.domain.goalroom.QGoalRoomMember.goalRoomMember.goalRoom.roadmapContent.roadmap" is null NPE๋ฅผ ๋ณธ ๊ฑด ์˜ค๋žœ๋งŒ์ด์–ด์„œ ์กฐ๊ธˆ ์‚ฝ์งˆ์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๐ŸŒฑ ๋„๋ฉ”์ธ ๊ตฌ์กฐ ์ง€๋‚œ ํฌ์ŠคํŒ…๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋Š” ๊ฑฐ์˜ ๋™์ผํ•œ๋ฐ, ์œ„ ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋„๋ฉ”์ธ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜๋‚˜์˜ ๋กœ๋“œ๋งต ๋ณธ๋ฌธ(RoadmapContent) ์ •๋ณด์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ..

ํ† ์Šค 2023 NEXT ๊ฐœ๋ฐœ์ž ์ฑŒ๋ฆฐ์ง€ Server Developer ์ตœ์ข… ํ•ฉ๊ฒฉ ํ›„๊ธฐ

์‚ฌ์‹ค ๋ฐœํ‘œ๊ฐ€ ๋‚œ ์ง€๋Š” ๊ฝค ๋์ง€๋งŒ ๋ธ”๋กœ๊ทธ์— ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ฒจ๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์“ฐ๋Š” ๊ธ€ ๐Ÿ˜Š ์ถ”ํ›„ 2024 NEXT๊ฐ€ ์ง„ํ–‰๋˜์—ˆ์„ ๋•Œ ๋„์›€์ด ๋œ ๋ถ„๋“ค์ด ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค! ๐ŸŒฑ ์ค€๋น„ ์—ฌ์ • ์˜ฌํ•ด 6์›” ๋ง ์ •๋„, ํ† ์Šค์—์„œ 2023 NEXT ๊ฐœ๋ฐœ์ž ์ฑŒ๋ฆฐ์ง€๋ฅผ ํ†ตํ•ด์„œ 3๋…„ ์ดํ•˜์˜ ๊ฐœ๋ฐœ์ž๋ฅผ ์ฑ„์šฉํ•œ๋‹ค๋Š” ๊ณต๊ณ ๋ฅผ ๋ƒˆ๋‹ค. ์‚ฌ์‹ค ์šฐํ…Œ์ฝ”๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์˜ฌํ•ด ์•ˆ์—๋Š” ๋ณธ๊ฒฉ์ ์ธ ์ทจ์—… ์ค€๋น„๋ฅผ ํ•  ์ƒ๊ฐ์ด ์—†์—ˆ์–ด์„œ, ๊ทธ๋ƒฅ ๊ฒฝํ—˜ ํ•œ ๋ฒˆ ํ•ด๋ณด์ž๋Š” ์ƒ๊ฐ์œผ๋กœ ๋‹น๋‹นํ•˜๊ฒŒ ์ง€์›ํ–ˆ๋‹ค. Core Banking์ด๋ž‘ Server ์ค‘์— ์–ด๋–ค ๊ฑธ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ๊ธˆ์œต ๊ด€๋ จ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ํ˜„์ €ํžˆ ๋‚ฎ์€์ง€๋ผ Server ์ชฝ ์ง๋ฌด๋กœ ์ง€์›ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ถ„์•ผ๋ณ„ ์–ด๋”” ํŒŒํŠธ๋ฅผ ํ•˜๊ณ  ์‹ถ์€์ง€๋„ ์ฒ˜์Œ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋•Œ๋Š” ํ† ์Šค๋ž‘ ํ† ์Šค๋ฑ…ํฌ๋ฅผ ๋„ฃ์—ˆ๋‹ค. ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ > ์ง๋ฌด ์ธํ„ฐ..

[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๋ฅผ ..

[Gradle] Jacoco๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์„ค์ •ํ•˜๊ธฐ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฐ๋ฆฌ ํŒ€์€ CI ํ”Œ๋กœ์šฐ ๊ณผ์ • ์ค‘์—์„œ Jacoco๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ฆฌํฌํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ฒดํฌํ•˜๊ณ  ์žˆ๋‹ค. (ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง ์ฒ ์ €ํ•˜๊ฒŒ ํ•˜์ž๋Š” ์ทจ์ง€์ธ๋ฐ, ํŒ€์› ๋ชจ๋‘๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง ๊ผผ๊ผผํ•˜๊ฒŒ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ์ข‹๋‹ค ๐Ÿ‘) CI์— ๋Œ€ํ•œ ๊ธ€์€ ๋‹ค์Œ์— ์™„์ „ํ•˜๊ฒŒ ๊ตฌ์ถ•๋œ ์ดํ›„์— ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ, ์˜ค๋Š˜์€ Jacoco์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ€๋ณ๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ณ ์ž ํ•œ๋‹ค. ๐ŸŒฑ Jacoco ์„ค์ •ํ•˜๊ธฐ Jacoco๋Š”, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋ถ„์„ํ•ด์ฃผ๋Š” ์ž๋ฐ”์˜ ๋ฌด๋ฃŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Jacoco ํ”Œ๋Ÿฌ๊ทธ์ธ์—๋Š” JacocoTestReport์™€ JacocoTestCoverageVerification Task ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” ์ด 2๊ฐ€์ง€๋ฅผ ์œ„์ฃผ๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.) - JacocoTestReport: ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒฐ๊ณผ..

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

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

Back-end/JPA 2023. 7. 16. 20:13
[Real MySQL 8.0] ์ธ๋ฑ์Šค์™€ B-Tree ์•Œ์•„๋ณด๊ธฐ

๐ŸŒฑ ๋””์Šคํฌ ์ฝ๊ธฐ ๋ฐฉ์‹ ๐Ÿ’ฌ HDD (ํ•˜๋“œ ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ) / SSD (์†”๋ฆฌ๋“œ ์Šค๋ ˆ์ดํŠธ ๋“œ๋ผ์ด๋ธŒ) ๋ฉ”๋ชจ๋ฆฌ์— ๋น„ํ•ด ์‹ค์ œ ํ•˜๋“œ์›จ์–ด ์žฅ์น˜์˜ ๋ฐœ์ „์€ ๋น„๊ต์  ๋Š๋ฆฌ๊ฒŒ ๋ฐœ์ „ํ•œ๋‹ค๋Š” ์†Œ๋ฆฌ๋ฅผ ๋“ค์€ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํŠนํžˆ HHD๋Š” ํ”Œ๋ž˜ํ„ฐ(์›ํŒ)์„ ๋Œ๋ ค์„œ ์ฝ๊ณ ๋‚˜ ์“ฐ๋‹ค ๋ณด๋‹ˆ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋Š๋ฆด ์ˆ˜๋ฐ–์— ์—†๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ SSD์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ํ•˜์Šคํฌ ๋“œ๋ผ์ด๋ธŒ์—์„œ ๋ฐ์ดํ„ฐ ์ €์žฅ์šฉ ํ”Œ๋ž˜ํ„ฐ(์›ํŒ)์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ทธ ๋Œ€์‹  ํ”Œ๋ž˜์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฅ์ฐฉํ•ด์„œ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค. ํ”Œ๋ž˜์‹œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ „์›์ด ์—†์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค๋Š” ๋Š๋ฆฌ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ•˜๋“œ ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๋น ๋ฅด๋‹ค. ๐Ÿ’ฌ ๋žœ๋ค I/O์™€ ์ˆœ์ฐจ I/O ๋””์Šคํฌ ์ฝ๊ธฐ ์—ฐ์‚ฐ์—์„œ '๋žœ๋ค I/O'์™€ '์ˆœ์ฐจ I/O'๋ผ๋Š” ๋ง์„ ๋“ค์€ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋žœ๋ค ..

๐Ÿ“–/Real MySQL 8.0 2023. 7. 10. 21:40
[์šฐํ…Œ์ฝ” 5๊ธฐ] ์ฝ”๋ผ๋ฆฌ๋ผ๋ฆฌํŒ€ - ๊ธฐํš๋ถ€ํ„ฐ 1์ฐจ ๋ฐ๋ชจ๋ฐ์ด๊นŒ์ง€ ํšŒ๊ณ 

๐ŸŒฑ ์ฝ”๋ผ๋ฆฌ๋ผ๋ฆฌํŒ€ ๊ฒฐ์„ฑ! ๋“œ๋””์–ด ๋ ˆ๋ฒจ 3์ด ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋ณธ๊ฒฉ์ ์ธ ํŒ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ์•ž์„œ ๋ ˆ๋ฒจ 2 ํšŒ๊ณ  ๋•Œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์šด์ด ์ข‹๊ฒŒ๋„ ๋‚ด๊ฐ€ ์•„์ด๋””์–ด๋ฅผ ๋ƒˆ๋˜ ์ฃผ์ œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‘ ๋‹ฌ ๋™์•ˆ ํ•จ๊ป˜ ํ•  ํฌ๋ฃจ๋Š” ๋‘๋‘ , ์ฌ์ƒท, ๋ฐ€๋ฆฌ, ์šฐ๋””, ๋„ค์ด๋ธŒ, ๋ถ€์—‰์ด์˜€๋‹ค. ์•ฝ ์ผ์ฃผ์ผ ์ •๋„ ํ•จ๊ป˜ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์šฐ๋ฆฌ ํŒ€์˜ ๋ฐธ๋Ÿฐ์Šค๊ฐ€ ์ƒ๋‹นํžˆ ์ข‹๋‹ค๋Š” ์ƒ๊ฐ์ด ์ž์ฃผ ๋“ค์—ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋“ค ๋Œ€ํ™”ํ•  ๋•Œ ๋ˆˆ์„ ๋งˆ์ฃผ์น˜๊ณ  ๊ฒฝ์ฒญ์„ ์ž˜ํ•ด์ฃผ์‹œ๊ธฐ๋„ ํ•˜๊ณ , ๊ทธ๋ ‡๋‹ค๊ณ  ๋ง์ด ์—†๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ํšŒ์˜๋„ ๊ฝค ์žฌ๋ฐŒ๊ฒŒ ์ง„ํ–‰๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ์ข‹๋‹ค. ์ ๋‹นํžˆ ๋‚ดํ–ฅ์ ์ด๋ฉด์„œ ์™ธํ–ฅ์ ์ธ ์‚ฌ๋žŒ๋“ค์ด ์ž˜ ๋งŒ๋‚œ ๊ธ์ •์ ์ธ ์ผ€์ด์Šค๋ฅผ ๋ณด๋Š” ๋Š๋‚Œ....? ํŠนํžˆ ํ† ๋ก ํ• ๋งŒํ•œ ์ฃผ์ œ์— ๋Œ€ํ•ด์„œ 20๋ถ„, 30๋ถ„๋„ ์‹ฌ๋„์žˆ๊ฒŒ ํ† ๋ก ํ•˜๋Š” ์‹œ๊ฐ„๋“ค์ด ๊ต‰์žฅํžˆ ์ข‹์•˜๋‹ค. ์•ž์œผ๋กœ๋„ ๊ณ„์† ..

[JPA] CascadeType.REMOVE vs orphanRemoval=true ์ฐจ์ด์  ์•Œ์•„๋ณด๊ธฐ - 1ํŽธ

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

Back-end/JPA 2023. 6. 29. 23:58