@ManyToOne
์ฐ๊ด๊ด๊ณ ๋งคํ ๊ธฐ๋ณธ - ๋ค๋์ผ ๊ด๊ณ
Reference
๊น์ํ - ์ฑ : ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ๊น์ํ - ์ธํ๋ฐ ๊ฐ์ : ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ
์ฐ๊ด๊ด๊ณ์ ๊ธฐ์ด
์ฒ์๋ถํฐ ์ง๊ณ ๊ธฐ์ตํด์ผํ ๊ฐ๋ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์ด๋ธ๊ฐ์ ๊ด๊ณ๋ ์๋ฐฉํฅ ๊ด๊ณ์ด์ง๋ง ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ผ๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด๋ผ๋ฆฌ ์๋ก ์์กด์ฑ์ ๊ฐ์ ธ์ ๊ฐ์ฒด ๊ฐ์ ์๋ฐฉํฅ ๊ด๊ณ๋ ์กด์ฌํ๋ค๊ณ ๋ณผ ์ ์์ง๋ง ์๋ฐํ ๋ฐ์ง๋ฉด ์๋ฐฉํฅ ๊ด๊ณ์ด๊ธฐ ์ด์ ์ ๋ ๊ฐ์ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ก ์ด๋ฃจ์ด์ ธ์๋ ๊ฒ์ด๋ค.
ํ ์ด๋ธ๊ฐ์ ๊ด๊ณ๊ฐ ์๋ฐฉํฅ ๊ด๊ณ์ธ ์ด์ ๋ ์ธ๋ํค ํ๋๋ง ์์ผ๋ฉด ์กฐ์ธ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋จ๋ฐฉํฅ ๋ค๋์ผ(N to 1) ๊ด๊ณ
์ฌ๋ฌ ๊ด๊ณ ์ค์ ์ ์ผ ๋จผ์ ์์์ผ ํ ๊ด๊ณ์ธ ๋ค๋์ผ ๊ด๊ณ๋ ๋ง ๊ทธ๋๋ก ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋งํ๋ค.
์๋ ํด๋์ค ๋ ๋ฒจ์ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋ค.
์๋ ์ธ์คํด์ค ๋ ๋ฒจ์ ๋จ๋ฐฉํฅ ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋ค. ์ฌ๋ฌ ๋ฉค๋ฒ๊ฐ ํ๋์ ํ์ ๊ฐ์ง ์ ์๋ ๊ฒ์ ์ ์ ์๋ค.
jpa๋ฅผ ์ฌ์ฉํ Memberํด๋์ค์ Teamํด๋์ค ์ฝ๋๋ฅผ ์์๋ก ๋ณด์.
@Entity
public class Member {
@Id
@Column(name="MEMBER_ID")
private String id;
private String username;
// ์ฐ๊ด๊ด๊ณ ๋งคํ
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
// ์ฐ๊ด๊ด๊ณ ์ค์
public void setTeam(Team team) {
this.team = team;
}
//Getter, Setter ...
}
@Entity
public class Team {
@Id
@Column(name="TEAM_ID")
private String id;
private String name;
//Getter, Setter ...
}
์ด ๋ค๋์ผ ๊ด๊ณ์์ ์ฃผ๋ชฉํ ์ ์ @ManyToOne, @JoinColumn(name="TEAM_ID") ์ด๋ ธํ ์ด์ ์ด๋ค.
@ManyToOne์ ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ผ๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํ ๋ ํ์์ ์ผ๋ก ํ์ํ ์ด๋ ธํ ์ด์ ์ด๋ค. ์ฐ๊ด๊ด๊ณ ๋งคํ์ด๋ผ ํจ์ RDBMS์ ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ, ๊ฐ์ฒด ์งํฅ์ ์ฝ๋์ ๋งคํํด์ฃผ๋ ๊ฒ์ ๋งํ๋ค. (์๋ ๋ค์ด์ด๊ทธ๋จ ์ฐธ๊ณ ) ์ด๋ก ์ธํด, ํ ์ด๋ธ์ ํ ์ด๋ธ๋๋ก ๊ตฌ์ฑ๊ฐ๋ฅํ๊ณ , ๊ฐ์ฒด๋ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ฝ๋๋ฅผ ์งค ์ ์๋ค. @JoinColumn์ ์ธ๋ํค๋ฅผ ๋งคํํ ๋ ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์๋ name="TEAM_ID"์ด๋ฏ๋ก Memberํ ์ด๋ธ์ TEAM_ID๊ฐ ์ธ๋ํค๊ฐ ๋๊ฒ ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ ์ด๋ธ์ ๊ฐ์ ๊ด๊ณ์์, Memberํ ์ด๋ธ์ TEAM_ID์ปฌ๋ผ์๋ TEAMํ ์ด๋ธ์ TEAM_ID๋ง ๋ค์ด๊ฐ๊ฒ ๋์ง๋ง, ๊ฐ์ฒด ๊ด๊ณ์์ Member์ธ์คํด์ค์๋ Team์ธ์คํด์ค๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก Member์ธ์คํด์ค์์ getTeam์ ํด์ฃผ๋ฉด ์ฐ๊ด๊ด๊ณ์ ์๋ team์ ์ฐธ์กฐํ ์ ์๋ค.
์ด ์ฅ๋ฉด์์ ์ฃผ๋ชฉํด์ผํ ์ ์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณํ๊ธฐ ๋๋ฌธ์, ์ฐ๊ด๊ด๊ณ์ ์๋ ํ ์ด๋ธ์ด ํ์ํ ๋ Member์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ Member์ธ์คํด์ค์ TEAM_ID(์ธ๋ํค)๋ฅผ ์ฌ์ฉํด์ 2์ฐจ์ ์ผ๋ก sql์ ์ธ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฅ ๊ฐ์ฒด์์ team์ ์ฐธ์กฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
Team team1 = new Team("team1","ํ1");
em.persist(team1);
Member member1 = new Member("member1", "ํ์1");
member1.setTeam(team1); // ์ฐ๊ด๊ด๊ณ ์ค์ member1 -> team1
em.persist(member1);
Member member2 = new Member("member2", "ํ์2");
member2.setTeam(team1); // ์ฐ๊ด๊ด๊ณ ์ค์ member2 -> team1
em.persist(member2);
Member member = em.find(Member.class, "member1");
Team team = member.getTeam();
em.persist()๋ ์ํฐํฐ ๋งค๋์ ๊ฐ ๊ด๋ฆฌํ๋ ์์์ฑ ์ฝํ ์คํธ์ ์ํฐํฐ๋ฅผ ๋ฃ๋ ๊ฒ์ด๋ค. ์ ์ฝ๋๋ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก member1์ ์ฐ๊ด๊ด๊ณ์ ์๋ team์ ์ฐธ์กฐํ๋ ๋ชจ์ต์ ๋ณด์ฌ์ค๋ค.
์ด ์ฌ์ค์ด ๋ณ ๊ฒ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง nodejs์์๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ํญ์ sql๋ฅผ ์ฌ์ฉํด์ ์กฐ์ธํ๊ฑฐ๋, sql์ ํ ๋ฒ ์์ฑํด์ ๋ถ๋ฌ์จ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ์ฐ๊ด๊ด๊ณ์ ์๋ ํ ์ด๋ธ์ ์ฐธ์กฐํ๊ธฐ ์ํด์ 2์ฐจ์ ์ผ๋ก ๋ค์ sql๋ฅผ ์จ์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ์ sql๋ฌธ์ด ์ฝ๋ ์ ์ฒด์ ๋ง์ฐํ ์ ๋ฐ์ ์์๋ค.
๋ค๋์ผ์ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ๊ธฐ์ด๊ฐ ๋๋ค. ๋ฐ๋์ ์์งํด์ผํ ๊ฐ๋ ์ด๋ค.
์๋ฐฉํฅ ๋ค๋์ผ(N to 1) ๊ด๊ณ
๋จ๋ฐฉํฅ ๋ค๋์ผ ๊ด๊ณ์์๋ ๊ฐ์ฒด ๊ด์ ์ผ๋ก ๋ฐ๋ผ๋ดค์ ๋ '๋ค'์ชฝ์์ '์ผ'์ ์ฐธ์กฐํ ์ ์์๊ณ '์ผ'์ชฝ์์๋ '๋ค'๋ฅผ ์ฐธ์กฐํ ์ ์์๋ค. ํ์ง๋ง ์๋ฐฉํฅ ๋ค๋์ผ ๊ด๊ณ์์๋ ๊ฐ์ฒด ๊ด์ ์์ '์ผ'์ชฝ์์ '๋ค'๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ ๊ทธ ๋ฐ๋๋ ๊ฐ๋ฅํ๋ค.
์๋ ์ฝ๋๋ฅผ ๋ณด์.
@Entity
public class Member {
@Id
@Column(name="MEMBER_ID")
private String id;
private String username;
// ์ฐ๊ด๊ด๊ณ ๋งคํ
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
// ์ฐ๊ด๊ด๊ณ ์ค์
public void setTeam(Team team) {
this.team = team;
}
//Getter, Setter ...
}
@Entity
public class Team {
@Id
@Column(name="TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy="team")
private List<Member> members = new ArrayList<Member>();
//Getter, Setter ...
}
๋จ๋ฐฉํฅ ๋ค๋์ผ ๊ด๊ณ์ ๋ฌ๋ผ์ง ์ฝ๋๋ Team์ํฐํฐ์ '๋ค'์ชฝ์ ์ฐธ์กฐํ ์ ์๋ ํ๋๊ฐ ์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
๋น์ฐํ์ง๋ง Member์ํฐํฐ์์ ์ฐธ์กฐํ ๊ฐ์ฒด์ ๋ํด @ManyToOne ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ผ๋ฏ๋ก, Team์ํฐํฐ๋ ์ฐธ์กฐํ ๊ฐ์ฒด์ ๋ํด @OneToMany๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. @OneToMany์ mappedBy๋ ์๋ฐฉํฅ ๊ด๊ณ์์ ๋งคํ์ ์ํด ์ฌ์ฉํ๋๋ฐ, ๋ฐ๋์ชฝ ์ํฐํฐ์ ์ฐธ์กฐ ํ๋ ์ด๋ฆ์ ๊ฐ์ผ๋ก ์ฃผ๋ฉด ๋๋ค. mappedBy๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ ๊ฐ๋จํ๊ฒ ํ ์ด๋ธ์ ์ธ๋ ํค๊ฐ ์๋ ์ํฐํฐ๋ฅผ ๋งํ๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ ํ๋ ์ด์ ๋, ๊ฐ์ฒด๋ ๋ฒจ์์ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ ๋์ด์ด๋, ์ธ๋ ํค๋ ํ๋์ด๊ธฐ ๋๋ฌธ์, ์ด๋ค ๊ด๊ณ๋ฅผ ์ฌ์ฉํด์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํด์ผํ ์ง ์๋ ค์ค ํ์๊ฐ ์๋ ๊ฒ์ด๋ค. jpa์์๋ ์ด๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ผ๋ ๊ฐ๋ ์ ๋ง๋ค์ด ํ ์ชฝ ์ํฐํฐ์์ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ค.
์์๋ก ๋ค๋์ผ ๊ด๊ณ์์๋ ํญ์ '๋ค'์ชฝ์ ์ธ๋ ํค๊ฐ ์กด์ฌํ๋ฏ๋ก '๋ค'๊ฐ ํญ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋ ๊ฒ์ด๋ค.
์๋ ๊ฐ์ฒด๋ ๋ฒจ์ ๋ค๋์ผ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋ค.
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ ์ฃผ์ํด์ผํ ์ ์ด ์๋ค.
๊ฐ์ฒด์ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ ์์ชฝ ๋ชจ๋ ๊ด๊ณ๋ฅผ ๋งบ๋ ๊ฒ์ด ์์ ํ๋ค.
๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์์ ์ฝ๋์ฒ๋ผ ๋ค๋์ผ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๋ฉด @ManyToOne์ '๋ค'์ @OneToMany๋ฅผ '์ผ'์ ๋ฃ๋ ๊ฒ์ด๋ค. ์ด ์ด๋ ธํ ์ด์ ์ ์ด๋ ํ ์ชฝ์์ ์๋ตํด์๋ ์๋๋ค๋ ๊ฒ์ด๋ค.
์ด ๊ด๊ณ๋ฅผ ์ํด์ ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋๋ผ๋ ๊ฒ์ด ์กด์ฌํ๋ค.
public class Member {
private Team team;
public void setTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
//...
}
์ ์ฝ๋๋ member์์ team์ ๋ํ ์ฐธ์กฐ๋ฅผ setํ ๋ team์๋ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์ ์ฉํด์ค ๊ฒ์ด๋ค. ์ฆ ๋ฉ์๋ ํ๋๋ก ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ค์ ํด์ค ๊ฒ์ด๋ค.
public class Member {
private Team team;
public void setTeam(Team team) {
if(this.team != null){
this.team.getMembers().remove(this);
}
this.team = team;
team.getMembers().add(this);
}
//...
}
๋ํ, ์ ์ฝ๋๋ team์ ๋ํด null์ฒดํฌ๋ฅผ ์งํํด ํ์ฌ ์ฐธ์กฐ๋ team์ด ์๋ค๋ฉด ๊ธฐ์กด ๋ก์ง๊ณผ ๋์ผํ๊ฒ ์๋ํ์ง๋ง, ์ฐธ์กฐ๋ team์ด ์๋ค๋ฉด list์์ remove๋ฅผ ํด์ ๊ณผ๊ฑฐ์ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋์ด์ค๋ค. ์๋ฐฉํฅ ๋ค๋์ผ ๊ด๊ณ์์ '๋ค'์ชฝ์ ๊ด๊ณ๊ฐ ๋ฐ๋์์ด๋ ๊ณผ๊ฑฐ์ '์ผ'์ ๊ด๊ณ๊ฐ ๊ทธ๋๋ก ๋จ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋๋ ๋ค๋์ผ์์ '๋ค'์ชฝ์ด๋ '์ผ'์ชฝ์ด๋ ํ ๊ณณ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ค๊ณ์ ์ข๋ค๊ณ ํ๋ค.
์ ๋ฆฌ
๋จ๋ฐฉํฅ ๋งคํ๋ง์ผ๋ก ํ
์ด๋ธ๊ณผ ๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ์ด๋ฏธ ์๋ฃ๋์๋ค!
๋จ๋ฐฉํฅ์ ์๋ฐฉํฅ์ผ๋ก ๋ง๋ค๋ฉด ๋ฐ๋๋ฐฉํฅ์ผ๋ก ๊ฐ์ฒด ๊ทธ๋ํ ํ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ค!
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ์ฒด์ ์์ชฝ ๋ฐฉํฅ์ ๋ชจ๋ ๊ด๋ฆฌํด์ผ ํ๋ค!
๋ฐ๋ผ์ ๋จ๋ฐฉํฅ ๋งคํ์ ๋จผ์ ์ฌ์ฉํด๋ณด๊ณ , ๋ฐ๋๋ฐฉํฅ์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด ํ์ํ๋ค ์ถ์ผ๋ฉด ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
Last updated