JPA์์ ์ฐ๊ด๊ด๊ณ ๋งคํ์ด๋ ๊ฐ๋ ์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ์ ์ฐ๊ด๊ด๊ณ ๋งคํ์ด๋ผ๋ ๊ฒ์ ํด์ผ ํ๋์ง ์์์ผ ํ๋ค.
๐ค ์ฐ๊ด๊ด๊ณ ๋งคํ์ ์ ํด์ผ ํ ๊น?
๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๋ฌ๋ค์์ด ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ด๋ฐ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ,
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ ์ค๊ณ๋๋ก ๊ฐ์ฒด๋ฅผ ์ค๊ณํ๋ค๋ฉด ๊ฐ์ฒด ์ค์ฌ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ์ง ๋ชปํ๊ฒ ๋๊ณ , ๋ฐ์ดํฐ ์ค์ฌ์ ์ธ ์ฝ๋๊ฐ ๋ ์๋ฐ์ ์๋ค.
์์๋ฅผ ์ดํด๋ณด์.
1. Actor ํ ์ด๋ธ๊ณผ Musical ํ ์ด๋ธ์ด ์๋ค.
2. ๋ฐฐ์ฐ๋ ํ๋์ ๋ฎค์ง์ปฌ์ ์ถ์ฐํ ์ ์๋ค.
3. ๋ฐฐ์ฐ์ ๋ฎค์ง์ปฌ์ ๋ค๋์ผ ๊ด๊ณ์ด๋ค.
์์ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๋ํ ํ ์ด๋ธ์ ์๋์ ๊ฐ์ด ์ค๊ณํ ์ ์๋ค.
์ด๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ๋ก ์ฎ๊ฒจ์ ์ค๊ณํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ํฐํฐ๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ด๋ค.
@Entity
public class Actor {
@Id
@GeneratedValue
private Long id;
@Column(name = "musical_id")
private Long musicalId; // ํ
์ด๋ธ์ ์ธ๋ํค๋ฅผ ํ๋๋ก ๊ฐ๋๋ค.
@Column(name = "name");
private String name;
}
@Entity
public class Musical {
@Id
@GeneratedValue
private Long id;
@Column(name = "title")
private String title;
}
์ด๋ ๊ฒ ๋๋ค๋ฉด, ๋ฐฐ์ฐ๊ฐ ์ถ์ฐํ๋ ๋ฎค์ง์ปฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด์๋ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผ ํ๋ค.
Actor actor = em.find(Actor.class, actorId);
Musical musical = em.find(Musical.class, actor.getMusicalId());
Actor์ Musical ๊ฐ์ฒด ๊ฐ์ ์ฐธ์กฐ๊ฐ ์์ผ๋ฏ๋ก, ์๋ณ์๋ก ๋ค์ ์กฐํํด์ผ ํ๋ค.
์ด๋ ๊ฐ์ฒด์งํฅ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ด ์๋๋ค.
ํ ์ด๋ธ์ ์ธ๋ํค๋ก ์ฐ๊ด๋ ํ ์ด๋ธ์ ์กฐ์ธํด์ ์ฐพ์ง๋ง,
๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ ํตํด์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๋๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด์ ํด๊ฒฐํด์ผ ํ ๋ถ๋ถ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฅผ ์ด๋ป๊ฒ ํ์ด๋ด๋์ง ์์๋ณด์!
๐ ์ฐ๊ด๊ด๊ณ ๋งคํ
์ฐ๊ด๊ด๊ณ ๋งคํ์๋ ํฌ๊ฒ 4๊ฐ์ง๊ฐ ์๋ค.
- ๋ค๋์ผ N:1
- ์ผ๋๋ค 1:N
- ์ผ๋์ผ 1:1
- ๋ค๋๋ค N:M
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ๋ฅผ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ก ๋งคํํ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ํ ์ด๋ธ์ ์ธ๋ํค ํ๋๋ก ์์ชฝ ํ ์ด๋ธ์ ์กฐ์ธํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์ฒด๋ ์ฐธ์กฐํ๋ ํ๋๊ฐ ์๋ ์ชฝ์ผ๋ก๋ง ์ฐธ์กฐํ ์ ์๋ค. ๊ทธ๋์ ํ์ชฝ๋ง ์ฐธ์กฐํ๋ฉด ๋จ๋ฐฉํฅ, ์์ชฝ์ด ์๋ก ์ฐธ์กฐํ๋ฉด ์๋ฐฉํฅ์ด๋ผ๊ณ ํ๋ค.
ํ๋์ฉ ์์ ์์๋ฅผ ๋ฐํ์ผ๋ก ์ดํด๋ณด์.
๐ ๋ค๋์ผ N:1
๋ค๋์ผ ๋จ๋ฐฉํฅ
๋จผ์ ์์ ์์์์ ์ธ๋ํค๋ฅผ ํ๋๋ก ๊ฐ์ง ์๊ณ , ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ก ์์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
@Entity
public class Actor {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "musical_id")
private Musical musical;
@Column(name = "name");
private String name;
}
@Entity
public class Musical {
@Id
@GeneratedValue
private Long id;
@Column(name = "title")
private String title;
}
@ManyToOne์ ํตํด ๋ค๋์ผ ๊ด๊ณ๋ฅผ ์ง์ ํ๊ณ , @JoinColumn์ ํตํด Actor ๊ฐ์ฒด์ Musical์ด ํ ์ด๋ธ์ musical_id์ ๋งคํ๋๋ค.
Actor๋ Musical์ ์ ์ ์์ง๋ง, Musical์ Actor๋ฅผ ๋ชจ๋ฅธ๋ค.
์ด๊ฒ์ด ๋ค๋์ผ ๋จ๋ฐฉํฅ์ด๋ค.
๋ค๋์ผ ์๋ฐฉํฅ
๊ทธ๋ ๋ค๋ฉด ํ ์ด๋ธ์ฒ๋ผ ์ ์ชฝ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์๋ ค๋ฉด ์ด๋ป๊ฒ ํ ์ ์์๊น?
๋ค์๊ณผ ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ผ๊ณ ํ๋ค.
Musical์ด List<Actor> ๋ฅผ ๊ฐ์ง๋ฉด Muscial์์๋ Actor๋ฅผ ์ ์ ์๋ค.
ํ์ง๋ง ํ
์ด๋ธ์์๋ Actor๊ฐ Musical์ ํค๋ง ๊ฐ์ง๊ณ ์์ด๋ ์๋ก๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์, ๊ตณ์ด Muscial ํ
์ด๋ธ์ด Actor ํ๋๋ฅผ ๋ฐ๋ก ๊ฐ์ง ํ์๊ฐ ์๋ค. (์ ์ด์ ํ
์ด๋ธ์ ๊ทธ๋ ๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ง๋ ์์ง๋ง ์ณ์ง ์๋ค.)
๊ทธ๋์ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ๋ค.
@Entity
public class Actor {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "musical_id")
private Musical musical;
@Column(name = "name");
private String name;
}
@Entity
public class Musical {
@Id
@GeneratedValue
private Long id;
@Column(name = "title")
private String title;
@OneToMany(mappedBy = "musical")
private List<Actor> actors = new ArrayList<>();
}
Actor๋ ๊ทธ๋๋ก์ด๊ณ , Musical์ List<Actor>๋ฅผ ์ถ๊ฐํ๋ค.
@OneToMany๋ฅผ ํตํด Musical๊ณผ Actor๊ฐ ์ผ๋๋ค ๊ด๊ณ๋ผ๋ ๊ฒ์ ์ง์ ํ๊ณ (๋ค๋์ผ์ ๋ฐ๋์ด๊ธฐ ๋๋ฌธ), mappedBy๋ผ๋ ์์ฑ์ musical๋ก ์ง์ ํ๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ค.
๊ฐ์ฒด๋ฅผ ์๋ฐฉํฅ ๊ด๊ณ๋ก ๊ฐ์ ธ๊ฐ๋ ค๋ฉด Musical -> Actor, Actor -> Musical๋ก ์ฐธ์กฐ๊ฐ ์์ชฝ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ํ ์ด๋ธ ์ ์ฅ์์๋ ๋ ํ ์ด๋ธ ์ค์์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ ๊ณณ์ ์ ํด์ผ ํ๋ค.
์ด๋ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ฐธ์กฐ๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ผ๊ณ ํ๋ค.
๊ทธ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ๋ฐ๋ํธ์ ์ธ๋ ํค์ ์ํฅ์ ์ฃผ์ง ์๊ณ , ๋จ์ํ ์กฐํ๋ง ๊ฐ๋ฅํ๋ค.
Musical ๊ฐ์ฒด์ actors๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋๊ธฐ ๋๋ฌธ์, ํ ์ด๋ธ์๋ ์ ํ ์ํฅ์ ์ฃผ์ง ์๋ ํ๋์ด๊ณ , ์กฐํ๋ง ๊ฐ๋ฅํ๋ค.
Actor ๊ฐ์ฒด์ musical ํ๋๊ฐ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ฐธ์กฐ๋ผ๋ ๊ฒ์ ๋ํ๋ด๊ธฐ ์ํด mappedBy ์์ฑ์ผ๋ก ํด๋น ํ๋๋ฅผ ์ง์ ํ๋ค.
๐ ์ผ๋๋ค 1:N
์ผ๋๋ค๋ ์ผ(1)์ ๊ฐ์ง ์ชฝ์์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ๊ด๊ณ์ด๋ค. (1์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ)
์ผ๋๋ค ๋จ๋ฐฉํฅ
์ค๊ณ๋ฅผ ์ด์ง ๋ฐ๊ฟ์ Muscial ๊ฐ์ฒด๊ฐ Actor๋ค์ ๊ฐ์ง๊ณ ์์ง๋ง, Actor ๊ฐ์ฒด๋ Muscial์ ๊ฐ์ง๊ณ ์์ง ์๋ ๊ฒฝ์ฐ์ ์ผ๋๋ค ๋จ๋ฐฉํฅ ๊ด๊ณ๊ฐ ๋๋ค.
๊ฐ์ฒด ์ค๊ณ๋ก์จ๋ ๊ฐ๋ฅํ ์ผ์ด์ง๋ง, ํ ์ด๋ธ ์ค๊ณ๋ก์จ๋ ์ผ(1) ์ชฝ์ ์ธ๋ํค๋ฅผ ๊ฐ๊ฒ ํ๋ ๊ฒ์ด ์๋๋ค(๊ณ ๋ณผ ์ ์๋ค).
๊ทธ๋์ ๋ฌด์กฐ๊ฑด ๋ค(N) ์ชฝ์ ์ธ๋ํค๊ฐ ์กด์ฌํ๋ค.
๊ฒฐ๊ตญ ์์ ๊ฐ์ด ๋ฐ๋ํธ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ด์ํ(?) ๊ตฌ์กฐ๊ฐ ๋๋ค.
@Entity
public class Actor {
@Id
@GeneratedValue
private Long id;
@Column(name = "name");
private String name;
}
@Entity
public class Musical {
@Id
@GeneratedValue
private Long id;
@Column(name = "title")
private String title;
@OneToMany
@JoinColumn(name = "musical_id")
private List<Actor> actors = new ArrayList<>();
}
Musical ๊ฐ์ฒด์ List<Actor>์ @JoinColumn์ ๊ฑธ์ด์ฃผ๊ณ ์์ฑ์ musical_id๋ก ์ง์ ํด ์ฃผ๋ฉด ๋๋ค.
์ผ๋๋ค ๋จ๋ฐฉํฅ์ ๊ฒฝ์ฐ, ์ํฐํฐ๊ฐ ๊ด๋ฆฌํ๋ ์ธ๋ ํค๊ฐ ๋ค๋ฅธ ํ ์ด๋ธ์ ์์ด์ ์ถ๊ฐ๋ก Update ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค.
Actor actor = new Actor("๋ฐฐ์ฐ");
Musical musical = new Musical("๋ฎค์ง์ปฌ");
musical.getActors().add(actor); // <- ์ด ๋ Actor ํ
์ด๋ธ์ Update ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ
์์ ๊ฒฝ์ฐ์ Actor์ Musical์ ๋ํ Insert ์ฟผ๋ฆฌ๊ฐ ์์๋๋ก ์ํ๋ ์ดํ์,
musical์ actor๋ฅผ ์ถ๊ฐํ๋ฉด, Actor ํ ์ด๋ธ์ musical_id๋ฅผ ์์ ํ๊ธฐ ์ํด update ์ฟผ๋ฆฌ๊ฐ ์ํ๋๋ค.
์ด์ ๊ฐ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ ์ฟผ๋ฆฌ๊ฐ ๋ ์๊ฐ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์๋ค.
์ผ๋๋ค ์๋ฐฉํฅ
์ผ๋๋ค ์๋ฐฉํฅ ๊ด๊ณ๋ ๊ฐ๋ฅํ๋ค. ์ด ๋งคํ์ ๊ณต์์ ์ผ๋ก ์กด์ฌํ๋ ๊ฒ์ ์๋๋ผ๊ณ ํ๋ค. (์ต์ง๋ก ๊ฐ๋ฅ)
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ผ ์ชฝ(Musical)์ด๊ณ ์ถ์๋ฐ, ๋ค ์ชฝ(Actor)์์๋ ์กฐํํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
@Entity
public class Actor {
@Id
@GeneratedValue
private Long id;
@Column(name = "name");
private String name;
@ManyToOne
@JoinColumn(name = "musical_id", insertable = false, updatable = false)
private Musical musical;
}
@Entity
public class Musical {
@Id
@GeneratedValue
private Long id;
@Column(name = "title")
private String title;
@OneToMany
@JoinColumn(name = "musical_id")
private List<Actor> actors = new ArrayList<>();
}
Actor์์ @JoinColumn์ ํตํด ๋ง์น ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ธ ๊ฒ์ฒ๋ผ ์ง์ ์ ํ๊ณ , insertable = false, updatable = false๋ฅผ ์ค์ ํด ์ฃผ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๊ธฐ ์ ์ฉ ํ๋๊ฐ ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ insertable๊ณผ updatable์ ๊ผญ! false๋ก ์ค์ ํด์ฃผ์ด์ผ ํ๋ค. (๊ทธ๋ ์ง ์์ผ๋ฉด ์์ชฝ ๋ค ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋์ด๋ฒ๋ฆฐ๋ค.)
๐ ์ผ๋์ผ 1:1
์ผ๋์ผ ๊ด๊ณ๋ ๊ทธ ๋ฐ๋๋ ์ผ๋์ผ ๊ด๊ณ์ด๋ค.
๊ทธ๋์ ์ผ๋์ผ ๊ด๊ณ์์๋ ๋ ํ ์ด๋ธ ์ค ํ๋๋ฅผ ์ ํํด์ ์ธ๋ํค๋ฅผ ๋ฃ์ ์ ์๋ค.
๊ทธ๋ผ ๋น์ฆ๋์ค ๋ก์ง์ ์ด์ง ์ถ๊ฐํด ๋ณด์.
1. ํ๋์ ๋ฎค์ง์ปฌ์๋ ํ๋์ ๊ทน์ฅ์์ ๊ณต์ฐ๋๋ค.
2. ๊ทน์ฅ์ ํ๋์ ๋ฎค์ง์ปฌ๋ง ๊ณต์ฐํ ์ ์๋ค.
๊ทธ๋ผ ๋ฎค์ง์ปฌ๊ณผ ๊ทน์ฅ์ ์ผ๋์ผ ๊ด๊ณ์ด๋ค.
์ฌ๊ธฐ์ ์ฃผ ํ ์ด๋ธ์ด Musical, ๋์ ํ ์ด๋ธ์ด Theater๋ผ๊ณ ์๊ฐํ๊ณ ์ฌ๋ฌ ์ผ์ด์ค๋ฅผ ์ดํด๋ณธ๋ค.
์ผ๋์ผ ๋จ๋ฐฉํฅ - ์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค
์ฃผ ํ ์ด๋ธ์ธ Musical์ Theater์ ์ธ๋ํค๋ฅผ ์ ์ฅํ๋ค.
@Entity
public class Theater {
@Id
@GeneratedValue
private Long id;
@Column(name = "name");
private String name;
}
@Entity
public class Musical {
@Id
@GeneratedValue
private Long id;
@Column(name = "title")
private String title;
@OneToOne
@JoinColumn(name = "theater_id")
private Theater theater;
}
Musical์ Theater ํ๋์ @OneToOne์ ํตํด ์ผ๋์ผ ๊ด๊ณ๋ฅผ ์ง์ ํ๋ค. (@ManyToOne๊ณผ ์ ์ฌํจ)
์ผ๋์ผ ์๋ฐฉํฅ - ์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค
์๋ฐฉํฅ๋ ์์ฃผ ๊ฐ๋จํ๋ค. Theater ์ํฐํฐ์ Musical ํ๋๋ฅผ ์ถ๊ฐํด ์ฃผ๋ฉด ๋๋ค!
@Entity
public class Theater {
@Id
@GeneratedValue
private Long id;
@Column(name = "name");
private String name;
@OneToOne(mappedBy = "theater")
private Musical musical;
}
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ํํ์ด ๋๋ค.
์ผ๋์ผ ๋จ๋ฐฉํฅ - ๋์ ํ ์ด๋ธ์ ์ธ๋ํค
๊ทธ๋ ๋ค๋ฉด Musical์ Theater๊ฐ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ด๊ณ ์ถ์๋ฐ, ์ธ๋ํค๊ฐ ๋์ ํ ์ด๋ธ์ ์๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ๋ ๊น?
์ด ๊ฒฝ์ฐ๋ ๋ฐฉ๋ฒ์ด ์๋ค. JPA์์ ์ง์ ์์ฒด๋ฅผ ํ์ง ์๋๋ค๊ณ ํ๋ค.
ํ์ง๋ง ์๋ฐฉํฅ ๊ด๊ณ๋ ๊ฐ๋ฅํ๋ค!
์ผ๋์ผ ์๋ฐฉํฅ - ๋์ ํ ์ด๋ธ์ ์ธ๋ํค
๋งคํ ๋ฐฉ๋ฒ์ ์์ ์ค๋ช ํ ์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค ์๋ฐฉํฅ๊ณผ ๋์ผํ๋ค.
@Entity
public class Musical {
@Id
@GeneratedValue
private Long id;
@Column(name = "title")
private String title;
@OneToOne(mappedBy = "musical")
private Theater theater;
}
@Entity
public class Theater {
@Id
@GeneratedValue
private Long id;
@Column(name = "name");
private String name;
@OneToOne
@JoinColumn(name = "musical_id")
private Musical musical;
}
์ผ๋์ผ ๊ด๊ณ๋ ์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๋ ๊ฒ์ธ์ง, ๋์ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๋ ๊ฒ์ธ์ง ์ํฉ์ ๋ฐ๋ผ ์ ๊ณ ๋ คํด์ ์ ํํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๋ด๊ฐ ์ผ๋์ผ ๊ด๊ณ์์ ๊ฒช์๋ ์ํฉ ๐ป
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ผ๋์ผ ๊ด๊ณ๋ฅผ ๋ค๋ฃฐ ์ผ์ด ์์๋๋ฐ,
๊ฐ์ฒด ์ ์ฅ์์ ์ฃผ์ ๊ฐ์ฒด(Member)๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด(MemberProfile)๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์๋ฏธ์ ์ ์ ํ๊ณ , Member๋ฅผ ์กฐํํ ๋ MemberProfile๋ ํจ๊ป ์กฐํํ๋ ์ผ์ด ๋๋ถ๋ถ์ผ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์ฌ ๊ทธ๋ ๊ฒ ์ค๊ณ๋ฅผ ์งํํ์๋ค.
๊ทธ๋ฌ๋ค ๋ณด๋ ์ฃผ ํ ์ด๋ธ์ด ์ธ๋ํค๋ฅผ ๊ฐ์ง๋ ํํ๋ก ํ ์ด๋ธ์ด ์ค๊ณ๊ฐ ๋์๋ค.
์ด๋ ๊ฒ ๋์์ ๋, ๊ฐ์ฒด๋ฅผ ํ์ํ๊ธฐ์๋ ์์ฃผ ํธ๋ฆฌํ์ง๋ง, ํ ๊ฐ์ง ๋จ์ ์ด ์์๋ค.
Member๋ฅผ ์ ์ฅํด์ผ ํ ๋, MemberProfile์ด ๋ฌด์กฐ๊ฑด ์กด์ฌํด์ผ ํ๋ค.
์ด๋ฐ์ ํ์๊ฐ์ ์ ํ ๋ ํ์ ํ๋กํ ์ ๋ณด๋ ๋ฐ์ง ์๊ณ ์ถํ์ ์ถ๊ฐํ๋ ์์ผ๋ก ๋ก์ง์ ๊ตฌ์ฑํ๋๋ฐ, ๊ทธ๋ ๊ฒ ํ๋ ์ธ๋ํค์ NUll๊ฐ์ ํ์ฉํด์ผ ํ๋ค. ๊ทธ๋์ ํ์๊ฐ์ ์์ ํ๋กํ ์ ๋ณด๋ ํจ๊ป ์ ์ฅํ๋๋ก ๋ก์ง์ ์์ ํ ๊ฒฝํ์ด ์๋ค.
๊ทธ๋ ๋ค๊ณ ๋ฌด์์ ๋์ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๋ ๊ฒ์ธ๊ฐ ํ๋ฉด ๊ทธ๊ฒ๋ ๊ณ ๋ฏผํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
์ฐ์ MemberProfile์ ์กฐํํ๊ธฐ ์ํด์ MemberProfile์ ๋ฐ๋ก ์กฐํํด์์ผ ํ๋ค. (์ด์ ์๋ Member ์กฐํ ์ ํจ๊ป ์กฐํ ๊ฐ๋ฅ)
๊ทธ๋ฆฌ๊ณ MemberProfile ๊ฐ์ฒด๊ฐ Member๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ ๊ฐ์ฒด ์ ์ฅ์์๋ ์กฐ๊ธ ์ด์ํ๋ค.
์ด๋ฐ ์ ๋ค์ ์ ๊ณ ๋ คํด์ ์ค๊ณ๋ฅผ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๐
๐ ๋ค๋๋ค N:M
๋ค๋๋ค ๊ด๊ณ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๊ทํ๋ ํ ์ด๋ธ 2๊ฐ๋ก ํํํ ์ ์๋ค.
๋ค๋๋ค ๊ด๊ณ๋ฅผ ํํํ๊ธฐ ์ํด์๋, ํ ์ด๋ธ ์ค๊ฐ์ ์ฐ๊ฒฐ ํ ์ด๋ธ์ ๋๊ณ ์ผ๋๋ค, ๋ค๋์ผ ๊ด๊ณ๋ก ํ์ด์ผ ํ๋ค.
๊ฐ์ฒด๋ ์ปฌ๋ ์ ์ ์ฌ์ฉํด์ ๊ฐ์ฒด 2๊ฐ๋ก ๋ค๋๋ค ๊ด๊ณ๋ฅผ ํํํ ์ ์๋ค.
๊ทธ๋์ JPA์์๋ @ManyToMany๋ฅผ ์ด์ฉํด์ ๋ค๋๋ค ๊ด๊ณ๋ฅผ ํํํ ์๋ ์์ง๋ง, ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํ๋ค.
๊ทธ๋์ ๋ค๋๋ค ๊ด๊ณ๋ฅผ ์ค๊ณํด์ผ ํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋๋ค.
@ManyToMany -> @OneToMany, @ManyToOne
์๋ฅผ ๋ค์ด, ๋ฎค์ง์ปฌ์ด ์ฌ๋ฌ ๊ทน์ฅ์์ ๊ณต์ฐ๋ ์ ์๊ณ , ํ๋์ ๊ทน์ฅ์์๋ ์ฌ๋ฌ ๋ฎค์ง์ปฌ์ ๊ณต์ฐํ ์ ์๋ค๊ณ ํ์.
์์ ๊ฐ์ด ์ค๊ฐ ํ ์ด๋ธ(๋๋ ๊ฐ์ฒด)๋ฅผ ๋๊ณ ์ผ๋๋ค, ๋ค๋์ผ ๊ด๊ณ๋ก ํ์ด๋๋ค.
์ด๋ ๊ฒ ๋ค ๊ฐ์ง ์ฐ๊ด๊ด๊ณ ๋งคํ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์๋ค.
๋จ๋ฐฉํฅ, ์๋ฐฉํฅ ๋ฑ๋ฑ ํํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ง์ ๋งํผ ์ ๋๋ก ์๊ณ ์ฌ์ฉํด์ผ ํ ๊ฒ ๊ฐ๋ค.
ํ๋ก์ ํธ๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ์งํํ๊ธฐ ์ ์ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ๋ํด ๊ณต๋ถ๋ง ํ์ ๋๋, ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ ์ ๊ฒฝ ์จ์ผ ํ ํฌ์ธํธ๋ค์ด ๋ง์์ ์ด๊ฑธ ๊ณผ์ฐ ์ค๋ฌด์์๋ ์์ฃผ ์ฌ์ฉํ ๊น? ํ๋ ์๋ฌธ์ด ๋ง์๋ค.
์๋ฐฉํฅ์ผ๋ก ์ค์ ํ๋ ์๊ฐ ์ ์ชฝ ๊ฐ์ฒด์ ๋ํด ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์ ์ค์ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์, ์คํ๋ ค ๋ถํธํ๊ณ ๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ๋ง ๋์์ง ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฐ๋ฐ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ ๋จ๋ฐฉํฅ์ผ๋ก๋ง ์ค๊ณํ๊ธฐ์๋ ํ๊ณ๋ ์๊ณ , ์๋ฐฉํฅ์ผ๋ก ์ธํด ๊ฐ์ฒด๋ฅผ ์กฐํํ๊ธฐ์ ํธ๋ฆฌํด์ง๋ค๋์ง ์๋ฐฉํฅ์ด ์ฃผ๋ ์ด์ ๋ ์ปธ๋ค.
์ธ์ ๋ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค!
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] Graceful shutdown์ผ๋ก ์์ ํ๊ฒ ์ข ๋ฃํ๊ธฐ (0) | 2024.08.30 |
---|---|
Dao์ Repository์ ๋ํด์... (0) | 2023.05.29 |
[Spring] Interceptor๋ ์ด๋ป๊ฒ ๋์ํ ๊น? - DispatcherServlet ๋ด๋ถ ์ฝ๋ ์ดํด๋ณด๊ธฐ (0) | 2023.05.08 |
Mockito.mock(), @Mock๊ณผ @MockBean์ ์ฐจ์ด์ (1) | 2023.04.23 |