๊ณต๋ถํ๊ฒ ๋ ๊ณ๊ธฐ
๊ฐ์๋ฅผ ๋ฃ๋ค๊ฐ Cascade์ orphanRemoval์ ๋ํ ๋ด์ฉ์ด ๋์๋ค. ์ฒ์์๋ "์~ ์ด๋ฐ ๊ฑฐ๊ตฌ๋" ํ๊ณ ๋ฌด์ฌ์ฝ ๋์ด๊ฐ๋ ค ํ์ง๋ง, ๊ฐ์๊ฐ ์งํ๋ ์๋ก ๋จธ๋ฆฟ์์ ๋ฌผ์ํ๊ฐ ๊ฐ๋ ์ฐจ๊ธฐ ์์ํ๋ค.
"Cascade๊ฐ ๋ญ์ง? ์ด๊ฑธ ์ธ์ ์จ์ผ ํ์ง?", "orphanRemoval์ ๋ ๋ญ๋ฐ...?๋ผ๋ ์๊ฐ์ด ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ์๋ค.
๊ฒฐ๊ตญ, ๊ฐ์๋ฅผ ๋ฃ๋ ๋ด๋ด ์ ํํ ์ดํดํ์ง ๋ชปํ ์ฑ๋ก ๋ฉํ๋ ์ง๋๊ฐ๊ณ ๋ง์๋ค.
"์ด๋๋ก ๋์ด๊ฐ๋ฉด ๋์ค์ ๋ ๋งํ ๊ฑฐ์ผ"๋ผ๋ ์๊ฐ์ด ๋จธ๋ฆฌ๋ฅผ ์ค์ณค๊ณ , ์ด๋ ๊ฒ ๋ ๊น์ ๊ฐ๋
์ ์ ๋๋ก ์ ๋ฆฌํด๋ณด์๋ ๋ง์์ผ๋ก ๊ณต๋ถ๋ฅผ ์์ํ๊ฒ ๋์๋ค.
Cascade์ orphanRemoval์ JPA์์ ๊ฝค ์ค์ํ ๊ฐ๋
์ด์ง๋ง, ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ๋๋ ๊ฑด "๋ง์ ์ฌ์ ๋ณด์ด๋๋ฐ, ๋ง์ ์ดํดํ๋ ค๋ฉด ์๊ฐ๋ณด๋ค ๋ณต์กํ๋ค"๋ ๊ฑฐ์๋ค. ์ด๊ฑธ ์ ๋๋ก ์๊ณ ๊ฐ์ผ ์์ผ๋ก JPA๋ฅผ ๋ค๋ฃฐ ๋ ๋ ํค๋งฌ ์ ์์ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋์ ๋ค์ํ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๊ณ , ์ฝ๋๋ ์ดํด๋ณด๋ฉด์ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ณต๋ถ๋ฅผ ์์ํ๋ค.
Cascade
๋ถ๋ชจ Entity๊ฐ ์์ํ๋ ๋ ์์ Entity๋ ๊ฐ์ด ์์ํ๋๊ณ , ๋ถ๋ชจ Entity๊ฐ ์ญ์ ๋ ๋ ์์ Entity๋ ์ญ์ ๋๋ ๋ฑ ํน์ Entity๋ฅผ ์์ ์ํ๋ก ๋ง๋ค ๋ ์ฐ๊ด๋ Entity๋ ํจ๊ป ์์ ์ํ๋ก ์ ์ด๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํน์ Entity์ ๋ํด ํน์ ํ ์์
์ ์ํํ๋ฉด ๊ด๋ จ๋ Entity์๋ ๋์ผํ ์์
์ ์ํํ๋ค๋ ์๋ฏธ์ด๋ค.
Type
JPA์์๋ ์ด๋ฌํ ์ฐ๊ด๋ Entity ๊ฐ์ ์์กด์ฑ์ ์ค์ ํ๊ธฐ ์ํด Enum ํ์ ์ CascadeType์ ์ ๊ณตํ๋ค.
CascadeType.ALL : ๋ชจ๋ Cascade๋ฅผ ์ ์ฉํ๋ค.
- ์์ Entity์์ ํ์ Entity๋ก ๋ชจ๋ ์์ ์ ์ ํํ๋ค.
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
private List<Address> addresses;
}
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String street;
private int houseNumber;
private String city;
private int zipCode;
@ManyToOne(fetch = FetchType.LAZY)
private Person person;
}
CascadeType.PPERSIST : Entity๋ฅผ ์์ํํ ๋, ์ฐ๊ด๋ Entity๋ ํจ๊ป ์ ์งํ๋ค.
- ํ์ Entity๊น์ง ์์์ฑ์ ์ ๋ฌํ๋ค.
CascadeType.MERGE : Entity ์ํ๋ฅผ ๋ณํฉํ ๋, ์ฐ๊ด๋ Entity๋ ๋ชจ๋ ๋ณํฉํ๋ค.
- ํ์ Entity๊น์ง ๋ณํฉ ์์ ์ ์ง์ํ๋ค.
CascadeType.REMOVE : Entity๋ฅผ ์ ๊ฑฐํ ๋, ์ฐ๊ด๋ Entity๋ ๋ชจ๋ ์ ๊ฑฐํ๋ค.
- ํ์ Entity๊น์ง ์ ๊ฑฐ ์์ ์ ์ง์ํ๋ค.
CascadeType.REFRESH : ๋ถ๋ชจ Entity๋ฅผ ์๋ก ๊ณ ์นจํ ๋, ์ฐ๊ด๋ Entity๋ ๋ชจ๋ ์๋ก๊ณ ์นจ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์ธ์คํด์ค ๊ฐ์ ๋ค์ ์ฝ์ด ์จ๋ค. (์๋ก ๊ณ ์นจ)
- ์ฐ๊ฒฐ๋ ํ์ Entity๊น์ง ์ธ์คํด์ค ๊ฐ์ ์๋ก ๊ณ ์นจํ๋ค.
CascadeType.DETACH : ๋ถ๋ชจ Entity๋ฅผ DETACH ์ํํ๋ฉด, ์ฐ๊ด Entity๋ DETACH ์ํ๊ฐ ๋์ด ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์๋์ง ์๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ์์ Entity๋ฅผ ์ ๊ฑฐํ๋ค.
- ์ฐ๊ฒฐ๋ ํ์ Entity๊น์ง ์์์ฑ์ ์ ๊ฑฐํ๋ค.
CascadeType.REMOVE์ orphanRemoval=true์ ์ฐจ์ด์
CascadeType.REMOVE๋ ๋ถ๋ชจ Entity๊ฐ ์ญ์ ๋๋ฉด ์์ Entity๋ ์ญ์ ๋๋ค.
์ฆ, ๋ถ๋ชจ๊ฐ ์์์ ์ญ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
์ฌ๊ธฐ์ CascadeType.REFRESH๋ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด, ๋ถ๋ชจ๊ฐ ์์์ ์ ์ฒด ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ค.
ํ์ง๋ง ๊ทธ๋ ๋ค๊ณ ํด๋ ๋ถ๋ชจ Entity๊ฐ ์์ Entity์์ ๊ด๊ฒ๋ฅผ ์ ๊ฑฐํด๋ ์์ Entity๋ ์ญ์ ๋์ง ์๊ณ ๊ทธ๋๋ก ๋จ์์๋ค.
orphanRemoval=true ๋ํ ๋ถ๋ชจ Entity๊ฐ ์ญ์ ๋๋ฉด ์์ Entity๋ ์ญ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ CascadeType.REMOVE์๋ ๋ฌ๋ฆฌ, ๋ถ๋ชจ Entity๊ฐ ์์ Entity์์ ๊ด๊ณ๋ฅผ ์ ๊ฑฐํ๋ฉด ์์์ ๊ณ ์๋ก ์ทจ๊ธ๋์ด ๊ทธ๋๋ก ์ฌ๋ผ์ง๊ฒ ๋๋ค.
์ด ๋์ ๋ถ๋ชจ Entity๋ฅผ ์ญ์ ํ ๋๋ ๋์ผํ๊ฒ ๋์ํ์ง๋ง, ๋ถ๋ชจ Entity์์ ์์ Entity์์ ๊ด๊ณ๋ฅผ ์ ๊ฑฐํ ๋ ์ฐจ์ด์ ์ ๊ฐ์ง๊ฒ ๋๋ค.
์ฃผ์์
๋ ์ต์
๋ชจ๋ ์์ Entity์ ๋ฑ ํ๋์ ๋ถ๋ชจ Entity๊ฐ ์ฐ๊ด๋์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ค!
Member(์์)์ Team(๋ถ๋ชจ)๋ ์๊ณ Parent(๋ถ๋ชจ)๋ ์๊ณ ์๋ค๋ฉด, CascadeType.REMOVE ๋๋ orphanRemoval=true์ ์ฌ์ฉ์ ์กฐ์ฌํ ํ์๊ฐ ์๋ค. ์์ Entity๋ฅผ ์ญ์ ํ ์ํฉ์ด ์๋๋ฐ๋ ์ด๋ ํ ์ชฝ์ ๋ถ๋ชจ Entity๋ฅผ ์ญ์ ํ๊ฑฐ๋ ๋ถ๋ชจ Entity๋ก๋ถํฐ ์ ๊ฑฐ๋๋ค๊ณ ์์์ด ์ญ์ ๋๋ ๋ถ์์ฌ๊ฐ ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก @OneToMany์์ ํ์ฉํ ๋ ์ฃผ์ํด์ ์ฌ์ฉํ๊ณ , @ManyToMany์์๋ ํ์ฉ์ ์ง์ํ๋ ๊ฒ์ด ์ข๋ค.
References
https://zzang9ha.tistory.com/350
'๐ Java & Spring & Kotlin > ๐ฑ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Spring ] AOP๋ฅผ ์ฌ์ฉํด์ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ฌ๋ณด์! (1) | 2025.01.15 |
---|---|
[ Spring ] ํธ๋์ญ์ .. ๋ค๊ฐ๊ฐ์๋ก ๋ฉ๊ฒ ๋๊ปด์ง๋ ์น๊ตฌ (0) | 2025.01.05 |