๋ณดํต ๋ถ๋ชจ ์ํฐํฐ์ ์์ ์ํฐํฐ๊ฐ ์๋ ๊ฒฝ์ฐ
OrphanRemoval๋ฅผ ์์ฑํ๋ค.
๋๋์ฒด OrphanRemoval๊ฐ ๋ญ๊น?
1. ๊ณ ์ ๊ฐ์ฒด๋?
- ๋ถ๋ชจ ๊ฐ์ฒด์ ์ฐ๊ฒฐ์ด ๋์ด์ง ์์ ๊ฐ์ฒด๋ฅผ JPA์์ ๊ณ ์๊ฐ์ฒด๋ผ๊ณ ํ๋ค.
- ์๋์ฒ๋ผ ์ฃผ๋ฌธ์ด ๋ค์ด์๋ค.
Order
โโ OrderItem
โโ OrderItem
โโ OrderItem
- ๊ทธ๋ฐ๋ฐ ์ด๋ ์๊ฐ ์ฃผ๋ฌธ์์ ์ํ ํ๋๋ฅผ ์ ๊ฑฐํ๋ค.
order.getOrderItems().remove(item); // ์ ๊ฑฐ
item.setOrder(null);
- ๊ทธ๋ฌ๋ฉด ์ด OrderItem์ ๋ ์ด์ ์ด๋ค Order์๋ ์ํ์ง ์๊ฒ ๋๋ค.
Order
โโ OrderItem
โโ OrderItem
OrderItem ← ๋ถ๋ชจ๋ฅผ ์์๋ฐ
2. OrphanRemoval = true
- OrphanRemoval = true๋ ๊ณ ์ ๊ฐ์ฒด๊ฐ ์๊ฒผ์ ๋, JPA๊ฐ ์๋์ผ๋ก ์ญ์ ํด์ฃผ๋ ์ต์ ์ด๋ค.
- ์ฆ, ๋ถ๋ชจ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด ๊ทธ ์์ ๊ฐ์ฒด๋ DB์์๋ ์ญ์ ํ๋ผ๋ ๊ฒ.
- ๋ณดํต ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderItem> orderItems = new ArrayList<>();
- ์ด๋ ๊ฒ ์ค์ ํ๋ฉด ์๋ ์ฝ๋์ฒ๋ผ ๋ถ๋ชจ ์ปฌ๋ ์ ์์ ์์์ ์ ๊ฑฐํ์ ๋
order.getOrderItems().remove(orderItem);
- JPA๊ฐ ํธ๋์ญ์ ์ด ๋๋๋ ์์ ์ ์ด๋ฐ SQL์ ๋ ๋ฆด ์ ์๋ค.
DELETE FROM order_item WHERE id = ?
- ์๋ฐ ์ฝ๋์์๋ ๋จ์ํ ๋ฆฌ์คํธ์์ ๋บ์ ๋ฟ์ธ๋ฐ, DB์์๋ ์ค์ ๋ก ์ญ์ ๊ฐ ๋๋ ๊ฒ์ด๋ค.
- ๋ง์ฝ ์ด ๋ด์ฉ์ด ์ดํด๊ฐ ์๋๋ค๋ฉด ์๋ ๋ด์ฉ์ ๋จผ์ ์ฝ๊ณ ์ค์.
[Spring][JPA] ์ํฐํฐ๋งค๋์ (EntityManager)์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋ฌด์์ธ์ง ์ฝ๊ฒ ์ดํดํด๋ณด์!
์ ํฌ์คํ ์์ Cascade์ ๋ํด ์ค๋ช ํ๋ค.์ฌ์ค Cascade๋ฅผ ๋ ์ ์ดํดํ๊ธฐ ์ํด์์ํฐํฐ๋งค๋์ ๊ฐ ๋ฌด์์ธ์ง ์๊ณ ์์ผ๋ฉด ์ข๋ค.๊ทธ๋์ ์ด๋ฒ์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ๋ค. 1. ์ํฐํฐ ๋งค๋์ (Entit
post-this.tistory.com
[Spring][JPA] Cascade์ ์๋ฏธ์ ์ข ๋ฅ ์์๋ณด๊ธฐ.
๋ค๋๋ค ๋งคํ ์ํฐํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ฉด์Cascade ํ์ ์ ์ค์ ํ๋ค.Cascade๊ฐ ๋ฌด์์ด๋ฉฐ ์ด๋ค ์ข ๋ฅ๊ฐ ์๋์ง ์ดํด๋ณด์. 1. Cascade์์์ฑ์ ์์ฑ๋ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด๊ฐ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๊ฑฐ๋ ์์คํ ์ด ์ฌ๋ถ
post-this.tistory.com
3. CascadeType.REMOVE์ orphanRemoval์ ์ฐจ์ด
- CascadeType.REMOVE๋ ๋ถ๋ชจ ์์ฒด๊ฐ ์ญ์ ํ ๋ ์์๋ ๊ฐ์ด ์ญ์ ๋๋ค.
orderRepository.delete(order);
์ด๋ ๊ฒ ํ๋ฉด Order๋ ์ญ์ ๋๊ณ OrderItems๋ค๋ ํจ๊ป ์ญ์ ๋๋ค. => ๋ถ๋ชจ๊ฐ ์ฃฝ์ผ๋ฉด ์์๋ ๊ฐ์ด ์ฌ๋ผ์ง๋ ๊ตฌ์กฐ์ด๋ค.
- orphanRemoval = true๋ ๋ถ๋ชจ๊ฐ ์ด์์์ด๋ ๋ถ๋ชจ์ ์์์ ๊ด๊ณ๊ฐ ๋๊ธฐ๋ฉด ์์์ด ์ญ์ ๋๋ค.
order.getOrderItems().remove(orderItem);
Order๋ ๊ทธ๋๋ก ์กด์ฌํ๊ณ ์ ๊ฑฐ๋ OrderItem๋ง ์ญ์ ๋๋ค. => ๋ถ๋ชจ๊ฐ ์ด์์์ด๋ ๋ถ๋ชจํํ ๋ฒ๋ ค์ง๋ฉด ์์์ ์ญ์ ๋๋ค.
๋ง์ฝ์ CascadeType.REMOVE๋ ์๊ณ orphanRemoval = true๋ ์๋ ๊ฒฝ์ฐ ๋ถ๋ชจํํ ๋ฒ๋ ค์ ธ๋ ์์์ ์ญ์ ๋์ง ์๊ธฐ ๋๋ฌธ์ DB์์ ์๋ฌด์ผ๋ ๋ฒ์ด์ง์ง ์๋๋ค.
- orphanRemoval = true๋ ์์์ด ๋ถ๋ชจ ์์ด๋ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
- ์๋ฅผ ๋ค์ด ๊ฒ์๊ธ ์์ ๋ฌ๋ฆฐ ๋๊ธ์ ๊ฒฝ์ฐ ๊ฒ์๊ธ์ด ์์ด๋ ์๋ฏธ๊ฐ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ํฉํ๋ค.