๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด Team์ ์ํ Member๋ค์ ๊ฐ์ ธ์์ผํ ๋๊ฐ ์๋ค!
Member ํ ์ด๋ธ์์ Team์ ์กฐํ? Team์์ Member๋ฅผ ์กฐํ?
๊ฐ์ฒด ์ค๊ณ๋ Member ์์ Team์ ๊ฐ์ง๊ณ ์๊ณ , Team์์๋ Members๋ฅผ ๊ฐ์ง๊ณ ์๋๋ก ์ค๊ณํ๋ค.
ํ ์ด๋ธ ์์์๋, ๋จ๋ฐฉํฅ ๋งคํ๊ณผ ๋ฐ๋๋ ๊ฒ์ด ์๋ค.
๋์ JOIN์ ํตํด์ ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์๋ค! DB๋ ๋ฐฉํฅ์ด ์๋ค.
๋ค๋์ผ ๊ด๊ณ์ค ์ผ(1)์ ์ํฐํฐ์ ์ปฌ๋ ์ ์ ์ถ๊ฐํด์ค๋ค.
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
public void addMember(Member member) {
member.setTeam(this);
members.add(member);
}
}
์ญ๋ฐฉํฅ์ผ๋ก ๋ฉค๋ฒ๋ค์ ์กฐํํ ์ ์๋ค.
Team findTeam = em.find(Team.class, team.getId());
List<Member> members = findTeam.getMembers();
์ฐ๊ด๊ด๊ณ ์ฃผ์ธ๊ณผ mappedBy
DB ํ ์ด๋ธ์์๋ FK ์ ์ธ์ผ๋ก ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์๋ค. Join์ ํตํด์ ํ ์ด๋ธ์ ๊ด๊ณ๋ฅผ ๋ชจ๋ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ฐ์ฒด์ ํ ์ด๋ธ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋ ์ฐจ์ด
ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ
Member < - > Team (์๋ฑกํฅ)
ํ ์ด๋ธ์ ์ธ๋ํค ํ๋ก ๋ ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ค.
Member ํ ์ด๋ธ์ team_id ์ธ๋ํค ํ๋๋ก ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค. (์์ชฝ์ผ๋ก ์กฐ์ธ์ ํ ์ ์๋ค)
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ
Member -> Team์ ์ฐ๊ด๊ด๊ณ 1๊ฐ (๋จ๋ฐฉํฅ)
Team -> Member์ ์ฐ๊ด๊ด๊ณ 1๊ฐ (๋จ๋ฐฉํฅ)
๊ฐ์ฒด์ ์๋ฐฉํฅ ๊ด๊ณ๋ ์๋ก ๋ค๋ฅธ ๋จ๋ฐฉํฅ ๊ด๊ณ 2๊ฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๊ฐ์ฒด๋ฅผ ์๋ฐฉํฅ์ผ๋ก ์ฐธ์กฐํ๊ธฐ ์ํด์๋ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ต์ง๋ก ๋ง๋ค์ด์ผํ๋ค.
๋ ์ค ํ๋๋ก ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํด์ผํ๋ค. => ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด !
๋ฉค๋ฒ์ ํ์ ๋ฃ๊ณ , ํ์ ๋ฉค๋ฒ๋ฅผ ๋ฃ์ด์ฃผ๋๋ฐ ์ฐ๊ด๊ด๊ณ๋ ์ด๋ค๊ฑธ๋ก ๋งคํ์ ํด์ผํ๋์ง ์๋ฌธ์ด ์๊ธฐ๊ฒ ๋๋ค.
๋ฉค๋ฒ์ ํ๊ฐ์ ์ ๋ฐ์ดํธํ ๋, FK๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๊ฒ ํ ๊ฒ์ธ์ง?
ํ์ members๋ฅผ ์ ๋ฐ์ดํธ ํ์๋ FK๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๋์ง?
DB์์๋ FK๊ฐ๋ง ์ ๋ฐ์ดํธ ํ๋ฉด ๋์๋๋ฐ! ์๋ฐฉํฅ ๊ด๊ณ ๋งคํ์์๋ ํ๋ช ์ ์ง์ ํด์ผํ๋ค!
๋๊ฐ! ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๊ด๋ฆฌํ๋ ์ชฝ์ผ๋ก ์๊ฐํ๋ฉด ์ฝ๋ค.
์๋ฐฉํฅ ๋งคํ ๊ท์น
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ์ธ๋ํค๋ฅผ ๊ด๋ฆฌ(๋ฑ๋ก, ์์ ) ํ๋ค.
- ์ฃผ์ธ์ด ์๋ ์ชฝ์ ์ฝ๋ ๊ฒ๋ง ๊ฐ๋ฅํ๋ค.
- mappedBy : ์ฃผ์ธ์ด ์๋ ์ชฝ์ด ์ฃผ์ธ์ ์ง์ ํ๋ค.
์ฃผ์ธ
์ธ๋ํค๊ฐ ์๋ ๊ณณ์ ์ฃผ์ธ์ผ๋ก ์ ํ๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๋น์ฆ๋์ค์ ์ผ๋ก ์ ๊ทผํ๊ธฐ ๋ณด๋ค, FK๋ฅผ ๊ฐ์ง ์ชฝ์ด ์ฃผ์ธ์ด ๋๋ฉด ๋๋ค.
์๋ฐฉํฅ ๋งค์นญ์ ๊ฐ์ฅ ๋ง์ด ํ๋ ์ค์
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
team.getMembers().add(member);
em.persist(member);
member๋ฅผ ์กฐํํด๋ณด๋ฉด TEAM_ID๊ฐ NULL์ธ ์ํฉ์ด ๋ฐ์ํ๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ ์ ๋ ฅํด์ผํ๋ค.
๊ตณ์ด team์ members์ปฌ๋ ์ ์ ๋ฉค๋ฒ๋ฅผ ๋ฃ์ด์ฃผ์ง ์์๋, ์ง์ฐ๋ก๋ฉ์ ํตํด์ ํด๋น ๋ฉค๋ฒ๋ฅผ ์กฐํํด์ฌ ์ ์๋ค.
ํ์ง๋ง, ์ง์ง ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ๊ณ ๋ คํ๋ค๋ฉด ํญ์ ์์ชฝ ๋ค ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด ๋ง๋ค.
(ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋, em.flush(), em.clear()๊ฐ ๋์ง ์์ ์ํฉ์์ 1์ฐจ ์ํ์์ ์บ์๋ ์ํ์์ ์กฐํํ๋ ค๊ณ ํ ๋ NPE๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ค์ด ์กด์ฌํจ)
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
em.persist(member);
// ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ ์ค์
member.setTeam(team);
team.getMembers().add(member);
// ์ด ๋์์ด ์ํ๋์ง ์์ผ๋ฉด FK๊ฐ ์ค์ ๋์ด ์์ง ์์ 1์ฐจ์บ์์๋ง ์์ํ ๋ ์ํ.
em.flush();
em.clear();
Team findTeam = em.find(Team.class, team.getId());
List<Member> findMembers = findTeam.getMembers();
for (Member m : findMembers) {
// flush, clear๊ฐ ์ผ์ด๋ ํ์๋ ํ์ Members์ ๋ฃ์ด์ฃผ์ง ์์์ง๋ง, ์กฐํ๋ฅผ ํ ์ ์๋ค
System.out.println(m.getUsername());
}
tx.commit();
์ฐ๊ด๊ด๊ณํธ์ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅ
ํธ์ ๋ฉ์๋์์๋ ์ฃผ์ธ์ชฝ์์ ์ฐ๊ด๊ด๊ณ์ ๊ฐ์ ์ค์ ํ ๋, ์ญ๋ฐฉํฅ ๊ฐ๋ ํจ๊ป ์ค์ ํด์ค๋ค. ๋ฉ์๋๋ฅผ ์์์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ์ ์ธํธ๋ก ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ์ค์ํ ์ผ์ด ์ค์ด๋ ๋ค.
class Member {
...
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}
class Team {
public addMember(Member member) {
member.setTeam(this);
members.add(member);
}
}
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ์ฃผ์ํ ์
lombok์ด ์๋์ผ๋ก ๋ง๋๋ toString()๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ฒ.
Member์ toString()
@Override
public String toString() {
return "Member{" +
"id=" + id +
", username='" + username + '\'' +
", team=" + team +
'}';
}
Team์ toString()
@Override
public String toString() {
return "Team{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
'}';
}
Member์ toString()์ ํธ์ถํ๋ ์๊ฐ Team์ toString()์ members๊ฐ ํธ์ถํ๋ ๊ฐ member์ toString() ๋๋ฌธ์ ๋ฌดํ๋ฃจํ๊ฐ ์์ฑ๋๋ค. ์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํจ.
JSON ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์๋ฐฉํฅ ๊ด๊ณ์ Entity๋ฅผ JSON์ผ๋ก ์๋ฆฌ์ผ๋ผ์ด์ฆ ํ๋ ์๊ฐ ๋ฌดํ๋ฃจํ์ ๋น ์ง๊ฒ ๋๋ค.
์ปจํธ๋กค๋ฌ์์๋ ์ํฐํฐ๋ฅผ ์ ๋ ์ง์ ๋ฐํํ๋ฉด์๋๋ค.
์ํฐํฐ > JSON์ ๋ฌดํ๋ฃจํ ๊ฑธ๋ฆฐ๋ค.
์ค๋ฌด์์๋ DTO๋ก ๋ณํํด์ ๋ฐํํ๋ฉด JSON ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ธํ ๋ฌธ์ ๋ ์์ด์ง ๊ฒ
์ฐธ์กฐ
https://www.inflearn.com/course/ORM-JPA-Basic