๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€166

[Spring] ์ž๋ฐ” ํด๋ž˜์Šค์™€ ์Šคํ”„๋ง ๋นˆ ํด๋ž˜์Šค์˜ ์ฐจ์ด๋ฅผ ์ฝ”๋“œ๋กœ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด์ž! ์Šคํ”„๋ง์„ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?์ž๋ฐ” ํด๋ž˜์Šค๋‚˜ ์Šคํ”„๋ง ํด๋ž˜์Šค๋‚˜๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€ ์•Š์„๊นŒ? ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด๋ฒˆ ํฌ์ŠคํŒ…์œผ๋กœ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋ณด์ž! 1. ์ž๋ฐ” ํด๋ž˜์Šค์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ‹€์ด๋‹ค.ํด๋ž˜์Šค ๋‚ด๋ถ€์—๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜์™€ ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด์žˆ๋‹ค.๊ฐœ๋ฐœ์ž๋Š” ํ•„์š”ํ•  ๋•Œ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.์˜ˆ์‹œ ์ฝ”๋“œ_ ์นดํŽ˜ ์‚ฌ์žฅ๋‹˜์ด ์ปคํ”ผ๋ฅผ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๋จธ์‹ ์„ ๊ตฌ์ž…ํ•ด์„œ ๋งŒ๋“ค์–ด์ค˜์š”.// 1. ์‹คํ–‰ ํด๋ž˜์Šค// ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € Main ํด๋ž˜์Šค์˜ main ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.public class Main { public static void main(String[] args) { // 2. ์ผ๋‹จ ์นดํŽ˜๋ฅผ ์ง์ ‘ ์ฐจ๋ ค์•ผ(new) ํ•œ๋‹ค. .. 2026. 6. 11.
GITHUB ๊พธ๋ฏธ๊ธฐ - 1) ๋จผ์ € README๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž ๊ฐœ๋ฐœ์ค€๋น„์ƒ์€ ๊นƒํ—ˆ๋ธŒ๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.์ด๋ ฅ์„œ์— ํ•จ๊ป˜ ์ œ์ถœํ•˜๊ธฐ ์ „, ๋‚ด ๊นƒํ—ˆ๋ธŒ๋ฅผ ์˜ˆ์˜๊ฒŒ ๋‹จ์žฅํ•ด๋ณด์ž. 1. Readme ๋งŒ๋“ค๊ธฐRepository์— ๋“ค์–ด๊ฐ„๋‹ค. NEW๋ฅผ ๋ˆŒ๋Ÿฌ์„œ respository๋ฅผ ์ƒ์„ฑํ•œ๋‹ค repository name์— ์•„์ด๋””๋ฅผ ์ ๋Š”๋‹ค- Add README๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ off๊ฐ€ ๋˜์–ด์žˆ์„ํ…๋ฐ, ์ด๊ฑธ ๊ผญ on์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•œ๋‹ค. - Choose visibility ๊ธฐ๋ณธ๊ฐ’์ด Public์ด๋‹ˆ, ๊ทธ๋ƒฅ ๊ฐ€๋งŒํžˆ ๋†”๋‘๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ public์ด ์•„๋‹ˆ๋ฉด public์œผ๋กœ ๋ฐ”๊พธ์ž.- ์ง€๊ธˆ ์Šคํฌ๋ฆฐ์ƒท์—์„œ ๋นจ๊ฐ„ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๊ฐ€ ์•„๋ž˜ ๋œจ๋Š” ์ด์œ ๋Š” ์ด๋ฏธ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š”๊ฑฐ๋ผ ๋ฌด์‹œํ•ด๋„ ๋œ๋‹ค. ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋“ค์–ด๊ฐ€์„œ ๋‚ด ์•„์ด๋”” ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋“ค์–ด๊ฐ„๋‹ค ์—ฐํ•„ ๋ชจ์–‘์— ๋“ค์–ด๊ฐ€์„œ ์ˆ˜์ •ํ•œ๋‹ค ์—ฌ๊ธฐ์„œ ์ˆ˜์ •ํ•˜.. 2026. 6. 11.
ํ‹ฐ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ 1ํŽธ_ ์ˆ˜์ต์ฐฝ์ถœ์„ ์œ„ํ•ด ๊ตฌ๊ธ€ ์„œ์น˜ ์ฝ˜์†” ์‰ฝ๊ฒŒ ๋“ฑ๋กํ•˜๊ธฐ. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋ฅผ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์— ๋…ธ์ถœ์‹œํ‚ค๋ ค๋ฉด๊ตฌ๊ธ€ ์„œ์น˜ ์ฝ˜์†”์„ ๋“ฑ๋กํ•ด์•ผํ•œ๋‹ค.์ˆ˜์ต ์ฐฝ์ถœ์„ ์›ํ•œ๋‹ค๋ฉด ๊ผญ! ํ•ด๋ณด์ž. 1. ํ‹ฐ์Šคํ† ๋ฆฌ ์„ค์ •์—์„œ ๊ตฌ๊ธ€ ์„œ์น˜์ฝ˜์†” ๋“ฑ๋กํ•˜๊ธฐ!๊ด€๋ฆฌ์— ๋“ค์–ด๊ฐ„๋‹ค ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ˆ„๋ฅธ๋‹ค ๊ตฌ๊ธ€ ๊ณ„์ • ์—ฐ๊ฒฐํ•˜๊ธฐ ๋ˆ„๋ฅธ๋‹ค ๊ตฌ๊ธ€ ๊ณ„์ • ๋กœ๊ทธ์ธ ํ›„ ๋™์˜ ํ•ญ๋ชฉ ์ „๋ถ€ ๋™์˜ํ•œ๋‹คํ‹ฐ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ํ™”๋ฉด์œผ๋กœ ๋‹ค์‹œ ๋„˜์–ด์™€์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋œ ๊ฒƒ์„ ํ™•์ธ ํ›„ ์ ์šฉ์„ ํด๋ฆญํ•œ๋‹ค. 2. ๊ตฌ๊ธ€ ์„œ์น˜ ์ฝ˜์†”์— ๋“ค์–ด๊ฐ€์„œ ์„ค์ •ํ•˜๊ธฐ! ์•„๋ž˜ ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋“ค์–ด๊ฐ„๋‹คhttps://search.google.com/search-console Google Search ConsoleSearch Console ๋„๊ตฌ์™€ ๋ณด๊ณ ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์ดํŠธ์˜ ๊ฒ€์ƒ‰ ํŠธ๋ž˜ํ”ฝ ๋ฐ ์‹ค์ ์„ ์ธก์ •ํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ, Google ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์—์„œ ์‚ฌ์ดํŠธ๊ฐ€ ๋‹๋ณด์ด๊ฒŒ ํ•  .. 2026. 6. 11.
[Spring][JPA] OrphanRemoval=true์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด์ž! ๋ณดํ†ต ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์™€ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐOrphanRemoval๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.๋„๋Œ€์ฒด OrphanRemoval๊ฐ€ ๋ญ˜๊นŒ? 1. ๊ณ ์•„ ๊ฐ์ฒด๋ž€?๋ถ€๋ชจ ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ์ž์‹ ๊ฐ์ฒด๋ฅผ JPA์—์„œ ๊ณ ์•„๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค.์•„๋ž˜์ฒ˜๋Ÿผ ์ฃผ๋ฌธ์ด ๋“ค์–ด์™”๋‹ค.Order โ”œโ”€ OrderItem โ”œโ”€ OrderItem โ””โ”€ OrderItem๊ทธ๋Ÿฐ๋ฐ ์–ด๋А ์ˆœ๊ฐ„ ์ฃผ๋ฌธ์—์„œ ์ƒํ’ˆ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค.order.getOrderItems().remove(item); // ์ œ๊ฑฐitem.setOrder(null);๊ทธ๋Ÿฌ๋ฉด ์ด OrderItem์€ ๋” ์ด์ƒ ์–ด๋–ค Order์—๋„ ์†ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.Order โ”œโ”€ OrderItem โ””โ”€ OrderItemOrderItem ← ๋ถ€๋ชจ๋ฅผ ์žƒ์—ˆ๋”ฐ 2. OrphanRemoval = trueOrphanRemova.. 2026. 6. 10.
[Spring][JPA] ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €(EntityManager)์™€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž! ์ „ ํฌ์ŠคํŒ…์—์„œ Cascade์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ๋‹ค.์‚ฌ์‹ค Cascade๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ข‹๋‹ค.๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. 1. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €(Entity Manager)์ž๋ฐ” ์ฝ”๋”ฉ์„ ํ•  ๋•Œ ๋‹ค๋ฃจ๋Š” ๊ฑด ๊ฐ์ฒด(Object) ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB) ํ…Œ์ด๋ธ”์ด๋‹ค.๋‘˜์€ ์ „ํ˜€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€ํ™”๊ฐ€ ์ž˜ ์•ˆํ†ตํ•œ๋‹ค.๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์—์„œ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ , ์•Œ์•„์„œ DB์— ๋งž๋Š” SQL๋กœ ๋ฐ”๊ฟ”์„œ ์ €์žฅํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ์ผ์„ ํ•ด์ค„ ์• ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.๊ทธ ์ผ์„ ํ•ด๋‚ด๋Š” ์• ๊ฐ€ ๋ฐ”๋กœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์ด๋‹ค.์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ๋‚ด๋ถ€์—” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ผ๋Š” ์ผ์ข…์˜ ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‘๊ณ  ๋ฌผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค. → ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด, ๋งค๋‹ˆ์ €๋Š” ๋น„๋ฐ€ ๋ฌผ๋ฅ˜์ฐฝ๊ณ (์˜์†์„ฑ .. 2026. 6. 9.
[Spring][JPA] Cascade์˜ ์˜๋ฏธ์™€ ์ข…๋ฅ˜ ์•Œ์•„๋ณด๊ธฐ. ๋‹ค๋Œ€๋‹ค ๋งคํ•‘ ์—”ํ‹ฐํ‹ฐ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด์„œCascade ํƒ€์ž…์„ ์„ค์ •ํ–ˆ๋‹ค.Cascade๊ฐ€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ค ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž. 1. Cascade์˜์†์„ฑ์€ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์ด ์žฌ๋ถ€ํŒ…๋˜์–ด๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ์˜๊ตฌ์ ์œผ๋กœ ์ง€์†๋˜๋Š” ํŠน์„ฑ์„ ๋งํ•œ๋‹ค.Cascade๋Š” ์˜์†์„ฑ ์ „์ด๋กœ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ˆ˜ํ–‰ํ•œ ์˜์†์„ฑ ์ž‘์—…์„ ์—ฐ๊ด€๋œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์—๊ฒŒ๋„ ์ž๋™์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.JPA์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Enum ํƒ€์ž…์˜ jakarta.persistence.CascadeType์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. → JPA์—์„œ CascadeType์„ .. 2026. 6. 9.
[Spring] ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ณด์ž!_ ๋ฆฌํŒฉํ† ๋ง ๋งŒ๋“ค์—ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋‹ˆ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์• ๋งคํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ข€ ๋” ํ™•์‹คํ•˜๊ฒŒ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž. 1. ์›์ธ์ดˆ๋ฐ˜ ๋กœ์งif (customerRepository.existsByCode(code)) { throw new DuplicateCodeException("์ดˆ๋Œ€์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");}customerRepository.save(customer);customerSearchRepository.save(toSearchEntity(customer));CustomerService ์ค‘ save ๋ฉ”์„œ๋“œ์˜ ์ผ๋ถ€๋ถ„์ด๋‹ค. ์ฒ˜์Œ ๊ณ ๊ฐ ๋“ฑ๋ก ๋กœ์ง์€ ์ด๋Ÿฐ ํ๋ฆ„์ด์—ˆ๋‹ค. code๊ฐ€ ๋“ค์–ด์˜ค๋ฉด existsByCode๋กœ code๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋ณด๊ณ , ์กด์žฌํ•˜๋ฉด DuplicateCodeException์„ ๋˜์กŒ๋‹ค.๋‘.. 2026. 6. 8.