๐ JPA ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ 1
1. ๋ฌธ์ ์ํฉ: ์๋ฐฉํฅ ๊ด๊ณ์์ ์ธ๋ ํค ๊ด๋ฆฌ ์ถฉ๋
์์ ์ค๊ณ
Team
๊ณผMember
๋ ์๋ฐฉํฅ ๊ด๊ณ๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.Team
์ ์ฌ๋ฌMember
๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ,Member
๋ ํ๋์Team
์ ์ํฉ๋๋ค.- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋
Member
ํ ์ด๋ธ์TEAM_ID
๋ผ๋ ์ธ๋ ํค๊ฐ ์กด์ฌํฉ๋๋ค.
๋ฌธ์ ์ฝ๋
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
@OneToMany
@JoinColumn(name = "TEAM_ID") // Team๋ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ค๊ณ ์๋
private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // Member๋ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ค๊ณ ์๋
private Team team;
}
2. ์ค์ ๋์: ์๋ฐฉํฅ ๊ด๊ณ์์ ์ธ๋ ํค ๋ณ๊ฒฝ
1. Team ์ํฐํฐ์์ ๋ฉค๋ฒ ์ถ๊ฐ
Team team = new Team();
Member member = new Member();
// Team์์ ๋ฉค๋ฒ ์ถ๊ฐ
team.getMembers().add(member);
Team์์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ์ง๋ง, ์ธ๋ ํค TEAM_ID
๊ฐ ์ด๋ป๊ฒ ์ค์ ๋ ์ง ๋ช
ํํ์ง ์์ต๋๋ค.
2. Member ์ํฐํฐ์์ ํ ์ค์
member.setTeam(team);
Member์์ ํ์ ์ค์ ํ์ง๋ง, TEAM_ID
๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง ๋ช
ํํ์ง ์์ต๋๋ค.
๋ ์ํฐํฐ๊ฐ ๋ชจ๋ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ค ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
3. JPA์ ๋ฌธ์ : ์ธ๋ ํค ์ถฉ๋
JPA๋ ์๋ฐฉํฅ ๊ด๊ณ์์ ์ธ๋ ํค๋ฅผ ํ๋์ ์ฃผ์ฒด๊ฐ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋ ์ํฐํฐ๊ฐ ๋์์ ์ธ๋ ํค๋ฅผ ๋ณ๊ฒฝํ๋ ค ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์์ค๋ ์ ์์ต๋๋ค.
- ์ฃผ์ธ์ ๋ช ํํ ์ง์ ํ๋ฉด JPA๋ ์ฃผ์ธ๋ง ์ ๋ฐ์ดํธํ๊ณ , ๋น์ฃผ์ธ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๋ ์ญํ ๋ง ํฉ๋๋ค.
4. ํด๊ฒฐ: ๊ด๊ณ์ ์ฃผ์ธ์ ๋ช ํํ ์ง์
Member ์ํฐํฐ๋ฅผ ์ฃผ์ธ(Owner)์ผ๋ก ์ง์ ํ๊ณ , Team ์ํฐํฐ๋ฅผ ๋น์ฃผ์ธ(Non-Owner)์ผ๋ก ์ค์ ํฉ๋๋ค.
์ธ๋ ํค๋ฅผ Member
์์๋ง ๊ด๋ฆฌํ๊ณ , Team
์์๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์์ ๋ ์ค๊ณ
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team") // ๋น์ฃผ์ธ, ์ธ๋ ํค๋ Member๊ฐ ๊ด๋ฆฌ
private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // ์ฃผ์ธ, ์ธ๋ ํค ๊ด๋ฆฌ
private Team team;
}
5. ์์: ์ฃผ์ธ๊ณผ ๋น์ฃผ์ธ์ ์ฐจ์ด
Team์์ ๋ฉค๋ฒ ์ถ๊ฐ
Team team = new Team();
Member member = new Member();
// Team์์ ๋ฉค๋ฒ ์ถ๊ฐ
team.getMembers().add(member);
// Member์์ ํ ์ค์ (์ธ๋ ํค ๊ด๋ฆฌ)
member.setTeam(team);
em.persist(team);
em.persist(member);
์ค์ ์ฟผ๋ฆฌ
INSERT INTO TEAM (id, name) VALUES (?, ?);
INSERT INTO MEMBER (id, name, TEAM_ID) VALUES (?, ?, ?);
6. ์ ์ธ๋ ํค๋ฅผ ์ฃผ์ธ์ด ๊ด๋ฆฌํด์ผ ํ๋๊ฐ?
- ํ๋์ ์ฃผ์ฒด๊ฐ ๊ด๋ฆฌํด์ผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ์ ์ง๋จ:
- ๋ ์ํฐํฐ๊ฐ ๋์์ ์ธ๋ ํค๋ฅผ ๋ณ๊ฒฝํ๋ ค ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์์ค๋ ์ ์์ต๋๋ค.
- JPA์ ๋์ ๋ฐฉ์๊ณผ ์ผ์น:
- JPA๋ ๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ์ธ๋ ํค๋ฅผ ์์ ํ ์ ์๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
- ๋น์ฃผ์ธ์ ๋จ์ํ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ฝ๊ฑฐ๋ ์กฐํํ ์ ์์ต๋๋ค.
7. ๊ฒฐ๋ก
์๋ฐฉํฅ ๊ด๊ณ์์ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์ ๋ช ํํ ์ง์ ํ๋ ์ด์ ๋:
- ์ธ๋ ํค ์ถฉ๋ ๋ฐฉ์ง: ํ๋์ ์ํฐํฐ๋ง ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋๋ก ํ์ฌ ๋ฐ์ดํฐ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- JPA์ ๋ช ํํ ์ญํ ๋ถ๋ด: ์ฃผ์ธ์ ์ธ๋ ํค๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋น์ฃผ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ๋๋ก ์ค๊ณํฉ๋๋ค.
์ด๋ ๊ฒ ์ฃผ์ธ๊ณผ ๋น์ฃผ์ธ์ ๋ช ํํ ๋๋๋ฉด, JPA๊ฐ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค!
๐ JPA ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ 2
ํต์ฌ ๊ฐ๋
"์๋ฐฉํฅ ๊ด๊ณ์์ ํ๋์ ์ํฐํฐ๋ง ์ธ๋ ํค(FK)๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ฉฐ, ๊ทธ ์ํฐํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์์ ์ค์ ๋ก ์ธ๋ ํค๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ ์ด๋ธ์ ๋งคํ๋ ์ํฐํฐ๊ฐ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ค."
์ ์ด๋ฐ ๊ท์น์ด ํ์ํ ๊น?
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ:
- ๋ ์ํฐํฐ๊ฐ ๋์์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ค ํ๋ฉด, JPA๊ฐ ์ด๋ค ์ํฐํฐ์ ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ๋ ํค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ์ง ์ ์ ์์ต๋๋ค.
- ํ์ชฝ ์ํฐํฐ๋ฅผ "์ฃผ์ธ"์ผ๋ก ์ง์ ํจ์ผ๋ก์จ, ์ธ๋ ํค ๋ณ๊ฒฝ์ ๋ํ ์ฑ ์์ ๋ช ํํ ํ ์ ์์ต๋๋ค.
- JPA ๋์ ์๋ฆฌ:
- JPA๋ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ๋ง ์ธ๋ ํค๋ฅผ ์์ ํ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
- ๋น์ฃผ์ธ์ ๋จ์ํ ๊ด๊ณ๋ฅผ ์ฝ๊ธฐ๋ง ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ถํ์ํ ๋ฐ์ดํฐ ์ถฉ๋์ด๋ ๋น์ผ๊ด์ฑ์ ๋ฐฉ์งํฉ๋๋ค.
- ํ
์ด๋ธ ๊ตฌ์กฐ์ ๋งคํ์ ์ผ์น:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ธ๋ ํค๋ ํน์ ํ ์ด๋ธ์ ์กด์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ํด๋น ํ ์ด๋ธ์ ๋งคํ๋ ์ํฐํฐ๊ฐ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํด์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด ๊ฐ์ ๋งคํ์ด ์ผ๊ด์ฑ ์๊ฒ ์ ์ง๋ฉ๋๋ค.
์ฃผ์ธ๊ณผ ๋น์ฃผ์ธ์ ์ญํ
- ์ฃผ์ธ (Owner):
- ์ธ๋ ํค๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ํฐํฐ.
@JoinColumn
์ ์ฌ์ฉํ์ฌ ์ธ๋ ํค๋ฅผ ๋งคํํ๊ณ , JPA๊ฐ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋๋ก ์ค์ .
- ๋น์ฃผ์ธ (Non-Owner):
- ์ธ๋ ํค๋ฅผ ์ง์ ๊ด๋ฆฌํ์ง ์๋ ์ํฐํฐ.
mappedBy
๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ธ์ ์ง์ ํ๊ณ , ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅ.
์์
ํ ์ด๋ธ ๊ตฌ์กฐ
- TEAM:
TEAM_ID
(PK)NAME
- MEMBER:
MEMBER_ID
(PK)NAME
TEAM_ID
(FK)
์ํฐํฐ ์ค๊ณ
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team") // ๋น์ฃผ์ธ
private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // ์ฃผ์ธ
private Team team;
}
์ ๋ฆฌ
- ์๋ฐฉํฅ ๊ด๊ณ์์๋ ๋ฐ๋์ ํ๋์ ์ํฐํฐ๋ง ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ์ธ๋ ํค๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ ์ด๋ธ์ ๋งคํ๋ ์ํฐํฐ๊ฐ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค.
- JPA๋ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ๋ง ์ธ๋ ํค๋ฅผ ์์ ํ ์ ์๊ณ , ๋น์ฃผ์ธ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํฉ๋๋ค.
์ด ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด ๊ฐ์ ๋งคํ์ด ๋ช ํํ๊ณ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค! ๐
๐ ๊ฐ์ฒด์ ํ ์ด๋ธ์ ๊ด๊ณ ์ฐจ์ด
1. ํ ์ด๋ธ๊ณผ ๊ฐ์ฒด์ ๊ด๊ณ ์ฐจ์ด
ํ ์ด๋ธ ์ธ๊ณ
- ํ ์ด๋ธ์์๋ ํ๋์ ์ธ๋ ํค(FK)๋ง์ผ๋ก ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ํํํ ์ ์์ต๋๋ค.
- ์ธ๋ ํค๋ ํ์ชฝ ํ ์ด๋ธ์๋ง ์กด์ฌํ๋ฉฐ, ๋ค๋ฅธ ์ชฝ ํ ์ด๋ธ์ ์ด๋ฅผ ์ฐธ์กฐํ์ฌ ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค.
์: Member
ํ
์ด๋ธ์ TEAM_ID
๋ผ๋ ์ธ๋ ํค๊ฐ ์๋ค๋ฉด, ์ด ์ธ๋ ํค๋ง์ผ๋ก Member
๊ฐ Team
์ ์ฐธ์กฐํ ์ ์๊ณ , ๋ฐ๋๋ก Team
์์ Member
๋ฅผ ์ฐธ์กฐํ ์๋ ์์ต๋๋ค.
๊ฐ์ฒด ์ธ๊ณ
- ๊ฐ์ฒด์์๋ ๊ด๊ณ๋ฅผ ์๋ฐฉํฅ์ผ๋ก ํํํ๋ ค๋ฉด, ๊ฐ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
- ๊ฐ์ฒด๋ ์ธ๋ ํค๋ฅผ ์ง์ ๊ฐ์ง์ง ์์ผ๋ฉฐ, ๋์ ์ฐธ์กฐ๋ฅผ ์ํ ํ๋๋ฅผ ํตํด ๊ด๊ณ๋ฅผ ํํํฉ๋๋ค.
- ๋ฐ๋ผ์ ๊ฐ์ฒด ๊ฐ์ ์๋ฐฉํฅ ๊ด๊ณ๋ ๋จ๋ฐฉํฅ ๊ด๊ณ ๋ ๊ฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค:
Member
๊ฐ์ฒด๊ฐTeam
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ด๊ณ.Team
๊ฐ์ฒด๊ฐMember
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ด๊ณ.
2. ์์
ํ ์ด๋ธ ์ค๊ณ
- TEAM ํ ์ด๋ธ:
TEAM_ID NAME
----------------
1 Development
2 Marketing
- MEMBER ํ ์ด๋ธ:
MEMBER_ID NAME TEAM_ID (FK)
------------------------------------
101 Alice 1
102 Bob 1
103 Carol 2
๊ฐ์ฒด ์ค๊ณ
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team") // Team์์ Member๋ฅผ ์ฐธ์กฐ
private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // Member์์ Team์ ์ฐธ์กฐ
private Team team;
}
3. ์ ๊ฐ์ฒด๋ ๋จ๋ฐฉํฅ ์ฐธ์กฐ ๋ ๊ฐ๋ก ์ฐ๊ฒฐ๋๋๊ฐ?
- ๊ฐ์ฒด๋ ์ธ๋ ํค๋ฅผ ์ง์ ๊ฐ์ง์ง ์๋๋ค:
- ๊ฐ์ฒด๋ ํ ์ด๋ธ์ฒ๋ผ ์ธ๋ ํค๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ง์ง ์๊ณ , ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํ๋๋ฅผ ํตํด ๊ด๊ณ๋ฅผ ํํํฉ๋๋ค.
- ๊ฐ์ฒด๋ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง ์ฐธ์กฐ๋ง ๊ฐ๋ฅํ๋ค:
- ๊ฐ์ฒด๋ ํ ์ด๋ธ์ฒ๋ผ ์๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ์๋๋๋ค.
Member
๊ฐTeam
์ ์ฐธ์กฐํ๋ ค๋ฉดMember
์team
ํ๋๊ฐ ์์ด์ผ ํ๊ณ ,Team
์ดMember
๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉดTeam
์members
ํ๋๊ฐ ์์ด์ผ ํฉ๋๋ค.
- ํ
์ด๋ธ์ FK๋ ๋จ์ผ ํ๋๋ก ๋ชจ๋ ๋ฐฉํฅ์ ํด๊ฒฐ:
- ํ
์ด๋ธ์
JOIN
์ ์ฌ์ฉํ์ฌ ์๋ฐฉํฅ ํ์์ด ๊ฐ๋ฅํ์ง๋ง, ๊ฐ์ฒด๋ ์ด๋ฅผ ๋ณ๋๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.
- ํ
์ด๋ธ์
4. ๊ฐ์ฒด์ ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ ๋น๊ต
ํ ์ด๋ธ ๊ด์
TEAM (1) ---- FK (TEAM_ID) ----> MEMBER (N)
๊ฐ์ฒด ๊ด์
Team --> members: List (๋จ๋ฐฉํฅ)
Member --> team: Team (๋จ๋ฐฉํฅ)
๋ ๊ฐ์ ๋จ๋ฐฉํฅ ์ฐธ์กฐ๋ฅผ ํฉ์ณ์ ์๋ฐฉํฅ ๊ด๊ณ์ฒ๋ผ ๋์ํ๋๋ก ์ค๊ณํฉ๋๋ค.
5. ์์ฝ
- ํ ์ด๋ธ ์ธ๊ณ: ์ธ๋ ํค ํ๋๋ง์ผ๋ก ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ํํํ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด ์ธ๊ณ: ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ํํํ๋ ค๋ฉด ๊ฐ ๊ฐ์ฒด์ ์๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณ๋๋ก ์ถ๊ฐํด์ผ ํ๋ฏ๋ก, ๋จ๋ฐฉํฅ ๊ด๊ณ ๋ ๊ฐ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
- ๊ฐ์ฒด ์ธ๊ณ์ ์๋ฐฉํฅ ๊ด๊ณ๋ ์ฌ์ค์ ๋จ๋ฐฉํฅ ๊ด๊ณ ๋ ๊ฐ๋ฅผ ํฉ์น ๊ฒ์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
์ด ๊ฐ๋ ์ ์๋ฉด ๊ฐ์ฒด ์ค๊ณ์ ํ ์ด๋ธ ์ค๊ณ๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ ๋ช ํํ ์ดํดํ ์ ์์ต๋๋ค! ๐
์์ ๊ฐ์ ์ด์ ๋ก ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ํ์ํ๋ค.
๐ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ํ์ํ ์ด์
1. ๊ฐ์ฒด์ ํ ์ด๋ธ์ ์ฐจ์ด๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์
1. ํ ์ด๋ธ์์์ ์๋ฐฉํฅ ๊ด๊ณ
- ํ ์ด๋ธ์์๋ ์ธ๋ ํค(FK) ํ๋๋ก ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ํํํ ์ ์์ต๋๋ค.
- SQL์์
JOIN
์ ์ฌ์ฉํ๋ฉด ์์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์์ด ๊ฐ๋ฅํฉ๋๋ค:SELECT * FROM MEMBER WHERE TEAM_ID = ?
→Member
์์Team
์ผ๋ก ํ์SELECT * FROM TEAM T JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
→Team
์์Member
๋ก ํ์
2. ๊ฐ์ฒด์์์ ์๋ฐฉํฅ ๊ด๊ณ
- ๊ฐ์ฒด์์๋ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด, ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํด์ผ ํฉ๋๋ค:
Member
๊ฐ์ฒด๊ฐTeam
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ (Member → Team
)Team
๊ฐ์ฒด๊ฐMember
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ (Team → Member
)
- ๊ทธ๋ฌ๋ JPA๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋๋ฐ, ์์ชฝ ๋ชจ๋์์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ค๊ณ ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
2. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ํ์ํ ์ด์
1. ๊ฐ์ฒด์ ์๋ฐฉํฅ ๊ด๊ณ๋ ๋จ๋ฐฉํฅ 2๊ฐ๋ก ๊ตฌ์ฑ๋๋ค
- ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด
Member
์Team
์ ์๋ก๋ฅผ ์ฐธ์กฐํฉ๋๋ค. - ๊ทธ๋ฌ๋ ํ๋์ ์ธ๋ ํค๋ ํ๋์ ์ฃผ์ฒด์ ์ํด ๊ด๋ฆฌ๋์ด์ผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
2. ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ฑ ์์ ํ๋๋ก ํตํฉํด์ผ ํ๋ค
- ์๋ฐฉํฅ ๊ด๊ณ์์ ์์ชฝ์ด ๋์์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค:
- JPA๊ฐ ์ด๋ค ๋ฐฉํฅ์์ ์ธ๋ ํค๋ฅผ ์ ๋ฐ์ดํธํ ์ง ๋ชจํธํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํ์ฌ, ์ธ๋ ํค ๊ด๋ฆฌ์ ์ฑ ์์ ๋ช ํํ ํฉ๋๋ค.
3. ์ฃผ์ธ๋ง ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ค
- JPA์์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง ์ธ๋ ํค๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ ์ฅํ ์ ์์ต๋๋ค.
- ๋ฐ๋ฉด, ๋น์ฃผ์ธ์ ๊ด๊ณ๋ฅผ ์ฝ๊ธฐ๋ง ํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
3. ์์
์๋ชป๋ ์ฐ๊ด๊ด๊ณ ์ค๊ณ
@Entity
public class Team {
@OneToMany
@JoinColumn(name = "TEAM_ID") // Team๋ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌ
private List<Member> members;
}
@Entity
public class Member {
@ManyToOne
@JoinColumn(name = "TEAM_ID") // Member๋ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌ
private Team team;
}
์ฌ๋ฐ๋ฅธ ์ฐ๊ด๊ด๊ณ ์ค๊ณ
@Entity
public class Team {
@OneToMany(mappedBy = "team") // ๋น์ฃผ์ธ
private List<Member> members;
}
@Entity
public class Member {
@ManyToOne
@JoinColumn(name = "TEAM_ID") // ์ฃผ์ธ
private Team team;
}
4. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์์ผ๋ฉด ๋ฐ์ํ๋ ๋ฌธ์
- ์ค๋ณต ์ฟผ๋ฆฌ: JPA๊ฐ ์์ชฝ์์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ค ํ๋ฉด, ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์ ์ฅํ๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ฌธ์ : ๋ ์ํฐํฐ๊ฐ ์๋ก ๋ค๋ฅธ ์ธ๋ ํค ๊ฐ์ ์ ์งํ ๊ฐ๋ฅ์ฑ์ด ์๊น๋๋ค.
- JPA ๋์ ํผ๋: ์ด๋ค ์ํฐํฐ๊ฐ ์ธ๋ ํค๋ฅผ ์ต์ข ์ ์ผ๋ก ๊ฒฐ์ ํ ์ง ์ ์ ์์ด, ์์ธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
5. ๊ฒฐ๋ก
๊ฐ์ฒด์ ํ ์ด๋ธ์ ๊ด๊ณ ํํ ์ฐจ์ด๋ก ์ธํด JPA๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๋์ ํฉ๋๋ค.
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ ์ฑ ์์ ๊ฐ์ง๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฅ์ ์ค๋๋ค.
- ๋น์ฃผ์ธ์ ๊ด๊ณ๋ฅผ ์ฝ๊ธฐ๋ง ํ ์ ์์ด, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ JPA์ ๋ช ํํ ๋์์ ๋ณด์ฅํฉ๋๋ค.
๋ฐ๋ผ์, "์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ฒด-ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ ์ฐจ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ ๋ ๊ฐ๋ ์ด๋ค"๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค. ๐
package jpashop.jpaorder.domain;
import javax.persistence.*;
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
/* ==์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋== */
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}
package jpashop.jpaorder.domain;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Member> getMembers() {
return members;
}
public void setMembers(List<Member> members) {
this.members = members;
}
/* ==์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋== */
public void addMember(Member member) {
members.add(member);
member.setTeam(this);
}
}
package jpashop.jpaorder;
import jpashop.jpaorder.domain.Member;
import jpashop.jpaorder.domain.Team;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaorder");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Team team = new Team();
team.setName("teamA");
Member member1 = new Member();
member1.setName("member1");
Member member2 = new Member();
member2.setName("member2");
team.addMember(member1);
team.addMember(member2);
em.persist(member1);
em.persist(member2);
em.persist(team);
List<Member> members1 = team.getMembers();
for (Member member : members1) {
System.out.println(member.getName());
}
// em.flush();
// em.clear();
// Team findTeam = em.find(Team.class, team.getId());
// List<Member> members = findTeam.getMembers();
// for (Member member : members) {
// System.out.println("member.getName() = " + member.getName());
// }
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}
โ team์ ์ด๋ฏธ member1, 2 ๊ฐ ๋ค add ๋ ์ํ๋ก persist ๋์์ ๊ทผ๋ฐ ์ด๋ team์๋ PK๊ฐ ์์ด์ member1,2 ์ FK๊ฐ ์ธํ ์ด ์๋๋๋ฐ team์ด persist ํ๋ฉด PK๊ฐ ์๊ธฐ๋๊น ๊ทธ๋ member1,2 ์ FK๊ฐ ์ ๋ฐ์ดํธ ๋๋๊ฑด๊ฐ?
๋ค, ์ ํํ ๊ทธ๋ ์ต๋๋ค.
team์ด persist๋์ด PK๊ฐ ์์ฑ๋๋ฉด, ๊ทธ ์์ ์ JPA๊ฐ member1๊ณผ member2์ ์ธ๋ ํค(FK)๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
๐ JPA ์ฐ๊ด ๊ด๊ณ์์ FK ์ ๋ฐ์ดํธ ๊ณผ์
๋์ ๊ณผ์
team.addMember(member1)
ํธ์ถ- ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋๋ฅผ ํตํด
member1
์team
ํ๋๊ฐteam
์ ์ฐธ์กฐํ๋๋ก ์ค์ ๋ฉ๋๋ค. - ์ด ์์ ์์๋
team
๊ฐ์ฒด์id
๊ฐ(PK)์ด ์์ง ์์ผ๋ฏ๋ก, ์ธ๋ ํค๊ฐ ์ค์ ๋์ง ์์ ์ํ์ ๋๋ค.
- ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋๋ฅผ ํตํด
em.persist(member1)
ํธ์ถ- JPA๋
member1
์ ์์ํํ๊ณMember
ํ ์ด๋ธ์ INSERT ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. - ํ์ง๋ง
TEAM_ID
๊ฐ(PK)์ด ์์งteam
์ ์์ผ๋ฏ๋ก,TEAM_ID
๋NULL
๋ก ์ฝ์ ๋ฉ๋๋ค.
- JPA๋
em.persist(team)
ํธ์ถteam
์ด ์์ํ๋๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๊ณ ,team.id
๊ฐ(PK)์ด ์์ฑ๋ฉ๋๋ค.
- ํ๋ฌ์(Flush)
em.flush()
๋๋ ํธ๋์ญ์ ์ปค๋ฐ ์์ ์ JPA๋team.id
๊ฐ์ ์ฐธ์กฐํ์ฌmember1
๊ณผmember2
์TEAM_ID
๋ฅผ ์ ๋ฐ์ดํธํ๋ UPDATE ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
๋ก๊ทธ ๋ถ์ ์์
1. INSERT ์ฟผ๋ฆฌ (Member ํ ์ด๋ธ)
INSERT INTO Member (name, city, street, zipcode, TEAM_ID) VALUES ('member1', NULL, NULL, NULL, NULL);
INSERT INTO Member (name, city, street, zipcode, TEAM_ID) VALUES ('member2', NULL, NULL, NULL, NULL);
2. INSERT ์ฟผ๋ฆฌ (Team ํ ์ด๋ธ)
INSERT INTO Team (name) VALUES ('teamA');
3. UPDATE ์ฟผ๋ฆฌ (Member ํ ์ด๋ธ)
UPDATE Member SET TEAM_ID = 1 WHERE MEMBER_ID = 1;
UPDATE Member SET TEAM_ID = 1 WHERE MEMBER_ID = 2;
์ ์ด๋ ๊ฒ ๋์ํ ๊น?
IDENTITY
์ ๋ต์ ํน์ฑ:team.id
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ ์์ฑ๋๋ฉฐ,persist
์์ ์๋ง ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.- ๋ฐ๋ผ์,
team
์ด ๋จผ์ persist
๋์ง ์์ผ๋ฉดmember1
๊ณผmember2
๋ ์ฌ๋ฐ๋ฅธTEAM_ID
๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
- JPA์ ํ๋ฌ์ ๋์:
- JPA๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํํ ๋, ์ํฐํฐ ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
team.id
๊ฐ ์์ฑ๋ ์ดํ, JPA๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ(Member.team
)์ ์ค์ ๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ ํค๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ฝ๋ ๊ฐ์ ๋ฐฉ๋ฒ
1. cascade
์ต์
ํ์ฉ
@OneToMany(mappedBy = "team", cascade = CascadeType.PERSIST)
private List<Member> members = new ArrayList<>();
cascade = CascadeType.PERSIST
๋ฅผ ์ค์ ํ๋ฉด, team.persist
์ member1
๊ณผ member2
๋ ์๋์ผ๋ก persist
๋ฉ๋๋ค.
2. persist
์์ ๋ณ๊ฒฝ
em.persist(team); // ๋จผ์ team์ ์ ์ฅ
em.persist(member1);
em.persist(member2);
team
์ ๋จผ์ persist
ํ ํ, member1
๊ณผ member2
๋ฅผ persist
ํ๋ฉด UPDATE
์ฟผ๋ฆฌ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
team
์ด persist
๋๊ธฐ ์ ์๋ team.id
๊ฐ์ด ์์ผ๋ฏ๋ก, member1
๊ณผ member2
์ TEAM_ID
๋ ์ค์ ๋์ง ์์ต๋๋ค.
team
์ด persist
๋์ด team.id
๊ฐ ์์ฑ๋ ํ, JPA๋ member1
๊ณผ member2
์ ์ธ๋ ํค๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
์ด๋ฅผ ํตํด ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ฐ๊ด๊ด๊ณ๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋ฉ๋๋ค. ๐
โ JPA๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํํ ๋, ์ํฐํฐ ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
→ ์ด๋ ๊ฒ ํ ์ ์๋ ์ด์ ๋ @JoinedColumn(name = "TEAM_ID") ๋๋ฌธ์ธ๊ฑด๊ฐ?
๋ค ๊ทธ๋ ์ต๋๋ค! JPA๊ฐ ์ํฐํฐ ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์ด์ ๋, @JoinColumn ์ด๋ ธํ ์ด์ ์ ํตํด **์ธ๋ ํค(FK)**์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ ๊ฐ์ ๋งคํ ์ ๋ณด๋ฅผ ๋ช ํํ ์ ๋ฌ๋ฐ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ JPA์ @JoinColumn์ ์ญํ
@JoinColumn์ ์ญํ
- ์ธ๋ ํค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ ๋งคํ
@JoinColumn(name = "TEAM_ID")
๋Member
์ํฐํฐ์team
ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์TEAM_ID
์ปฌ๋ผ์ ๋งคํํฉ๋๋ค.- ์ด๋ฅผ ํตํด JPA๋
team
ํ๋์ ์ค์ ๋Team
์ํฐํฐ์ ์๋ณ์(id
) ๊ฐ์ ์ธ๋ ํค ์ปฌ๋ผ์ ์ ์ฅํ๊ฑฐ๋ ๊ฐฑ์ ํ ์ ์์ต๋๋ค.
- ์ฐ๊ด๊ด๊ณ ๊ด๋ฆฌ
@ManyToOne
๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ ํ๋(Member.team
)๋ฅผ ํตํด ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.Member.team
ํ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด, JPA๋ ํด๋น ๋ณ๊ฒฝ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๋ ํค ์ปฌ๋ผ(TEAM_ID
)์ ์ ๋ฐ์ดํธํฉ๋๋ค.
JPA์ ๋์ ์๋ฆฌ
JPA๋ ์์์ฑ ์ปจํ
์คํธ์ ๊ด๋ฆฌ๋๋ ์ํฐํฐ์ ์ํ๋ฅผ ์ถ์ ํฉ๋๋ค. @JoinColumn
๋๋ถ์ ๋ค์๊ณผ ๊ฐ์ ๋์์ด ๊ฐ๋ฅํฉ๋๋ค:
1. ์ฝ์ (INSERT) ์ ์ธ๋ ํค ์ค์
member1.setTeam(team)
์ผ๋กteam
ํ๋๋ฅผ ์ค์ ํ๋ฉด, JPA๋team.getId()
๊ฐ์ ์ฝ์ดTEAM_ID
๋ก ๋งคํํฉ๋๋ค.- ์ด ์ ๋ณด๋ฅผ ํตํด
Member
ํ ์ด๋ธ์ ์ฝ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
INSERT INTO Member (name, TEAM_ID) VALUES ('member1', 1);
2. ์ ๋ฐ์ดํธ(UPDATE) ์ ์ธ๋ ํค ๊ฐฑ์
member1.setTeam(newTeam)
์ผ๋กteam
ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด, JPA๋ ์ด์ team.getId()
๊ฐ๊ณผ ์team.getId()
๊ฐ์ ๋น๊ตํฉ๋๋ค.- ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๋ ํค ์ปฌ๋ผ์ ์ ๋ฐ์ดํธํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
UPDATE Member SET TEAM_ID = 2 WHERE MEMBER_ID = 1;
3. ์ฐ๊ด๊ด๊ณ ํ์(SELECT)
team.getMembers()
๋ฅผ ํธ์ถํ๋ฉด JPA๋TEAM_ID
๋ฅผ ๊ธฐ์ค์ผ๋กMember
ํ ์ด๋ธ์์ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
SELECT * FROM Member WHERE TEAM_ID = 1;
@JoinColumn์ด ์์ผ๋ฉด?
@JoinColumn
์์ด๋ JPA๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋๋ช ์ ์ฌ์ฉํด ์ธ๋ ํค ์ปฌ๋ผ์ ์์ฑํ ์ ์์ต๋๋ค.- ์๋ฅผ ๋ค์ด:
@ManyToOne private Team team; // @JoinColumn ์๋ต
- ์ด ๊ฒฝ์ฐ JPA๋ ๊ธฐ๋ณธ ์ด๋ฆ ๊ท์น์ ๋ฐ๋ผ
team_id
๋ผ๋ ์ธ๋ ํค ์ปฌ๋ผ์ ์์ฑํฉ๋๋ค. - ํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ ์ด๋ฆ์ด ์ผ์นํ์ง ์์ผ๋ฉด, ์ธ๋ ํค ๋งคํ์ด ์คํจํ๊ฑฐ๋ ์๋ชป๋ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
JPA๊ฐ ์ํฐํฐ ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์ด์ ๋:
@JoinColumn
์ ํตํด ์ธ๋ ํค ๋งคํ ์ ๋ณด๊ฐ ์ ๊ณต๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.- JPA๋ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ ํค ๊ฐ์ ์์ฑ, ์ ๋ฐ์ดํธ, ์กฐํํ๋ SQL์ ์๋์ผ๋ก ์์ฑํ๊ณ ์คํํฉ๋๋ค.
@JoinColumn
์ JPA์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ํํ ์ฐ๋์ ์ํ ํต์ฌ์ ์ธ ๊ตฌ์ฑ ์์์
๋๋ค. ๐
๐ ์ถ์ฒ : ChatGPT
'JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ํ์ต๋ชฉ๋ก (2) | 2024.12.21 |
---|---|
JPA์์ ๋จ๋ฐฉํฅ ๋งคํ์ ์ฐ์ ์ผ๋ก ํ๋ ์ด์ (๋จ๋ฐฉํฅ โ ํ์์ ์๋ฐฉํฅ) (0) | 2024.12.09 |
JPA ์ํฐํฐ์ ๊ฐ์ฒด์งํฅ์ ์ค๊ณ (0) | 2024.12.09 |
JPA PK ์์ฑ์ ๋ต @GeneratedValue(strategy = GenerationType.โ) (0) | 2024.12.09 |
JPA EntityManagerFactory, EntityManager๋ ์ฌ์ฉ ํ ๊ผญ ๋ซ์์ผ ํ๋ค (3) | 2024.12.05 |
๋๊ธ