๐ ํ์ฌ ์ํฉ ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋ช
- ํ์ฌ ํ๋ก์ ํธ์์๋ N:M ๊ด๊ณ(๋ค๋๋ค ๊ด๊ณ)๊ฐ ์ ์ฉ๋ Member์ Organization ์ํฐํฐ ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค์ ํ๊ณ ์๋ค. ์ค๊ฐ ํ ์ด๋ธ์ธ OrganizationMember ํ ์ด๋ธ์ด ๋ ์ํฐํฐ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ฉฐ, ์ด๋ฅผ ํตํด ์๋ฐฉํฅ ๊ด๊ณ๊ฐ ๊ด๋ฆฌ๋๋ค. ์ค๊ฐ ํ ์ด๋ธ์ ํตํด Member๋ ์ฌ๋ฌ Organization์ ์ํ ์ ์์ผ๋ฉฐ, ๋ฐ๋๋ก ๊ฐ Organization๋ ์ฌ๋ฌ Member์ ์ฐ๊ด๋ ์ ์๋ค. ํ์ฌ๋ Organization ์ํฐํฐ์์๋ง ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ค์ ํ์ฌ ์ปฌ๋ ์ ํ๋๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋ค.
- ๋ํ, CascadeType ์ต์ ์ ํตํด ๋ถ๋ชจ ์ํฐํฐ ์ญ์ ์ ์์ ์ํฐํฐ๋ ์๋์ผ๋ก ์ญ์ ๋๋๋ก ๊ตฌํํ๋ค. ๊ทธ๋ฌ๋ ์ค๊ฐ ํ ์ด๋ธ์ธ OrganizationMember๋ฅผ ํตํด ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ ๋, CascadeType ์ต์ ์ ์๋ชป ์ค์ ํ๋ฉด ์๋์น ์์ ์ญ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โถ ๊ตฌํ ์ฝ๋
๐ฝ Member ์ํฐํฐ ํด๋์ค
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
}
๐ฝ Organization ์ํฐํฐ ํด๋์ค
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Organization {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
// ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
@Builder.Default
@OneToMany(mappedBy = "organization", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<OrganizationMember> organizationMembers = new ArrayList<>();
}
๐ฝ Organization๊ณผ Member์ ์ค๊ฐ ํ ์ด๋ธ์ ๊ด๋ฆฌํ๋ OrganizationMember ์ํฐํฐ ํด๋์ค
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class OrganizationMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "organization_id")
private Organization organization;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "member_id")
private Member member;
...
}
๐จ ๋ฌธ์ ์ํฉ
์์ ์ํฐํฐ์ธ OrganizationMember ์ํฐํฐ์๋ CascadeType.ALL์ด ์ค์ ๋์ด ์์ด, ๋ถ๋ชจ ์ํฐํฐ์ธ Organization์ ์ญ์ ํ ๋ ์์ํ์ง ๋ชปํ๊ฒ Member ์ํฐํฐ๊น์ง ์ญ์ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋น์ฆ๋์ค ๋ก์ง ์์ผ๋ก๋ ๋จ์ฒด๋ฅผ ์ญ์ ํ์ ๋ฟ์ธ๋ฐ, ํด๋น ๋จ์ฒด์ ์ํด ์๋ ํ์๋ค๊น์ง ์ญ์ ๋๋ ์ํฉ์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
โ๏ธ ์์ธ ๋ถ์
- Organization๊ณผ OrganizationMember๋ ๋ถ๋ชจ-์์ ๊ด๊ณ๊ณ , OrganizationMember์ Member ์ญ์ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ์ค์ ๋์ด ์๋ค. ๋ฐ๋ผ์ Organization์์ OrganizationMember๋ฅผ ์ญ์ ํ ๋, OrganizationMember์ ์ค์ ๋ CascadeType ๋๋ฌธ์ Member๊น์ง ์ญ์ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ์์ ์ํฐํฐ์ cascade ์ต์ ์ ์ค์ ํ๋ฉด์, ๋ถ๋ชจ-์์ ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋ชป ๊ด๋ฆฌํ ๊ฒฐ๊ณผ๋ค.
- ๋ํ, ๋ถ๋ชจ-์์ ๊ด๊ณ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๋ํ ๊ฐ๋ ์ด ๋ช ํํ์ง ์์๋ ์ ๋ ๋ฌธ์ ์๋ค. ํ์ฌ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ OrganizationMember์ธ๋ฐ, ์ด๋ฅผ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ํผ๋ํ์ฌ CascadeType์ ์ ์ฉํด์ผ ํ๋ค๊ณ ์๋ชป ํ๋จํ ๊ฒ์ด ์ด๋ฒ ์ค๋ฅ์ ์์ธ ์ค ํ๋์๋ค.
๐จ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ถ๋ชจ ์ํฐํฐ์๋ง cascade ์ต์ ์ ์ ์ฉํ๊ณ , ์์ ์ํฐํฐ์๋ cascade๋ฅผ ์ ์ฉํ์ง ์๋๋ก ์์ ํ๋ค. ์์ ์ํฐํฐ์๋ ๋ถ๋ชจ ์ํฐํฐ์์ ๊ด๊ณ๋ง์ ์ค์ ํ๊ณ , CascadeType์ ์ ๊ฑฐํ๋ค.
๐ฝ ์์ ์ํฐํฐ์ธ OrganizationMember ํด๋์ค
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class OrganizationMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY) // CascadeType ์ ๊ฑฐ
@JoinColumn(name = "organization_id")
private Organization organization;
@ManyToOne(fetch = FetchType.LAZY) // CascadeType ์ ๊ฑฐ
@JoinColumn(name = "member_id")
private Member member;
...
}
๐ ๊ฒฐ๊ณผ ๊ด์ฐฐ
Organization ์ํฐํฐ๋ฅผ ์ญ์ ํด๋ Member ์ํฐํฐ๋ ๊ทธ๋๋ก ์ ์ง๋๋ฉฐ, OrganizationMember ํ ์ด๋ธ์ row๋ง ์ญ์ ๋๋ ๊ฒ์ ํ์ธํ๋ค. ์ด๋ฅผ ํตํด ๋น์ฆ๋์ค ๋ก์ง ์ ๋ฐ์ํ ์ ์๋ ์น๋ช ์ ์ธ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ฑ๊ณต์ ์ผ๋ก ์ ์งํ ์ ์์๋ค.
๐ก ๊ณ ์ฐฐ
์ฐ๊ด๊ด๊ณ์์ CascadeType์ ํจ์จ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์์นซ ์๋ชป ์ค์ ํ๋ฉด ์๋ํ์ง ์์ ์ํฐํฐ ์ญ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ํนํ ๋ถ๋ชจ-์์ ๊ด๊ณ์์ CascadeType์ ์ ์ฉํ ๋, ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๊ณผ ๋ฐฉํฅ์ฑ์ ๋ช ํํ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค. ๋ถ๋ชจ์ ์์ ๊ด๊ณ๋ฅผ ํท๊ฐ๋ ค ์์ ์ํฐํฐ์ cascade๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ, ์์์ด ์ญ์ ๋ ๋ ๋ถ๋ชจ๋ ํจ๊ป ์ญ์ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ก ์ธํด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์๋ ์น๋ช ์ ์ธ ์ํฅ์ ์ค ์ ์๋ค. ์ด๋ฒ ๋ฌธ์ ๋ฅผ ํตํด CascadeType์ ์ฌ์ฉ๊ณผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ ๊ฐ๋ ์ ๋ํด ๊น์ ์ดํด๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ผ๋ฉฐ, ๋ถ๋ชจ ์ํฐํฐ์์๋ง cascade๋ฅผ ์ ์คํ๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์์ ์๊ฒ ๋์๋ค.