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

Spring81

[Spring] ์ž๋ฐ” ํด๋ž˜์Šค์™€ ์Šคํ”„๋ง ๋นˆ ํด๋ž˜์Šค์˜ ์ฐจ์ด๋ฅผ ์ฝ”๋“œ๋กœ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด์ž! ์Šคํ”„๋ง์„ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?์ž๋ฐ” ํด๋ž˜์Šค๋‚˜ ์Šคํ”„๋ง ํด๋ž˜์Šค๋‚˜๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€ ์•Š์„๊นŒ? ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด๋ฒˆ ํฌ์ŠคํŒ…์œผ๋กœ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋ณด์ž! 1. ์ž๋ฐ” ํด๋ž˜์Šค์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ‹€์ด๋‹ค.ํด๋ž˜์Šค ๋‚ด๋ถ€์—๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜์™€ ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด์žˆ๋‹ค.๊ฐœ๋ฐœ์ž๋Š” ํ•„์š”ํ•  ๋•Œ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.์˜ˆ์‹œ ์ฝ”๋“œ_ ์นดํŽ˜ ์‚ฌ์žฅ๋‹˜์ด ์ปคํ”ผ๋ฅผ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๋จธ์‹ ์„ ๊ตฌ์ž…ํ•ด์„œ ๋งŒ๋“ค์–ด์ค˜์š”.// 1. ์‹คํ–‰ ํด๋ž˜์Šค// ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € Main ํด๋ž˜์Šค์˜ main ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.public class Main { public static void main(String[] args) { // 2. ์ผ๋‹จ ์นดํŽ˜๋ฅผ ์ง์ ‘ ์ฐจ๋ ค์•ผ(new) ํ•œ๋‹ค. .. 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.
[Spring][JPA] @Embeddable์™€ @Embedded๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด์ž! ์–ด๋–ค ํ•„๋“œ๋ฅผ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด๋กœ ๋‘๋Š” ๊ฒƒ์ด ์•„๋‹Œ์˜๋ฏธ ์žˆ๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ@Embeddable๊ณผ @Embedded๋ฅผ ๋ถ™์ธ๋‹ค.๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž. 1. @Embeddable๊ณผ @Embedded@Embeddable์€ ๊ฐ’ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ณณ์— ํ‘œ์‹œํ•œ๋‹ค.@Embedded๋Š” ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ํ‘œ์‹œํ•œ๋‹ค.์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ๋ณตํ•ฉ ๊ฐ’ ํƒ€์ž…์œผ๋กœ ๋ถˆ๋ฆฌ๋ฉฐ ์ƒˆ๋กœ์šด ๊ฐ’ ํƒ€์ž…์„ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” JPA์˜ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด์„œ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.@Embedded Ximport jakarta.persistence.*;@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.ID.. 2026. 6. 6.