[JPA] ๋ค๋์ผ, ์ผ๋๋ค, ์ผ๋์ผ (๋จ๋ฐฉํฅ, ์๋ฐฉํฅ) ์ฐ๊ด๊ด๊ณ ๋งคํ
by rlaehddnd0422๋ค์ค์ฑ๊ณผ ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ์ ๊ณ ๋ คํ ๊ฐ๋ฅํ ๋ชจ๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ํ๋์ฉ ์์๋ณด๊ฒ ์ต๋๋ค. (์ผ์ชฝ์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ)
๋ค๋์ผ(N:1)
๋ค๋์ผ ๊ด๊ณ ํน์ง
- ๋ค๋์ผ ๊ด๊ณ์ ๋ฐ๋ ๋ฐฉํฅ์ ํญ์ ์ผ๋๋ค ๊ด๊ณ์ ๋๋ค.
- ์ผ๋๋ค ๊ด๊ณ์ ๋ฐ๋ ๋ฐฉํฅ์ ํญ์ ๋ค๋์ผ ๊ด๊ณ์ ๋๋ค.
- ํ ์ด๋ธ์ ๋ค๋์ผ, ์ผ๋๋ค ๊ด๊ณ์์ ์ธ๋ํค๋ ํญ์ ๋ค ์ชฝ์ ์์ต๋๋ค.
๋ค๋์ผ ๋จ๋ฐฉํฅ ์๋ฐฉํฅ ๋งคํ์ ์ด ์ ํฌ์คํ ์์ ๋ค๋ฃจ์์ง๋ง, ๋ค์ ํ ๋ฒ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๋ค๋์ผ ๋จ๋ฐฉํฅ N โก๏ธ 1
Member (N) โก๏ธ Team (1)
Member Entity
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
- @JoinColumn์ผ๋ก ์ฐธ์กฐํ ์ธ๋ ํค์ ๋งคํ, ์ฆ Member๊ฐ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ฉฐ ํ์ ํ ์ด๋ธ์ TEAM_ID ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
Team Entity
@Entity
public class Team{
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
- ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ด๋ฏ๋ก @OneToMany ์ฌ์ฉํ์ฌ members ํ๋๋ฅผ ์ค์ ํ์ง ์์์ต๋๋ค.
ํ์์ Member.team์ผ๋ก ํ ์ํฐํฐ๋ฅผ ์กฐํํ ์ ์์ง๋ง, ๋ฐ๋๋ก ํ์๋ ํ์์ ์ฐธ์กฐํ๋ ํ๋๊ฐ ์๋ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ๋๋ค.
๋ค๋์ผ ์๋ฐฉํฅ N ↔๏ธ 1
Member (N) ↔๏ธ Team (1) ์๋ฐฉํฅ ๋งคํ์์๋ ํญ์ "๋ค" ์ชฝ์ด ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋ฉ๋๋ค.
Member Entity
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
- ๋ณ๊ฒฝ์ X
Team Entity
@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<Member>();
public void addMember(Member member){
this.members.add(member);
if(member.getTeam() != this){
member.setTeam(this);
}
}
- @OneToMany๋ก ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ + mappedBy ์์ฑ ์ถ๊ฐ
- ํธ์๋ฉ์๋ addMember(member) ๋ก ์๋ฐฉํฅ ์๋ ๋งคํ ์ค์
์ผ๋๋ค(1:N)
์ผ๋๋ค ๊ด๊ณ๋ ๋ค๋์ผ ๊ด๊ณ์ ๋ฐ๋ ๋ฐฉํฅ์ ๋๋ค. ์ผ๋๋ค ๊ด๊ณ๋ ์ํฐํฐ๋ฅผ ํ๋ ์ด์ ์ฐธ์กฐํ ์ ์์ผ๋ฏ๋ก ์๋ฐ ์ปฌ๋ ์ ์ธ Collection, List, Set, Map์ค์ ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ผ๋๋ค ๋จ๋ฐฉํฅ 1 โก๏ธ N
๋ณดํต์ ์์ ์ด ๋งคํํ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ์ง๋ง, ์ผ๋๋ค ๊ด๊ณ์์ "์ผ"์ด ์ธ๋ํค ๊ด๋ฆฌ์, ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ ค๋ฉด ์ธ๋ํค๋ ํญ์ "๋ค" ์ชฝ์ ์๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ํ๋๊ฐ ์๋ "๋ค" ํ ์ด๋ธ๊ณผ ๋งคํ์ ํด์ฃผ์ด์ผ ํ๋ ํน์ดํ ๋ชจ์ต์ด ๋ํ๋ฉ๋๋ค.
Team Entity
@Entity
public class Team{
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID") // MEMBER ํ
์ด๋ธ์ TEAM_ID (FK)
private List<Member> members = new ArrayList<Member>();
Member Entity
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
}
์ผ๋๋ค ๋จ๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋งคํํ ๋๋ @JoinColumn์ ๋ฐ๋์ ๋ช ์ํด์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด, JPA๋ ์ฐ๊ฒฐ ํ ์ด๋ธ์ ์ค๊ฐ์ ๋๊ณ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ ์กฐ์ธ ํ ์ด๋ธ ์ ๋ต์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํด์ ๋งคํํฉ๋๋ค.
์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ์ ๋จ์
- ๋งคํํ ๊ฐ์ฒด๊ณผ ๊ด๋ฆฌํ๋ ์ธ๋ ํค๊ฐ ๋ค๋ฅธํ ์ด๋ธ์ ์์ด ์ฐ๊ด๊ด๊ณ ์ฒ๋ฆฌ๋ฅผ ์ํ UPDATE SQL์ ์ถ๊ฐ์ ์ผ๋ก ์คํํด์ผ ํฉ๋๋ค.
- Team ์ํฐํฐ๋ฅผ ์ ์ฅํ ๋ Team.members์ ์ฐธ์กฐ ๊ฐ์ ํ์ธํด์ ํ์ ํ ์ด๋ธ์ ์๋ TEAM_ID ์ธ๋ ํค๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ํค ๊ด๋ฆฌ๊ฐ ๋ณต์กํ๊ณ ๋จ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ๋ณด๋ค๋ ๋ค๋์ผ ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉํฉ์๋ค.
์ผ๋๋ค ์๋ฐฉํฅ ๋งคํ
์๋ฐฉํฅ ๋งคํ์์ @OneToMany๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์ผ๋๋ค ์๋ฐฉํฅ ๋งคํ์ ์กด์ฌํ์ง ์์ต๋๋ค.
์ผ๋์ผ(1:1)
์ผ๋์ผ ๊ด๊ณ๋ ์์ชฝ์ด ์๋ก ํ๋์ ๊ด๊ณ๋ง ๊ฐ์ง๋๋ค. ์๋ฅผ ๋ค์ด ํ์์ ํ๋์ ์ฌ๋ฌผํจ๋ง ์ฌ์ฉํ๊ณ ์ฌ๋ฌผํจ๋ ํ๋์ ํ์์ ์ํด์๋ง ์ฌ์ฉ๋ฉ๋๋ค.
ํน์ง
- ์ผ๋์ผ ๊ด๊ณ์ ๋ฐ๋๋ ์ผ๋์ผ ๊ด๊ณ.
- ํ ์ด๋ธ ๊ด๊ณ์์ ์ผ๋๋ค, ๋ค๋์ผ์ ํญ์ ๋ค์ชฝ์ด ์ธ๋ํค๋ฅผ ๊ฐ์ง๋๋ค. ํ์ง๋ง ์ผ๋์ผ ๊ด๊ณ์์๋ ์ฃผ ํ ์ด๋ธ์ด๋ ๋์ ํ ์ด๋ธ ๋ ์ค ์ด๋๊ณณ์์๋ ์ธ๋ํค๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค ์ค์
: ์ฃผ ๊ฐ์ฒด๊ฐ ๋์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ฒ๋ผ ์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๋๊ณ ๋์ ํ ์ด๋ธ์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด ๋ฐฉ์์ ์ฑํํฉ๋๋ค. JPA๋ ์ฃผ ํ ์ด๋ธ์ ์ธ๋ ํค๊ฐ ์์ผ๋ฉด ์ข ๋ ํธ๋ฆฌํ๊ฒ ๋งคํํ ์ ์์ต๋๋ค.
- Member - ์ฃผ ํ ์ด๋ธ
- Locker - ๋์ ํ ์ด๋ธ
๋จ๋ฐฉํฅ
์ผ๋์ผ ๊ด๊ณ์ด๋ฏ๋ก ๊ฐ์ฒด ๋งคํ์ @OneToOne์ ์ฌ์ฉํด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํด์ค๋๋ค.
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
}
์๋ฐฉํฅ
๋ฐ๋ ๋ฐฉํฅ์๋ ์ถ๊ฐ์ ์ผ๋ก @OneToOne์ ์ค์ ํด์ค๋๋ค. ๋จ, ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ๋์์ด ๋๋ ํ ์ด๋ธ์ด๋ฏ๋ก ๋ค๋์ผ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก mappedBy ์์ฑ์ ์ถ๊ฐํด์ฃผ์ด์ผํฉ๋๋ค.
// ์ฃผ ๊ฐ์ฒด
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
// ๋์ ๊ฐ์ฒด
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
๋์ ํ ์ด๋ธ์ ์ธ๋ํค ์ค์
์ด๋ฒ์๋ ๋์ ํ ์ด๋ธ์ ์ธ๋ ํค๊ฐ ์๋ ์ผ๋์ผ ๊ด๊ณ๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
๋จ๋ฐฉํฅ
JPA์์ ์ผ๋๋ค ๋จ๋ฐฉํฅ ๊ด๊ณ์ ๋์ ํ ์ด๋ธ๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํ์ ์ง์ํ์ง๋ง, ๋์ ํ ์ด๋ธ์ ์ธ๋ํค๊ฐ ์๋ ์ผ๋์ผ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ ๋งคํ์ ์ง์ํ์ง ์์ต๋๋ค.
์ด ๋๋ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์๋์ ๊ฐ์ด Locker โก๏ธ Member๋ก ์์ ํ๊ฑฐ๋, ์๋ฐฉํฅ ๊ด๊ณ๋ก ๋ง๋ค๊ณ Locker๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
Locker โก๏ธ Member๋ก ์์
// ์ฃผ ๊ฐ์ฒด
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne
private Member member;
}
// ๋์ ๊ฐ์ฒด
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne(mappedBy = "member")
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
์๋ฐฉํฅ ๊ด๊ณ๋ก ์์
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
์๋ฐฉํฅ
๋์ ํ ์ด๋ธ์ ์ธ๋ํค๊ฐ ์๋ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์์๋ด ์๋ค.
// ์ฃผ ๊ฐ์ฒด
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne(mappedBy = "member")
private Locker locker;
}
// ๋์ ๊ฐ์ฒด
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
- ์ผ๋์ผ ๋งคํ์์ ๋์ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๋๊ณ ์ถ์ผ๋ฉด ์๋ฐฉํฅ์ผ๋ก ๋งคํํ๊ณ , ๋์ ์ํฐํฐ์ธ Locker๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ๋ง๋ค์ด์ Locker ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
<์ ๋ฆฌ>
- ๋ค๋์ผ, ์ผ๋๋ค, ์ผ๋์ผ ๋จ๋ฐฉํฅ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ๋ํด ์์๋ณด์์ต๋๋ค.
- ์ผ๋๋ค ๋จ๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋งคํํ ๋๋ @JoinColumn์ ๋ฐ๋์ ๋ช ์ํด์ผ ํฉ๋๋ค.
- ์ผ๋์ผ ๋งคํ์์ ์ธ๋ํค๋ ์ฃผ ํ ์ด๋ธ์๋ ๋์ ํ ์ด๋ธ์์๋ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- JPA๋ ์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ์ ์ง์ํ์ง๋ง, ์ผ๋์ผ ๋จ๋ฐฉํฅ ๋งคํ์ ์ง์ํ์ง ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ณ ๊ธ ๋งคํ : ์์ ๊ด๊ณ ๋งคํ (0) | 2023.05.03 |
---|---|
[JPA] ๋ค๋๋ค ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2023.05.02 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ - ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ (1) | 2023.04.30 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ - ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ (0) | 2023.04.29 |
[JPA] Entity Mapping : ํ๋ โก๏ธ ์ปฌ๋ผ ๋งคํ (0) | 2023.04.28 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422