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

SpringMVC63

[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.
[Spring, React] ๊ฐ์ฒด ์ค‘์‹ฌ์ธ JPA์— ๋งž์ถฐ์„œ ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๊ธฐ. ์ดˆ๋ฐ˜์— DB ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ,ํ…Œ์ด๋ธ” ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ JPA๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์—์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค. 1. ์ƒํ™ฉ์„ค๋ช…์ดˆ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋Š” ๊ด€๋ฆฌ์ž ์˜์—ญ์—์„œ ์ด 3๊ฐœ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.AdminRepository : ๊ด€๋ฆฌ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.PemissionRepository : ๊ถŒํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ง€๊ธˆ ํ”„๋กœ์ ํŠธ์—์„  ์ด 5๊ฐ€์ง€ ๊ถŒํ•œ์ด ์žˆ๋‹ค. ์กฐํšŒ | ์ถ”๊ฐ€ | ์ˆ˜์ • | ์‚ญ์ œ | ๊ฒ€์ƒ‰์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ... ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ–ˆ๋‹ค.AdminPermissionRepository : ์–ด๋–ค ๊ด€๋ฆฌ์ž๊ฐ€ ์–ด๋–ค ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ์ €์žฅํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด id๊ฐ€ 1๋ฒˆ์ธ ๊ด€๋ฆฌ์ž๊ฐ€ ์กฐํšŒ, ์ˆ˜์ • ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด '1-1', '1-3' ๋Œ€์ถฉ ์ด๋Ÿฐ์‹์œผ๋กœ ์ •๋ณด๊ฐ€ ์ €.. 2026. 6. 4.