์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
โ ๋ค๋์ผ [N:1]
๋จ๋ฐฉํฅ
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์ฐ๊ด๊ด๊ณ
public class Member{
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // ์๋ต ๊ฐ๋ฅ jpa๊ฐ ์๋์ผ๋ก "ํด๋์ค์ด๋ฆ" + "_ID"๋ก ๋งคํ
private Team team;
}
------------------------------------
public class Team{
@Id @GeneratedValue
private Long id;
private String name;
}
@JoinColumn ์ด๋ ธํ ์ด์ ์ ์๋ตํ๋ฉด ์๋์ ๊ฐ์ ์ ๋ต์ ๋ฐ๋ผ ์ธ๋ ํค๋ฅผ ๋งคํํฉ๋๋ค.
ํ๋๋ช + “_” + ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค(@Id) ์ปฌ๋ผ๋ช
์ธ๋ํค์ TEAM์ ๊ธฐ๋ณธํค๋ฅผ ๋งคํ ์์ผ์ฃผ๋ฉด ๋๋ค.
์๋ฐฉํฅ
- ๋ค๋์ผ์์ ๋ค ๊ฐ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ค. (์ธ๋ํค๊ฐ ์๋ ์ชฝ์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ!)
Member
public class Member{
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
// getter, setter ..
}
Team
public class Team{
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members;
// getter, setter ..
}
๋จ๋ฐฉํฅ์์ Team์ ์ปฌ๋ ์ ์ ์ถ๊ฐ ์์ผ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์๋ฐฉํฅ ๋งคํ์ ๊ฐ ๋ฃ์ ๋ ์ค์ํ์ง ๋ง๊ธฐ!!
// team ์์ฑ
Team team = new Team();
team.setName("team 1");
// member ์์ฑ
Member member1 = new Member();
member1.setName("member1");
em.persist(member1);
// member -> Team์ ๋ฃ์ด์ค๋ค.
team.getMembers().add(member1);
์คํ์ ํ๋ฉด?
๋น์ฐํ๊ฒ๋ member์ team_id๊ฐ ์๋ค์ด๊ฐ๋ค. ์ ๊ทธ๋ฐ์ง ๊น๋จน์๋ค๋ฉด ๋ค์ ๊ณต๋ถํ์ .. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ(Owner)
[5 - 3) ์ฐ๊ด๊ด๊ณ ๋งคํ ๊ธฐ์ด - ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค
iseunghan.tistory.com](https://iseunghan.tistory.com/173?category=934316)
์ด์ ๋, team์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋๋ผ์ ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์ ๋๋ก ์๋ค์ด๊ฐ ๊ฒ์ด๊ณ ,
..
team.getMembers().add(member);
member.setTeam(team); // * ์ค์ *
member์ team์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค!
โ ์ผ๋๋ค [1:N] (์ด ๋ชจ๋ธ์ ๊ถ์ฅํ์ง ์์)
์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ๋ณด๋ค๋ ๋ค๋์ผ ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉํ๋๊ฒ ์ข๋ค.
์ ๊ทธ๋ฐ์ง๋ ํจ๊ป ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- ์ผ๋๋ค ๋จ๋ฐฉํฅ
์ฝ๋
Team
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID") // ์กฐ๊ธ ์ด์ํ ๋ถ๋ถ(?), ์ธ๋ํค๋ฅผ ๋งคํํด์ค๋ค (์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ค์ )
private List<Member> members = new ArrayList<>();
// getter, setter..
}
@JoinColumn ์ ๊ผญ ํด์ค์ผ ํ๋ค. ์๊ทธ๋ฌ๋ฉด join table๋ก ๋์ด ์ค๊ฐ ํ ์ด๋ธ์ด ์์ฑ๋๊ฒ ๋๋ค.
Member
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
// getter, setter ..
}
Main
// team์ ๋ง๋ค์ด ์ค๋ค.
Team team = new Team();
team.setName("team 1");
// member 3๋ช
์์ฑ
Member member1 = new Member();
member1.setName("member1");
em.persist(member1);
Member member2 = new Member();
member2.setName("member2");
em.persist(member2);
Member member3 = new Member();
member3.setName("member3");
em.persist(member3);
// member๋ค์ Team์ ๋ฃ์ด์ค๋ค. (์ฐ๊ด๊ด๊ณ ์ฃผ์ธ๋ง ์์ ,์ญ์ ๊ฐ๋ฅ!!)
team.getMembers().add(member1);
team.getMembers().add(member2);
team.getMembers().add(member3);
em.persist(team);
tx.commit();
์คํ์ ํด์ฃผ๋ฉด,
insert ์ฟผ๋ฆฌ๊ฐ ์ด 4๊ฐ (member 3๊ฐ, team 1๊ฐ) ๊ฐ ์ ๋๊ฐ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ?
?!!
๋๋ ๋ถ๋ช team์ ์๋ members (List)๋ฅผ ๋ฐ์์์ add(member1,2,3)์ ํด์คฌ๋๋ฐ, ์ update M**ember ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ ๊ฑฐ์ง?** ๋ผ๊ณ ํ ์ ์๋ค.
์ด์ ๋ ๊ฐ๋จํ๋ค. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ Team์ผ๋ก ์ค์ ๋์์ง๋ง, ์ธ๋ํค์ ์์น๋ (์ผ๋๋ค์ ๋ค์ ํด๋นํ๋) memberํ ์ด๋ธ์ ์๊ธฐ ๋๋ฌธ์, team์ add๋ฅผ ํด๋ ์ฟผ๋ฆฌ๋ Member์ ๋ํด์ ๋๊ฐ๊ฒ ๋๋ค.
- ์ํฐํฐ๊ฐ ๊ด๋ฆฌํ๋ ์ธ๋ํค๊ฐ ๋ค๋ฅธ ํ ์ด๋ธ์ ์๋ค.
- ์ธ๋ํค๊ฐ Team ํ ์ด๋ธ์ด ์๋, Member ํ ์ด๋ธ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๊ด๊ด๊ณ ๊ด๋ฆฌ๋ฅผ ์ํด ์ถ๊ฐ๋ก UPDATE SQL ์คํ
- ์ผ๋๋ค ์๋ฐฉํฅ
Member
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne
private Team team; // team๋ง ๋ฃ์ด์ค๋ค.
// getter, setter ..
}
โ ์ผ๋์ผ [1:1]
๐๊ฐ์ฅ ์ ํธํ๋ ๋ฐฉ๋ฒ__ ์ฃผ ํ ์ด๋ธ์ ์ธ๋ ํค ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ
- ๋จ๋ฐฉํฅ
- ์ธ๋ํค์ ์์น๋ฅผ ์ ํ ๊ฐ๋ฅ
- ์ธ๋ํค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ํฌ(UNI) ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
์ผ๋์ผ ๋จ๋ฐฉํฅ ์๊ฐํด๋ณด๊ธฐ
์ธ๋ํค๋ฅผ ์ด๋์ ๋ฃ์์ง ์ฃผํ ์ด๋ธ์ ๋จผ์ ์ ํด์ผํ๋ค. ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ดค์ ๋, Member๊ฐ Locker๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์ ์์ด๋ Locker๊ฐ Member๊ฐ ์๋๋ฐ ํ ๋น๋ ๊ฒ์ ๋ญ๊ฐ ์ด์ํ๋ค. ํ์์ด ์๊ธฐ๋ฉด ๊ทธ๋ ๋ฝ์ปค๋ฅผ ํ๋ ๋ฐฐ์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์งํฅ๊ด์ ์ผ๋ก ๋ดค์ ๋ Member๊ฐ Locker๋ฅผ ์์ ํ๊ณ ์๋๊ฒ ๋ ์์ฐ์ค๋ฝ๋ค. ๊ทธ๋์ Member๊ฐ ์ฃผํ ์ด๋ธ์ด ๋๋ค.
public class Member{
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
--------------------------------
public class Locker{
@Id @GeneratedValue
private Long id;
private String name;
}
๋ค๋์ผ(@ManyToOne) ๋จ๋ฐฉํฅ ๋งคํ๊ณผ ์ ์ฌํ๋ค.
- ์๋ฐฉํฅ
- ๋ค๋์ผ ์๋ฐฉํฅ ๋งคํ ์ฒ๋ผ ์ธ๋ํค๊ฐ ์๋ ๊ณณ์ด ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ
- ๋ฐ๋ํธ์ mappedBy ์ ์ฉ
public class Member{
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
--------------------------------
public class Locker{
@Id @GeneratedValue
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
์ฃผ์ธ์ด ์๋์ชฝ์ mappedBy๋ฅผ ์ฌ์ฉํด์ ๋งคํ์์ผ์ค๋ค.
๋์ ํ ์ด๋ธ์ ์ธ๋ํค ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ
- ๋์ ํ
์ด๋ธ์ ์ธ๋ํค ๋จ๋ฐฉํฅ ์ ๋ฆฌ
- ๋จ๋ฐฉํฅ ๊ด๊ณ๋ JPA๊ฐ ์ง์ X
- ์๋ฐฉํฅ ๊ด๊ณ๋ ์ง์ O
- ๋์ ํ
์ด๋ธ์ ์ธ๋ํค ์๋ฐฉํฅ
- ์ผ๋์ผ ์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค ์๋ฐฉํฅ ๋งคํ๋ฐฉ๋ฒ๊ณผ ๊ฐ์