@JoinColumn
์ธ๋ ํค๋ฅผ ๋งคํํ ๋ ์ฌ์ฉํฉ๋๋ค.
name ์์ฑ์๋ ๋งคํํ ์ธ๋ ํค ์ปฌ๋ผ๋ช (์ด๋ฆ)์ ์ง์ ํฉ๋๋ค.
์์ฑ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ |
name | ๋งคํํ ์ธ๋ ํค ์ปฌ๋ผ๋ช | ํ๋๋ช _[์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ์ปฌ๋ผ๋ช ] |
referencedColumnName | ์ธ๋ ํค๊ฐ ์ฐธ์กฐํ๋ ๋์ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช | ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ์ปฌ๋ผ๋ช |
foreignKey (DDL) | ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ ์ง์ ์ง์ ํ ๋ ์ฌ์ฉํ๋ฉฐ, ํ ์ด๋ธ์ ์์ฑํ ๋๋ง ์ฌ์ฉํ๋ค. | |
unique nullable insertable updatable columnDefinition table |
@Column์ ์์ฑ๊ณผ ๋์ผํ๋ค. |
name๊ณผ referencedColumnName์ ์ฐฉ๊ฐํ์ง ์๋๋ก ์ฃผ์ํ์
name์ ๋จ์ง ๋งคํํ ์ธ๋ ํค์ ์ด๋ฆ, ์ฆ ๋จ์ํ ์ปฌ๋ผ๋ช ์ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ ๋๋ค.
referencedColumnName๋ ํด๋น ์ธ๋ ํค๊ฐ, ๋์ ํ ์ด๋ธ์ ์ด๋ค ์ปฌ๋ผ์ ์ฐธ์กฐํ๋์ง๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ name์ ๋ง์๋๋ก ์ง์ ํด์ฃผ์ด๋ ๋์ง๋ง, referencedColumnName๋ ๋ง์๋๋ก ์ง์ ํด์ฃผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
@JoinColumn์ ์๋ต
๋ง์ฝ @JoinColumn์ ์๋ตํ๋ค๋ฉด, ์ธ๋ ํค๋ฅผ ์ฐพ์ ๋ ๋ค์ ๊ธฐ๋ณธ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
ํ๋๋ช _[์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ์ปฌ๋ผ๋ช ]
์์
@ManyToOne
private Team team;
team_TEAM_ID
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
ํ ์ด๋ธ์ ์ธ๋ ํค ํ๋๋ก ๋ ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฒด๋, ์๋ฐฉํฅ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
์ฆ ์ฐธ์กฐ๊ฐ ๋ ๋ฒ ํ์ํฉ๋๋ค.
์ฆ ๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ๋งคํํ ๋์๋ ๋ ๊ฐ์ฒด ์ค ์ด๋ค ๊ฐ์ฒด๋ก ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋์ง์ ๋ํ ๊ณ ๋ฏผ์ด ์๊น๋๋ค.
์ฌ๊ธฐ์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ผ ๋ถ๋ฆ ๋๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ ํ๋ค๋ ๊ฒ์, ์ธ๋ ํค ๊ด๋ฆฌ์๋ฅผ ์ ํํ๋ ์๋ฏธ์ ๊ฐ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ด๋ป๊ฒ ์ ํด์ผ ํ ๊น์?
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ ํ๋ ๋ฒ
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ ํ ๋๋, ํ ์ด๋ธ์ ์ธ๋ ํค๊ฐ ์๋ ๊ณณ์ผ๋ก ์ ํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ค๋ ์ผ, ์ผ๋ ๋ค ๊ด๊ณ์์๋ ํญ์ ๋ค ์ชฝ์ด ์ธ๋ ํค๋ฅผ ๊ฐ์ง๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ปฌ๋ ์ ์ ๋ด์ ์ ์๊ธฐ์, ์ผ ์ชฝ์์ ์ธ๋ ํค๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
(๊ทธ๋ฌ๋ ๋ค๋ ์ผ ๊ด๊ณ์์ ์ผ ์ชฝ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๊ธด ํ๋๋ฐ, ์ด๋ ๋ค์ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.)
์๋ฐฉํฅ ๋งคํ ์ ์ฃผ์ํ ์
์๋ฐฉํฅ ๋งคํ ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ง์ ๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ด๊ด๊ณ์ ๋งคํ๋๊ณ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฆ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ์ธ๋ ํค๋ฅผ ๋ฑ๋ก, ์์ , ์ญ์ ํ ์ ์์ผ๋ฉฐ, ์ฃผ์ธ์ด ์๋ ์ชฝ์ ์ค์ง ์ธ๋ ํค๋ฅผ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ์ด ์ ๋ง ์ค์ํ๋ฐ, ์๋ฌด๋ฆฌ ์ฃผ์ธ์ด ์๋ ๊ณณ์์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํด ๋ณด์๋ดค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ ์ฉ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ๊ผญ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ ์ธํ ํด ์ฃผ์ด์ผ ํ๋ฉฐ, ๊ฐ๊ธ์ ๋ ๊ฐ์ฒด ๋ชจ๋์๊ฒ ๊ฐ์ ์ธํ ํด์ฃผ๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ด๋ จ๋ ์ข์ ์์์ด ์์ต๋๋ค.
[๋ฐฑ๊ธฐ์ ๋์ ์ ํ๋ธ - "์ด ๋ฌธ์ ๋ต ๋ชจ๋ฅด๋ฉด ์ ๋ฐ JPA ์ฐ์ง ๋ง์ธ์. ๊ณต๋ถ๋ฅผ ํ๊ฑฐ๋. feat ์์ฐ"]
์ฃผ์์ฌํญ
๋ฐ๋ก ์์์ ๋ค์๊ณผ ๊ฐ์ด ์ธ๊ธํ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ผญ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ ์ธํ ํด ์ฃผ์ด์ผ ํ๋ฉฐ, ๊ฐ๊ธ์ ๋ ๊ฐ์ฒด ๋ชจ๋์๊ฒ ๊ฐ์ ์ธํ ํด์ฃผ๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Team team = new Team();
em.persist(team);
em.flush();
Member member = new Member();
member.setTeam(team);
em.persist(member);
em.flush();
//em.clear();
Team team1 = em.find(Team.class, 1L);
System.out.println(team1.getMemberList().size());
Team team = new Team();
em.persist(team);
em.flush();
Member member = new Member();
member.setTeam(team);
em.persist(member);
em.flush();
em.clear();
Team team1 = em.find(Team.class, 1L);
System.out.println(team1.getMemberList().size());
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ 0์ด๊ณ , ์๋ ์ฝ๋์ ๊ฒฐ๊ณผ๋ 1์ ๋๋ค.
Team์์๋ member๋ฅผ ์ถ๊ฐํด์ฃผ์ง ์์ ์ํ๋ก ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํฉ๋๋ค.
์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋น์ฐ์ง ์๊ณ Team์ ๋ฐ๋ก ์กฐํํ๋ฉด DB์๋ Member์ FK๊ฐ ๋ฐ์๋์์ผ๋ ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์์ ์กด์ฌํ๋ team์ member๋ฆฌ์คํธ์๋ member๊ฐ ์๊ธฐ์ 0์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ๋๋ค.
em.clear()๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋น์์ค ํ DB์์ ์กฐํํ๋ฉด, ๊ทธ์ ์์ผ ์ฐ๊ด๋ member๋ฅผ ์กฐํํ๊ธฐ์ 1์ด ์ถ๋ ฅ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด์, ๊ฐ๊ธ์ ๊ฐ์ฒด ์ ์ชฝ์ ๋ชจ๋ ๊ฐ์ ์ธํ ํด ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
mappedBy
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํด์ฃผ๋ ์์ฑ์ ๋๋ค.
๋ค์ ๋ฌธ์ฅ์ ์คํํ๋ค๊ณ ํ ์ ์์ต๋๋ค.
๋๋ ๋ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ [~~~] ํ๋์ ํด๋นํด!
์์ ํํ์์ ~~~์ ๋ค์ด์ฌ ๊ฐ์ ์ง์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
ํน์ง
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ mappedBy ์์ฑ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ์ฃผ์ธ์ด ์๋๋ผ๋ฉด mappedBy ์์ฑ์ ์ฌ์ฉํด์ ์ฃผ์ธ์ด ์๋์ ์ค์ ํฉ๋๋ค. ์์ฑ์ ๊ฐ์ผ๋ก๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํด์ค๋๋ค.
- mappedBy ์์ฑ์ ๋ค์ด์ฌ ์ด๋ฆ์, ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ํด๋น ์์ฑ์ ํ๋๋ช ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค
class Member {
@ManyToOne//์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
@JoinColumn(name = "TEAM_ID")
private Team team;//team๋์ kkk๋ผ๋ฉด
}
class Team {
@OneToMany(mappedBy="team")//"team" ๋์ "kkk"
private List<Member> members = new ArrayList<>();
}
mappedBy๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด...
mappedBy๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ค๋์ผ ๊ด๊ณ์ ๊ฒฝ์ฐ ์ค๊ฐ ํ ์ด๋ธ์ด ์์ฑ๋๋ฉฐ,
์ผ๋์ผ ๊ด๊ณ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ํ ์ด๋ธ์ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ FK๊ฐ ์ค์ ๋ฉ๋๋ค.
๋ค๋์ผ ๊ด๊ณ ์์
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
protected Member() {
}
public void setTeam(Team team) {
this.team = team;
}
}
@Entity
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany
private List<Member> members = new ArrayList<>();
}
์ผ๋์ผ ๊ด๊ณ ์์
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToOne
private Team team;
protected Member() {
}
public void setTeam(Team team) {
this.team = team;
}
}
@Entity
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToOne
private Member members;
}
์ฐธ๊ณ
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ค๋์ผ, ์ผ๋๋ค ๊ด๊ณ์์๋ ํญ์ ๋ค ์ชฝ์ด ์ธ๋ํค๋ฅผ ๊ฐ์ง๋๋ค.
๋ฐ๋ผ์ ํญ์ ๋ค(N)์ชฝ์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ฏ๋ก @ManyToOne์๋ mappedBy ์์ฑ์ด ์์ต๋๋ค.
๐ Reference
[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊น์ํ]
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํํ๋ ๋ฐฉ๋ฒ (2) | 2021.12.15 |
---|---|
[JPA] ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋ ์์ฑํ๊ธฐ (0) | 2021.12.14 |
[JPA] SEQUENCE (& TABLE) ์ ๋ต์์ ์ฒซ ํธ์ถ์ด 2๋ฒ ์ด๋ฃจ์ด์ง๋ ์ด์ (0) | 2021.12.14 |
[JPA] ์๋ณ์(๊ธฐ๋ณธ ํค) ์ ํ ์ ๋ต (0) | 2021.12.14 |
[JPA] ๊ธฐ๋ณธ ํค(Primary Key)๋งคํ - @Id, @GeneratedValue (0) | 2021.12.14 |