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