๋ชฉ์ฐจ
๋ชฉํ : "๊ฐ์ฒด์ ์ฐธ์กฐ์ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๋งคํ"
์๋๋ฆฌ์ค
- ํ์๊ณผ ํ์ ๋ค๋์ผ ๊ด๊ณ์ด๋ค.
- N๋ช ์ ํ์์ 1๊ฐ์ ํ์ ์์๋ ์ ์๋ค.
- 1๊ฐ์ ํ์ N๋ช ์ ํ์์ ๊ฐ์ง ์ ์๋ค.
๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ๋ง์ถ์ด ๋ชจ๋ธ๋ง : ์ธ๋ํค๋ฅผ ๊ทธ๋๋ก ๊ฐ์ฒด์ ๊ตฌํ
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId()); //โญโญโญ ์๋ณ์ ์ ์ฅ
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
Team findTeam = em.find(Team.class, team.getId()); //โญโญโญ ์๋ณ์ ์กฐํ
๋ฐ์ดํฐ ์ค์ฌ ๋ชจ๋ธ๋ง์ ๋ฌธ์ ์
ํ ์ด๋ธ์ ์ธ๋ํค๋ก ์กฐ์ธ์ ์ฌ์ฉํ์ฌ ์ฐ๊ด๋ ํ ์ด๋ธ์ ์ฐพ๋๋ค.
ํ์ง๋ง ๊ฐ์ฒด๋? ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๋๋ค.
=> ์ด๋์..๋ง์ถ์ง?!
๊ฐ์ฒด ์งํฅ ๋ชจ๋ธ๋ง : ๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ ์ฌ์ฉ
JPA์๊ฒ ๊ฐ์ฒด ๊ฐ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋ ค์ฃผ์ด์ ํ ์ด๋ธ์๋ ์ฐ๊ด๊ด๊ณ๊ฐ ์ ์ฉ๋๋๋ก ํด์ผํ๋ค.
๋จ๋ฐฉํฅ ๋งคํ
1. ์ฐ๊ด๊ด๊ณ ํ์ : ๋๊ฐ 1์ด๊ณ ๋๊ฐ N์ธ๊ฐ?
Team์ด 1์ด๊ณ Member๊ฐ N์ด๋ค.
Teamํ ์ด๋ธ์ PK๊ฐ ์๊ณ Memberํ ์ด๋ธ์ FK๊ฐ ์๋ค.
2. N์ @ManyToOne, @JoinColumn์ ์์ฑํ๋ค
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne //โญโญโญ Member๊ฐ N(many), Team์ด 1(one)์ด๋ค.
@JoinColumn(name = "team_id") //โญโญโญ team_id๋ก FK ์ค์ ํ๋ค.
private Team team;
}
@Entity
public class Team{
@Id @GeneratedValue
private Long id;
private String name;
}
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); //โญโญโญ ์ฐธ์กฐ ์ ์ฅ
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
Team findTeam = fiindMember.getTeam(); //โญโญโญ ์ฐธ์กฐ ์กฐํ
์๋ฐฉํฅ ๋งคํ
1. ์ฐ๊ด๊ด๊ณ ํ์ : ๋๊ฐ 1์ด๊ณ ๋๊ฐ N์ธ๊ฐ?
Team์ด 1์ด๊ณ Member๊ฐ N์ด๋ค.
Teamํ ์ด๋ธ์ PK๊ฐ ์๊ณ Memberํ ์ด๋ธ์ FK๊ฐ ์๋ค.
Team๊ฐ์ฒด๋ List<Member>๊ฐ ์๊ณ Member๊ฐ์ฒด๋ Team์ด ์๋ค.
Team์ด ์๋(Member)๋ฅผ N๊ฐ ๊ฐ์ ธ์ฌ ์ ์๊ณ , Member๋ ์๋(Team)์ 1๊ฐ ๊ฐ์ ธ์ฌ ์ ์๋ค.
2. N์ @ManyToOne, @JoinColumn์ ์์ฑํ๋ค
1์ @OneToMany(mappedBy="~")๋ฅผ ์์ฑํ๋ค.
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne //โญโญโญ Member๊ฐ N(many), Team์ด 1(one)์ด๋ค.
@JoinColumn(name = "team_id") //โญโญโญ team_id๋ก FK ์ค์ ํ๋ค.
private Team team;
}
@Entity
public class Team{
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team") //โญโญโญ Team์ด 1(one), Member๊ฐ N(many)์ด๋ค.
private List<Member> members = new ArrayList<>(); //addํ ๋ NullPointerException์๋จ๊ฒ!
//mappedBy์๋ One์ ํด๋น๋๋ ๊ฐ์ฒด์ ์ด๋ค ํ๋์ ์ฐ๊ด๋์ด์๋์ง ์์ฑ
}
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); //โญโญโญ ์ฐธ์กฐ ์ ์ฅ
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
Team findTeam = fiindMember.getTeam(); //โญโญโญ ์ฐธ์กฐ ์กฐํ
List<Member> members = findTeam.getMembers(); //โญโญโญ ์ฐธ์กฐ ์กฐํ
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ์๋ ๋ฐฉํฅ์ด ์์ง๋ง, ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ์๋ ๋ฐฉํฅ์ด ์๋ค!
์๋ฐฉํฅ ๋งคํ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
๊ฐ์ฒด | ํ ์ด๋ธ |
Member → Team ๋จ๋ฐฉํฅ 1๊ฐ Member ← Team ๋จ๋ฐฉํฅ 1๊ฐ |
Member ↔ Team ์๋ฐฉํฅ 1๊ฐ |
๊ฐ์ฒด์ ์๋ฐฉํฅ๊ด๊ณ๋ ์๋ก ๋ค๋ฅธ ๋จ๋ฐฉํฅ๊ด๊ณ 2๊ฐ์ด๋ค.
ํ ์ด๋ธ์ ์ธ๋ํค ํ๋๋ก ๋ ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ค. (์กฐ์ธ)
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ : ํ ์ด๋ธ์์ ์ธ๋ํค๊ฐ ์๋ ๊ณณ์ ์ฃผ์ธ์ผ๋ก ํ์
์๋ฐฉํฅ ๋งคํ ๊ท์น
- ๋ ๊ฐ์ฒด ์ค ํ๋๋ง ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ง์
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ์ธ๋ํค๋ฅผ ๊ด๋ฆฌ(๋ฑ๋ก, ์์ )
- ์ฃผ์ธ์ด ์๋ ์ชฝ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅ
- ์ฃผ์ธ์ด ์๋์ชฝ์ด mappedBy์์ฑ์ ์ฌ์ฉํ๋ค. (์ด๋ฏธ ๋๊ตฐ๊ฐ์ ์ํด ์ฐ๊ด์ด ๋์ด์ ธ์๋ค.)
ํ ์ด๋ธ์์ ์ธ๋ํค๊ฐ ์๋ ๊ณณ์ ๋ฐ๋๋ฅผ ์ฃผ์ธ์ผ๋กํ๋ฉด??
์ฌ๊ธฐ์ Team์ ์ฃผ์ธ์ผ๋ก ํ๋ค๊ณ ์๊ฐํด๋ณด์.
List<Member>๋ฅผ ์์ ํ๋ฉด Team์ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ ๊ฒ์ด ์๋ Member์ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๊ฒ๋๋ค. (์์ ์ฃผ์ฒด๋ Team์ธ๋ฐ..)
์๋ฐฉํฅ ๋งคํ ์ ๊ฐ์ฅ ๋ง์ด ํ๋ ์ค์!
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋ ๊ณณ์ ๊ฐ์ ๋ฃ๋ ๊ฒ
ํ์ฌ Member๊ฐ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๊ณ , Team์ ์ฃผ์ธ์ด ์๋๋ค.
Member member = new Member();
member.setName("member1");
//member.setTeam(team); //โญโญโญ ์ฃผ์์ฒ๋ฆฌ
em.persist(member);
Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member); //โญโญโญ ์ฐธ์กฐ์ ์ฅ
em.persist(team);
์ฃผ์ธ์ด ์๋ ๊ณณ(Team)์ Member๋ฅผ ์ถ๊ฐํ๋ค.
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋?
Team์ null์ด ๋ค์ด๊ฐ๋ค.
์ฃผ์ธ์ด ์๋ ๊ณณ(Team)์ Member๋ฅผ ์ถ๊ฐํด๋ DB์ ๋ฐ์๋์ง ์๋๋ค.
Team team = new Team();
team.setName("TeamA");
//team.getMembers().add(member); //โญโญโญ ์ฃผ์์ฒ๋ฆฌ
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); //โญโญโญ ์ฐธ์กฐ์ ์ฅ
em.persist(member);
์ฃผ์ธ์ธ ๊ณณ(Member)์ Team์ ์ถ๊ฐํ๋ค.
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋?
๊ฐ์ด ์ ์์ ์ผ๋ก ๋ค์ด๊ฐ๋ค.
(..์ผ๋จ ํท๊ฐ๋ฆฐ๋ค.)
๊ฐ์ฒด์ ์ฅ์์ ์๊ฐํด๋ณด์.
Member์ ์ฅ์์๋ setTeam(team)์ ํด์ฃผ์ด์ผ Team๊ฐ์ด ์ ๋ ฅ๋๊ณ
Team์ ์ฅ์์๋ add(member)์ ํด์ฃผ์ด์ผ Member๊ฐ ๋ฆฌ์คํธ์ ์ ์ฅ๋๋ค.
๊ฒฐ๋ก : ์๋ฐฉํฅ ๋งคํ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ ์๋๋ ๋๋ค ๊ฐ์ ๋ฃ์ด์ฃผ์!!
์๋๋ฉด, ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ธ Member์ setTeam()๋ฉ์๋๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ์
(์์ ๋ฆฌ์คํธ์ ๋ฃ์ด์ฃผ๋ ๋ก์ง๊น์ง ์ถ๊ฐ!)
public class Member{
public void setTeam(Team team){
this.team = team;
team.getMembers().add(this);
}
}
์๋ฐฉํฅ ๋งคํ ์ ๋ฌดํ๋ฃจํ ์กฐ์ฌ!
- toString()
public class Member{
@Override
public String toString(){
return "Member{" + "id=" + id + ", username=" + username + ", team=" + team + "}";
}
}
public class Team{
@Override
public String toString(){
return "Team{" + "id=" + id + ", name=" + name + ", members=" + members + "}";
}
}
Member์ team์์ Team์ ํธ์ถ
Team์ members์์ ๋ค์ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๋งํผ Memberํธ์ถ....
์ปจํธ๋กค๋ฌ์์ Entity๋ฅผ JSON์ผ๋ก ๋ฐ๊ฟ์ ๊ทธ๋๋ก ์๋ตํด์ฃผ๊ฒ๋๋ฉด
JSON์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ์ ๋ฌดํ๋ฃจํ๋ก ํธ์ถํ๊ฒ๋๋ค!
์ ๋ฆฌ
- ๋๋๋ก ๋จ๋ฐฉํฅ ๋งคํ์ผ๋ก ์ฐ๊ด๊ด๊ณ ๋งคํ์ ๋๋ด์
- ์๋ฐฉํฅ ๋งคํ์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๊ฒ ๋ฟ์ด๋ค.
- ์ ๋ง ํ์ํ ๊ฒฝ์ฐ์๋ง! ์๋ฐฉํฅ ๋งคํ์ ๊ฑธ์ด์ฃผ์
์ฐธ๊ณ : ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ
'๐พ Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ(๋ค๋์ผ, ์ผ๋์ผ, ๋ค๋๋ค) (0) | 2022.02.21 |
---|---|
[JPA]์์์ฑ ๊ด๋ฆฌ : ๋ด๋ถ ๋์ ๋ฐฉ์ (0) | 2022.02.21 |
[JPA] Java Persistence API ๋ฑ์ฅ๋ฐฐ๊ฒฝ, ์ฌ์ฉ๋ฐฉ๋ฒ (0) | 2022.01.28 |
[MyBatis] ๋์์๋ฆฌ, ์ฌ์ฉ๋ฐฉ๋ฒ ์ ๋ฆฌ (0) | 2022.01.27 |
[JDBC] ์ฌ์ฉ๋ฐฉ๋ฒ (0) | 2022.01.26 |