SpringBoot54 [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. ์ด์ 1 2 3 4 ยทยทยท 9 ๋ค์