JPA ํ๋ก๊ทธ๋๋ฐ - 5์ฅ ์ฐ๊ด๊ด๊ณ ๋งคํ ๊ธฐ์ด
August 11, 2022 โข โ๏ธโ๏ธ 12 min read
5์ฅ ์ฐ๊ด๊ด๊ณ ๋งคํ ๊ธฐ์ด
๊ฐ์ฒด์ ์ฐธ์กฐ์ ํ ์ด๋ธ์ ์ธ๋ ํค๋ฅผ ๋งคํํ๋ ๊ฒ์ด ์ด ์ฅ์ ๋ชฉํ๋ค.
๋ฐฉํฅ(Direction)
- [๋จ๋ฐฉํฅ, ์๋ฐฉํฅ]
- ํ์ โ ํ ๋๋ ํ โ ํ์ ์ฒ๋ผ ๋ ์ค ํ ์ชฝ๋ง ์ฐธ์กฐํ๋ ๊ฒ์ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ผ๊ณ ํ๋ค.
- ํ์ <-> ํ ์ฒ๋ผ ์๋ก ์ฐธ์กฐํ๋ ๊ฒ์ ์๋ฐฉํฅ ๊ด๊ณ๋ผ๊ณ ํ๋ค.
- ๋ฐฉํฅ์ ๊ฐ์ฒด๊ด๊ณ์๋ง ์กด์ฌํ๊ณ ํ ์ด๋ธ ๊ด๊ณ๋ ํญ์ ์๋ฐฉํฅ์ด๋ค.
๋ค์ค์ฑ(Multiplicity)
- [๋ค๋์ผ(N:1), ์ผ๋๋ค(1:N), ์ผ๋์ผ(1:1), ๋ค๋๋ค(N:M)]
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ(Owner)
- ๊ฐ์ฒด๋ฅผ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ก ๋ง๋ค๋ฉด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์์ด์ผ ํ๋ค.
5.1 ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
๋ค๋์ผ(N:1) ๋จ๋ฐฉํฅ ๊ด๊ณ
- ํ์๊ณผ ํ์ด ์๋ค.
- ํ์์ ํ๋์ ํ์๋ง ์์๋ ์ ์๋ค.
- ํ์๊ณผ ํ์ ๋ค๋์ผ ๊ด๊ณ๋ค.
๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ
- ํ์ ๊ฐ์ฒด๋ Member.team ํ๋(๋ฉค๋ฒ๋ณ์)๋ก ํ ๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋๋ค.
- ํ์๊ณผ ํ ๊ฐ์ฒด๋ย ๋จ๋ฐฉํฅ ๊ด๊ณ๋ค. ํ์์ Member.team ํ๋๋ฅผ ํตํด์ ํ์ ์ ์ ์์ง๋ง ๋ฐ๋๋ก ํ์ ํ์์ ์ ์ ์๋ค.
ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ
- ํ์ ํ ์ด๋ธ์ TEAM_ID ์ธ๋ ํค๋ก ํ ํ ์ด๋ธ๊ณผ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋๋ค.
- ํ์ ํ ์ด๋ธ๊ณผ ํ ํ ์ด๋ธ์ย ์๋ฐฉํฅ ๊ด๊ณ๋ค. ํ์ ํ ์ด๋ธ์ TEAM_ID ์ธ๋ ํค๋ฅผ ํตํด์ ํ์๊ณผ ํ์ ์กฐ์ธํ ์ ์๊ณ ๋ฐ๋๋ก ํ๊ณผ ํ์๋ ์กฐ์ธํ ์ ์๋ค.
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.ID;
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID;
๊ฐ์ฒด์ ํ ์ด๋ธ์ ๋ค๋ฅธ ์
- ์ฐธ์กฐ๋ฅผ ํตํ ์ฐ๊ด๊ฐ๊ณ๋ ์ธ์ ๋ ๋จ๋ฐฉํฅ์ด๋ค. ๊ฐ์ฒด๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋ฐฉํฅ์ผ๋ก ๋ง๋ค๊ณ ์ถ์ผ๋ฉด ๋ฐ๋์ชฝ์๋ ํ๋๋ฅผ ์ถ๊ฐํด์ ์ฐธ์กฐ๋ฅผ ๋ณด๊ดํด์ผ ํ๋ค.
- ์ ํํ ์ด์ผ๊ธฐํ๋ฉด ์ด๊ฒ์ย ์๋ฐฉํฅ ๊ด๊ณ๊ฐ ์๋๋ผ ์๋ก ๋ค๋ฅธ ๋จ๋ฐฉํฅ ๊ด๊ณ 2๊ฐ๋ค.
- ๋ฐ๋ฉด์ ํ ์ด๋ธ์ ์ธ๋ ํค ํ๋๋ก ์๋ฐฉํฅ์ผ๋ก ์กฐ์ธํ ์ ์๋ค.
๊ฐ์ฒด๋ ์ฐธ์กฐ(์ฃผ์)๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋๋ค. (a.getB().getC())
ํ
์ด๋ธ์ ์ธ๋ํค๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋๋ค. (A JOIN B AND B JOIN A)
5.1.1. ์์ํ ๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ
public class Member {
private String id;
private String username;
@Getter
@Setter
private Team team; //ํ์ ์ฐธ์กฐ๋ฅผ ๋ณด๊ด
}
@Getter
@Setter
public class Team {
private String id;
private String name;
}
Team team1 = new Team("team1", "ํ1");
Member member1 = new Member("member1", "ํ์1");
Member member2 = new Member("member2", "ํ์2");
member1.setTeam(team);
member2.setTeam(team);
Team findTeam = member1.getTeam();
ํ์1์ด ์ํ ํ 1์ ์กฐํํด๋ณด์
Team findTeam = member1.getTeam();
์ด์ฒ๋ผ ๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๊ด๊ณ๋ฅผ ํ์ํ ์ ์๋๋ฐ ์ด๊ฒ์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด๋ผํ๋ค.
5.1.2. ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ
CREATE TABLE MEMBER (
MEMBER_ID VARCHAR(255) NOT NULL,
TEAM_ID VARCHAR(255),
USERNAME VARCHAR(255),
PRIMARY KEY (MEMBER_ID)
)
CREATE TABLE TEAM (
TEAM_ID VARCHAR(255) NOT NULL,
NAME VARCHAR(255),
PRIMARY KEY (TEAM_ID)
)
ALTER TABLE MEMBER ADD CONSTRAINT FK_MEMBER_TEAM
FOREIGN KEY (TEAM_ID) REFERENCES TEAM;
์ด๋ฐ ํ ์ด๋ธ ๊ตฌ์กฐ์์ member1 ์ด๋ผ๋ ID๋ฅผ ๊ฐ์ง ๋ฉค๋ฒ์ ํ์ ๊ฐ์ด ์กฐํํด๋ณด์.
SELECT T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
WHERE M.MEMBER_ID = 'member1'
์ด์ฒ๋ผ ์ธ๋ํค๋ฅผ ์ฌ์ฉํด ์ฐ๊ด๊ด๊ณ๋ฅผ ํ์ํ๋ ๊ฒ์ ์กฐ์ธ์ด๋ผ๊ณ ํ๋ค.
5.1.3. ๊ฐ์ฒด๊ด๊ณ ๋งคํ
JPA ์์์ ๋์ ๋งคํํด๋ณด์
@Entity
@Getter
@Setter
pubilc class Member {
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
//์ฐ๊ด๊ด๊ณ ๋งคํ
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
@Getter
@Setter
pubilc class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
}
๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ : [Member.team](http://Member.team) ํ๋ ์ฌ์ฉ
ํ
์ด๋ธ ์ฐ๊ด๊ด๊ณ : MEMBER.TEAM_ID ์ธ๋ ํค ์ปฌ๋ผ ์ฌ์ฉ
5.1.4. @JoinColumn
@JoinColumn์ ์๋ตํ๋ฉด ์ธ๋ํค๋ฅผ ์ฐพ์ ์ ๊ธฐ๋ณธ ์ ๋ต์ ์ฌ์ฉํ๋ค.
์์ฑ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ |
---|---|---|
name | ๋งคํํ ์ธ๋ ํค ์ด๋ฆ | ํ๋๋ช + _ + ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ์ปฌ๋ผ๋ช |
referencedColumnName | ์ธ๋ ํค๊ฐ ์ฐธ์กฐํ๋ ๋์ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช 8์ฅ ์ฐธ์กฐ | ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ์ปฌ๋ผ๋ช |
foreignKey(DDL) | ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ ์ง์ ์ง์ . ํ ์ด๋ธ์ ์์ฑํ ๋๋ง ์ฌ์ฉ 8์ฅ ์ฐธ๊ณ |
| unique nullable insertable updatable columnDefinition table | @Column ์์ฑ๊ณผ ๊ฐ์ | |
5.1.5 @ManyToOne
์์ฑ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ |
---|---|---|
optional | false๋ก ์ค์ ํ๋ฉด ์ฐ๊ด๋ ์ํฐํฐ๊ฐ ํญ์ ์์ด์ผ ํ๋ค | true |
fetch | ๊ธ๋ก๋ฒ ํ์น ์ ๋ต์ ์ค์ ํ๋ค. 8์ฅ ์ฐธ์กฐ | @ManyToOne=EAGER |
@OneToMany=LAZY | ||
cascade | ์์์ฑ ์ ์ด์ ์ฌ์ฉํ๋ค. 8์ฅ ์ฐธ์กฐ | |
targetEntity | ์ฐ๊ด๋ ์ํฐํฐ์ ํ์ ์ ๋ณด๋ฅผ ์ค์ - ์ ๋๋ฆญ์ผ๋ก ํ์ ์ ๋ณด ํ์ธ ๊ฐ๋ฅ (๊ฑฐ์ ์ฌ์ฉ X) |
5.2 ์ฐ๊ด๊ด๊ณ ์ฌ์ฉ
5.2.1. ์ ์ฅ
//ํ1 ์ ์ฅ
Team team1 = new Team("team1", "ํ1");
em.persist(team1);
//ํ์1 ์ ์ฅ
Member member1 = new Member("member1", "ํ์1");
member1.setTeam(team);
em.persist(member1);
//ํ์2 ์ ์ฅ
Member member2 = new Member("member2", "ํ์2");
member2.setTeam(team);
em.persist(member2);
! JPA์์ ์ํฐํฐ ์ ์ฅ์ ์ฐ๊ด๋ ๋ชจ๋ ์ํฐํฐ๋ ์์ ์ํ์ฌ์ผ ํ๋ค.
member2.setTeam(team); // ํ์ -> ํ ์ฐธ์กฐ
em.persist(member2); // ์ ์ฅ
5.2.2. ์กฐํ
-
๊ฐ์ฒด ๊ทธ๋ํ ํ์ (๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ ์กฐํ)
Member member = em.find(Member.class, "member1"); Team team = member.getTeam(); //๊ฐ์ฒด ๊ทธ๋ํ ํ์
-
๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ์ฌ์ฉ JPQL
10์ฅ์์ ์์๋ณด์..
5.2.3. ์์
//์๋ก์ด ํ2
Team team2 = new Team("team2", "ํ2");
em.persist(team2);
//ํ์1์ ์๋ก์ด ํ2 ์ค์
Member member1 = em.find(Member.class, "member1");
member1.setTeam(team2);
- 3์ฅ์ฐธ์กฐ) ์์ ์ em.update์ ๊ฐ์ ๋ฉ์๋๊ฐ ์๋ค.
- ๋จ์ํ ์ํฐํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํ๋ฌ์์์ ๋ณ๊ฒฝ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋์ํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ ์๋์ผ๋ก DB์ ๋ฐ์ํ๋ค.
5.2.4. ์ฐ๊ด๊ด๊ณ ์ ๊ฑฐ
Member member1 = em.find(Member.class, "member1");
member1.setTeam(null); //์ฐ๊ด๊ด๊ณ ์ ๊ฑฐ
5.2.5. ์ฐ๊ด๊ด๊ณ ์ญ์
member1.setTeam(null); //ํ์1 ์ฐ๊ด๊ด๊ณ ์ ๊ฑฐ
member2.setTeam(null); //ํ์2 ์ฐ๊ด๊ด๊ณ ์ ๊ฑฐ
em.remove(team); //ํ ์ญ์
- ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด ๊ธฐ์กด์ ์๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋จผ์ ์ ๊ฑฐํ๊ณ ์ญ์ ํด์ผํ๋ค.
- ์งํค์ง ์์ผ๋ฉด ์ธ๋ํค ์ ์ฝ์กฐ๊ฑด์ผ๋ก ์ธํด ์ค๋ฅ ๋ฐ์
5.3 ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
์ฌ๋ฌ๊ฑด๊ณผ ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ปฌ๋ ์ ํ์ ์ ์ฌ์ฉํด์ผํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ธ๋ ํค ํ๋๋ก ์๋ฐฉํฅ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์ถ๊ฐํด์ผํ ๋ด์ฉ์ด ์์.
5.3.1. ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ
@Entity
public class Team {
//์ถ๊ฐ๋๋ ๋ถ๋ถ
@OneToMany(mappedBy = "team")
private List<Membmer> members = new ArrayList<>();
}
ํ๊ณผ ํ์์ด ์ผ๋๋ค ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ List
@OneToMany ๋งคํ์ ๋ณด ์ถ๊ฐ
@MappedBy ๋ ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉ. 5.4์ฑํฐ์์ ๋์ฌ ์์
5.3.2 ์ผ๋๋ค ์ปฌ๋ ์ ์กฐํ
Team team = em.find(Team.class, "team1");
List<Member> members = team.getMembers(); // ํ -> ํ์
// ๊ฐ์ฒด ๊ทธ๋ํ ํ์
5.4 ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
- ํ ์ด๋ธ์ ์ธ๋ ํค ํ๋๋ก ๋ ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ํฐํฐ๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ๋งคํํ๋ฉด ์ฐธ์กฐ๋ฅผ ํ๋๋ง ์ฌ์ฉํ๋ค.
- ํ์ง๋ง ์๋ฐฉํฅ์ผ๋ก ๋งคํํ๊ฒ ๋๋ฉด ์๋ก๋ฅผ ์ฐธ์กฐํด์ผํ๋ค.
- = ๊ด๋ฆฌํฌ์ธํธ๊ฐ 2๊ณณ์ผ๋ก ๋์ด๋๋ค.
- ์ํฐํฐ๋ฅผ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ก ์ค์ ํ๋ฉด ์ฐธ์กฐ๋ ๋, ์ธ๋ํค๋ 1๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
- ๋ฐ๋ผ์ ๊ตฌ ๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ ์ค ํ๋๋ฅผ ์ ํด์ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ค.
5.4.1. ์๋ฐฉํฅ ๋งคํ์ ๊ท์น : ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ด๊ด๊ณ์ ๋งคํ๋๊ณ , ์ธ๋ํค๋ฅผ ๊ด๋ฆฌ (๋ฑ๋ก, ์์ , ์ญ์ ) ํ ์ ์๋ค.
์๋ ์ชฝ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
@Mapped ์์ฑ
- ์ฃผ์ธ์ MappedBy์์ฑ์ ์ฌ์ฉํ์ง ์๋๋ค
- ์ฃผ์ธ์ด ์๋๋ฉด ์์ฑ์ ๊ฐ์ ์ฃผ์ธ์ ์ง์ ํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.
5.4.2. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ธ๋ํค๊ฐ ์๋ ๊ณณ
- ํ์ ํ ์ด๋ธ์ด ์ธ๋ ํค๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก Member.team์ด ์ฃผ์ธ
- ์ฃผ์ธ์ด ์๋ Team.members์๋ mappedBy=โteamโ ์์ฑ์ ์ฌ์ฉํด์ ์ฃผ์ธ์ด ์๋์ ์ค์
@OneToMany(mappedBy = "team")
private List<Membmer> members = new ArrayList<>();
mappedBy ๊ฐ์ผ๋ก ์ฌ์ฉ๋ team์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ธ Member.team
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ค๋์ผ, ์ผ๋๋ค ๊ด๊ณ์์๋ ํญ์ ๋ค ์ชฝ์ด ์ธ๋ํค๋ฅผ ๊ฐ์ง. ๋ค ์ชฝ์ธ @ManyToOne์ ํญ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ค.
๋ฐ๋ผ์ @ManyToOne์๋ mappedBy์์ฑ์ด ์๋ค.
5.5 ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ์ ์ฅ
team.getMembers().add(member1); //๋ฌด์ : ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋
team.getMembers().add(member2); //๋ฌด์ : ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋
member1.setTeam(team1) //์ฐ๊ด๊ด๊ณ ์ค์ : ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
member2.setTeam(team1); //์ฐ๊ด๊ด๊ณ ์ค์ : ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
5.6 ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์์
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ์ค์ ์์ ๊ฐ์ฅ ํํ ์ค์๋ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์๊ฒ ๊ฐ์ ์ ๋ ฅํ์ง ์๊ณ , ์๋ ๊ณณ์๋ง ๊ฐ์ ์ ๋ ฅํ๋ ๊ฒ์ด๋ค.
team.getMembers().add(member1); //๋ฌด์ : ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋
team.getMembers().add(member2); //๋ฌด์ : ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋
em.persist(team)
์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ด ์๋ Team์๋ง ๊ฐ์ ์ ๋ ฅํ๊ธฐ ๋๋ฌธ์ ์ค์ DB์ ์ ์ฅ๋์ง ์์.
5.6.1. ์์ํ ๊ฐ์ฒด๊น์ง ๊ณ ๋ คํ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
๊ฐ์ฒด ๊ด์ ์์ ์์ชฝ ๋ฐฉํฅ์ ๋ชจ๋ ๊ฐ์ ์ ๋ ฅํด์ฃผ๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ํ๋ค.
member1.setTeam(team);
team.getMembers().add(member1);
em.persist(member1)
5.6.2. ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋
public class Member {
private Team team;
public void setTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}
//์ฐ๊ด๊ด๊ณ ์ค์
member1.setTeam(team1);
5.6.3. ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋ ์์ฑ์ ์ฃผ์์ฌํญ
์ฌ์ค ๋ฒ๊ทธ๊ฐ ์๋ค.
๊ธฐ์กด ์ฐ๊ด๊ด๊ณ๋ฅผ ์ญ์ ํ์ง ์์๋ค. ๋ฐ๋ผ์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
public class Member {
public void setTeam(Team team) {
//๊ธฐ์กด ํ๊ณผ ๊ด๊ณ๋ฅผ ์ ๊ฑฐ
if (this.team != null) {
this.team.getMembers().remove(this);
}
this.team = team;
team.getMembers().add(this);
}
}
5.7 ์ ๋ฆฌ
์๋ฐฉํฅ์ ์ฅ์ ์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ๊ฐ์ฒด ๊ทธ๋ํ ํ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๊ฒ ๋ฟ์ด๋ค.
์ฃผ์ธ์ ๋ฐ๋ํธ์ MappedBy๋ก ์ฃผ์ธ์ ์ง์ ํด์ผํ๋ค.
- ๋จ๋ฐฉํฅ ๋งคํ๋ง์ผ๋ก ํ ์ด๋ธ๊ณผ ๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ์ด๋ฏธ ์๋ฃ๋์๋ค.
- ๋จ๋ฐฉํฅ์ ์๋ฐฉํฅ์ผ๋ก ๋ง๋ค๋ฉด ๋ฐ๋๋ฐฉํฅ์ผ๋ก ๊ฐ์ฒด ๊ทธ๋ํ ํ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ค.
- ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํ๋ ค๋ฉด ๊ฐ์ฒด์์ ์์ชฝ ๋ฐฉํฅ์ ๋ชจ๋ ๊ด๋ฆฌํด์ผ ํ๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ธ๋ ํค์ ์์น์ ๊ด๋ จํด์ ์ ํด์ผํ์ง ๋น์ฆ๋์ค์ ์ค์๋๋ก ์ ๊ทผํ๋ฉด ์๋๋ค.
**์๋ฐฉํฅ ๋งคํ์์๋ ๋ฌดํ ๋ฃจํ์ ์กฐ์ฌํด์ผํ๋ค.**
Member.toString()์์ getTeam()์ ํธ์ถํ๊ณ Team.toString()์์ getMember()์ ํธ์ถํ๋ฉด ๋์์๋ ์ฌ๊ทํจ์๊ฐ ๋์ด ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์๋ค.
๋ค ์ชฝ์ด ์๋ ๋จ ์ชฝ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ํ ์๋ ์๊ธด ํ๋ค. ๋ค๋ง ์ฑ๋ฅ์ด๋ ๊ด๋ฆฌ ์ธก๋ฉด์์ ๊ถ์ฅํ์ง ์๋๋ค. 6์ฅ ์ฐธ๊ณ