[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ - ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
by rlaehddnd0422๋ฐ๋ก ์ด์ ํฌ์คํ ์์ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ๋ํด ์์๋ณด์์ต๋๋ค.
๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ๋จํ ์ง๊ณ ๋์ด๊ฐ์๋ฉด, Member โถ๏ธ Team์ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง ๋ Member ์ํฐํฐ์์๋ Team ์ํฐํฐ๋ฅผ ์ ์ ์์ง๋ง, Team ์ํฐํฐ์์๋ Member์ ๋ํด์ ์ ์ ์์์ด์.
์ด ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ฒด์์๋ ์ฐธ์กฐ๋ฅผ ํตํด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ์๊ณ , ํ ์ด๋ธ์์๋ ์ธ๋ํค๋ฅผ ํตํด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ JPA์์๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋ ์ํฐํฐ๋ฅผ ๋งคํํด์ฃผ๊ธฐ ์ํด์
Member Entity์๋ @ManyToOne ์ด๋ ธํ ์ด์ ์ Team ํ๋์ ๋ถ์ฌ์ฃผ๊ณ @JoinColumn ์ด๋ ธํ ์ด์ ์ผ๋ก ์ฐธ์กฐํ ์ธ๋ํค๋ฅผ ์ค์ ํด์ฃผ์์ต๋๋ค.
@Entity
public class Member{
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
// ์ฐ๊ด๊ด๊ณ ๋งคํ
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
...
}
์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํด ์ค ํ ์์ , ์กฐํ, ์ฝ์ ์์ ์ ๊ธฐ์กด๊ณผ ๋์ผํ์ง๋ง ์ญ์ ์์ ์์๋ ์ธ๋ํค ์ ์ฝ์กฐ๊ฑด์ผ๋ก ์ธํด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋จผ์ ์ญ์ ํด์ฃผ์ด์ผ ์ํฐํฐ๋ฅผ ์ญ์ ํ ์ ์์์ต๋๋ค.
member1.setTeam(null);
em.remove(member1);
์ด๋ฒ ํฌ์คํ ์์๋ ๋จ๋ฐฉํฅ์ด ์๋ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ผ๊ณ ํจ์ ํ์ดํ๋ก ↔๏ธ๋ฅผ ์ฌ์ฉํด์ "Member ↔๏ธ Team"์ ๊ฐ์ด ๋ํ๋ ๋๋ค.
์ด ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์๋ Member์์ Team์ ์ ์ ์์๊ณผ ๋์์, Team์์๋ Member๋ฅผ ์ ์ ์์ต๋๋ค.
๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ๋ถํฐ ์ดํด๋ด ์๋ค.
ํ Team์๋ ์ฌ๋ฌ Member๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด์ Team์ List ์ปฌ๋ ์ ์ ์ฌ์ฉํด์ members๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
- Member -> Team ( Member.team ), Team -> Member ( Team.members ) ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ต๋๋ค.
๋ค์์ผ๋ก ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ดํด๋ด ์๋ค.
ํ ์ด๋ธ์์๋ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์ ์ค๋ช ํ๋ฏ์ด, ๋ ์ํฐํฐ๊ฐ ์ธ๋ํค๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๊ณ ์์ผ๋ฉด ์ฒ์๋ถํฐ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๊ธฐ ๋๋ฌธ์, ํ ์ด๋ธ์์๋ ๊ฐ์ฒด์ ๋ฌ๋ฆฌ ๋ฐ๋ก ์ถ๊ฐํด์ค ๋ถ๋ถ์ด ์์ต๋๋ค.
์ ์ด์ , JPA๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์ ํ ์ด๋ธ๊ฐ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Member์๋ Member(N) โก๏ธ Team(1) ์ฐ๊ด๊ด๊ณ ๊ทธ๋๋ก๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ณ๊ฒฝ์ ์ด ์์ต๋๋ค.
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
Team์๋ Team โก๏ธ Member ์ฐ๊ด๊ด๊ณ๊ฐ ์ถ๊ฐ๋์์ผ๋ ๋ณ๊ฒฝ์ ์ด ์์ต๋๋ค.
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy = "team") // mappedBy = Team (team)
private List<Member> members = new ArrayList<Member>();
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
- @OneToMany : ํ Team์๋ ์ฌ๋ฌ Member๊ฐ ๋ค์ด์ฌ ์ ์์ต๋๋ค. Member์ Team์ ๋ค๋์ผ, ๊ฑฐ๊พธ๋ก ๋ณด๋ฉด Team๊ณผ Member๋ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์, Team ์ํฐํฐ์ member ํ๋์ ๋ค์ค์ฑ ์ด๋
ธํ
์ด์
@OneToMany๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- mappedBy ์์ฑ : mappedBy ์์ฑ์ ์๋ฐฉํฅ ๋งคํ์ผ ๋ ์ฌ์ฉํ๋๋ฐ, ๋ฐ๋ ์ชฝ ๋งคํ์ ํ๋ ์ด๋ฆ์ ๊ฐ์ผ๋ก ์ฃผ๋ฉด ๋ฉ๋๋ค.
- List<Member> members : ๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ ๋งคํ์์ ์ธ๊ธํ List ์ปฌ๋ ์ ์ ์ฌ์ฉํ์ต๋๋ค.
์๋ฐฉํฅ ๋งคํ์ด ๋๋ฌ์ต๋๋ค. ์๊ฐ๋ณด๋ค ๋ณต์กํ์ง ์์ฃ ? ์ด์ ๋ถํฐ๋ ๋จ๋ฐฉํฅ ๋งคํ์์ ์ถ๊ฐ์ ์ผ๋ก Team์์๋ Member๋ก ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ ํ ์ ์์ต๋๋ค.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
Team team1 = em.find(Team.class, "team1");
List<Member> members = team1.getMembers();
for (Member member : members) {
System.out.println("member.getUsername() = " + member.getUsername());
}
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์ Team์ members ํ๋์ ๋ค์ค์ฑ ์ด๋ ธํ ์ด์ @OneToMany๋ฅผ ์ง์ ํด์ฃผ์์ต๋๋ค.
@OneToMany์ mappedBy ์์ฑ์ team๋ ์ง์ ํด์ฃผ์๋๋ฐ์, mappedBy ์์ฑ์ ์ ํ์ํ ๊น์? ์ด ์ง๋ฌธ์ ๋๋ตํ๊ธฐ์ ์ ์ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋ค์ ํ ๋ฒ ์กฐ๊ธ ์์ธํ ์ง์ด๋ณด๊ฒ ์ต๋๋ค.
์๋ฐํ ๋งํ๋ฉด ๊ฐ์ฒด์๋ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ผ๋ ๊ฒ์ด ์์ต๋๋ค. ๋จ์ํ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๊ฐ 2๊ฐ๊ฐ ์กด์ฌํฉ๋๋ค.
์๋ก๋ค๋ฅธ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ 2๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ ๋ฌถ์ด์ ๋ง์น ์๋ฐฉํฅ์ธ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ ๋ฟ์ด์์.
๋ฐ๋ฉด์ ํ ์ด๋ธ์์๋ ์ธ๋ํค ํ๋๋ง ์์ผ๋ฉด ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค.
๊ฐ์ฒด์ ํ ์ด๋ธ ๋งคํ์์ ์ํฐํฐ๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ์ค์ ํ๋ฉด ์ฐธ์กฐ๋ฅผ ํ๋๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด ์ฐธ์กฐ๋ฅผ ๊ฐ์ง ์ชฝ์์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ฉด ๋ฉ๋๋ค.
ํ์ง๋ง ๊ฐ์ฒด์ ํ ์ด๋ธ ๋งคํ์์ ์ํฐํฐ๋ฅผ ์๋ฐฉํฅ์ผ๋ก ์ค์ ํ๋ฉด ์ฐธ์กฐ๋ฅผ ๋ ๊ฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ ํฌ์ธํธ๊ฐ ๋ ์ง์ ์ ๋๋ค. ๋ค์ ๋งํด์, ์ธ๋ํค๋ ํ๋์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ๊ณณ์ ๋ช ์ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
๋ฐ๋ก ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ๊ณณ์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ(์ธ๋ํค ๊ด๋ฆฌ์)์ด ๋ฉ๋๋ค.
- ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ ์ ๋ ์ฐ๊ด๊ด๊ณ ์ค ํ๋๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ด๊ด๊ณ์ ๋งคํ๋๊ณ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌ(๋ฑ๋ก,์์ ,์ญ์ ,์กฐํ) ํ ์ ์์ต๋๋ค.
- ๋ฐ๋ฉด ์ฃผ์ธ์ด ์๋์ชฝ์์๋ ์ฝ๊ธฐ(์กฐํ)๋ง ํ ์ ์์ต๋๋ค.
- ์ฃผ์ธ์ด ์๋ ์ชฝ์๋ ๋ฐ๋์ mappedBy ์์ฑ์ ์ฌ์ฉํด์ฃผ์ด์ผ ํฉ๋๋ค.
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์๋ mappedBy ์์ฑ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ด๋ป๊ฒ ์ ํ ๊น์?
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ, ์ธ๋ํค ๊ด๋ฆฌ์๋ ์ธ๋ํค๋ฅผ ๊ฐ๊ณ ์๋ ์ชฝ์ผ๋ก ์ค์ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ค๋์ผ, ์ผ๋๋ค ๊ด๊ณ์์๋ ํญ์ ๋ค ์ชฝ์ด ์ธ๋ํค๋ฅผ ๊ฐ์ง๋๋ค.
๋ฐ๋ผ์ @ManyToOne์ ํญ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ฏ๋ก mappedBy๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ์ ์ฅ
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ ์ฅํ ๋ ์ฃผ์ํ ์ ์ด ์์ต๋๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์๋ ๊ฐ์ ์ ๋ ฅํ์ง ์๊ณ ์ฃผ์ธ์ด ์๋๊ณณ์๋ง ๊ฐ์ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ ์ ์์ ์ผ๋ก ์ ์ฅ๋์ง ์์ต๋๋ค.
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try
{
// Member์๋ Member -> Team ์ฐ๊ด๊ด๊ณ ์ค์ X
Member member1 = new Member("member1", "ํ์1");
em.persist(member1);
// ์ฃผ์ธ์ด ์๋ Team์๋ Team -> Member ์ฐ๊ด๊ด๊ณ ์ค์
Team team1 = new Team("team1", "ํ1");
team1.getMembers().add(member1);
em.persist(team1);
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally {
em.close();
}
emf.close();
}
- Member ํ
์ด๋ธ์ TEAM_ID๊ฐ null๋ก ์ค์ ๋จ.
- ์ฐ๊ด๊ด๊ณ ์ค์ X
๋ฐ๋ฉด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์๋ง ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค์ ํด์ฃผ์ด๋ ์ฃผ์ธ์ด ์๋ ๊ณณ์๋ ๊ฐ์ด ์ ์ฅ ๋ฉ๋๋ค.
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try
{
// ํ1 ์ค์
Team team1 = new Team("team1", "ํ1");
em.persist(team1); // ์ ์ฅ
// ํ์1 ์ค์
Member member1 = new Member("member1", "ํ์1");
member1.setTeam(team1); // ์ฐ๊ด๊ด๊ณ ์ค์ Member->Team
em.persist(member1); // ์ ์ฅ
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally {
em.close();
}
emf.close();
}
๊ทธ๋ ๋ค๋ฉด ์ฐ๊ด๊ด๊ฒ์ ์ฃผ์ธ์๋ง ๊ฐ์ ์ ์ฅํ๊ณ ์ฃผ์ธ์ด ์๋ ์ชฝ์๋ ๊ฐ์ ์ ์ฅํ์ง ์๋ ๊ฒ์ด ๋ง์๊น?
๊ฐ์ฒด ๊ด์ ์์๋ ์์ชฝ ๋ฐฉํฅ์ ๋ชจ๋ ๊ฐ์ ์ ๋ ฅํด์ฃผ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
๊ฐ์ฒด ๊ด์ ๊ณผ ํ ์ด๋ธ ๊ด์ ์์ชฝ ๋ชจ๋๋ฅผ ๊ณ ๋ คํด์ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
JPA๋ฅผ ์ฌ์ฉํ์ง ์๋ ์์ํ ๊ฐ์ฒด ๊ด์ ์์ ๋ดค์ ๋, ์์ชฝ ๋ฐฉํฅ์ ๋ชจ๋ ๊ฐ์ ์ ๋ ฅํด์ฃผ์ง ์์ผ๋ฉด Member -> Team ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ์ฒ๋ผ ๋ณด์ ๋๋ค.
Team team1 = new Team("team1","ํ1");
em.persist(team1);
Member member1 = new Member("member1", "ํ์1");
member1.setTeam(team1);
em.persist(member1);
List<Member> list = team1.getMembers();
System.out.println("size = " + list.size()); // expected : 1
// result : 0
๊ฒฐ๋ก ์ ์ผ๋ก ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์๋ ๊ฐ์ฒด๊น์ง ๊ณ ๋ คํ์ฌ ์์ชฝ ๋ชจ๋ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค์๋ค.
// ํ1 ์ค์
Team team1 = new Team("team1", "ํ1");
em.persist(team1); // ์ ์ฅ
// ํ์1 ์ค์
Member member1 = new Member("member1", "ํ์1");
member1.setTeam(team1); // ์ฐ๊ด๊ด๊ณ ์ค์ Member->Team
team1.getMembers().add(member1); // ์ฐ๊ด๊ด๊ณ ์ค์ Team->Member
em.persist(member1); // ์ ์ฅ
์๋ฐฉํฅ ๋งคํ์์ ๋ ๊ฐ์์ ์ผ๋ก ๋ฆฌํํ ๋ง ํด๋ด ์๋ค.
// Members Entity
public void setTeam(Team team){
// ๊ธฐ์กด ํ์ด ์์ ๊ฒฝ์ฐ ์ ๊ฑฐ
if(this.team != null){
this.team.getMembers().remove(this);
}
this.team = team;
team.getMembers().add(this);
}
// ํ1 ์ค์
Team team1 = new Team("team1", "ํ1");
em.persist(team1); // ์ ์ฅ
// ํ์1 ์ค์
Member member1 = new Member("member1", "ํ์1");
member1.setTeam(team1); // ์ฐ๊ด๊ด๊ณ ์ค์ Member->Team
// team1.getMembers().add(member1); // ์ฐ๊ด๊ด๊ณ ์ค์ Team->Member
em.persist(member1); // ์ ์ฅ
- ๊ธฐ์กด ํ์ด ์์ ๊ฒฝ์ฐ ํด๋น team์์ ํด๋น member ๊ฐ์ฒด๋ฅผ ์ง์์ฃผ๊ณ ์๋ฐฉํฅ์ผ๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํ์์ต๋๋ค.
- ์ฌ์ค ๊ธฐ์กด ํ์ด ์์ ๊ฒฝ์ฐ ๊ธฐ์กด ํ์์ ํด๋น ๋ฉค๋ฒ๋ฅผ ์ ๊ฑฐํ์ง ์์๋ Team์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ธ๋ํค๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
member1 -> team1 ์์ member1 -> team2 ๋ก ๋ณ๊ฒฝํด๋ด ์๋ค.
try
{
// ํ1 ์ค์
Team team1 = new Team("team1", "ํ1");
em.persist(team1); // ์ ์ฅ
Team team2 = new Team("team2", "ํ2");
em.persist(team2); // ์ ์ฅ
// ํ์1 ์ค์
Member member1 = new Member("member1", "ํ์1");
member1.setTeam(team1); // ์ฐ๊ด๊ด๊ณ ์ค์ Member -> Team
member1.setTeam(team2); // ์ฐ๊ด๊ด๊ณ ๋ณ๊ฒฝ Member -> Team (team2)
em.persist(member1); // ์ ์ฅ
for (Member member : team1.getMembers()) {
System.out.println("member.getUsername() = " + member.getUsername());
}
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally {
em.close();
}
- member1->team1 ์์ member1->team2๋ก ๋ฐ๊พผ ํ team1์ getMembers()๋ก team1์ ์ํ ํ์ ํ์ธ
์ถ๋ ฅ ๊ฒฐ๊ณผ
member.getUsername() = ํ์1
์๋ก์ด ์์์ฑ ์ปจํ ์คํธ์์๋ team1์์ members๋ฅผ ์กฐํํด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ ํค์๋ ๊ด๊ณ๊ฐ ๋์ด์ ธ ์์ผ๋ฏ๋ก ์๋ฌด๊ฒ๋ ์กฐํ๋์ง ์์ง๋ง(๋ง์ฐฌ๊ฐ์ง๋ก member1์์๋ team์ ์กฐํํ ์ ์์),
๋ฌธ์ ๋ ๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ด์์๋ ์ํ์์ teamA์ getMembers()๋ฅผ ํธ์ถํ๋ฉด member1์ด ๋ฆฌํด๋๋ค๋ ์ ์ ๋๋ค. ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋ ์ฐ๊ด๊ด๊ณ์์๋ ๊ด๊ณ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
๋ง์ฝ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ค๋ฉด, ์ด ๊ณต๊ฐ์ ๋ณด๊ด๋์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ค์ ์ค์์ ์ํ๋ก ์ ํ๋ฉ๋๋ค.
์ค์์ ์ํ์ ์ํฐํฐ ๊ฐ์ฒด๋ ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ๋์ด์ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
์ด๋ ์ธ๋ํค ๊ด๊ณ๋ ํจ๊ป ๋์ด์ง๊ฒ ๋ฉ๋๋ค.
์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ ์ธ๋ํค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์๋ง ์ ํจํ ๊ฒ์ด๋ฉฐ, ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋ฅผ ๋ฐ๋ ์ํฐํฐ ๊ฐ์ฒด๊ฐ ์ค์์ ์ํ๊ฐ ๋๋ฉด ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๊ณ๊ฐ ๋์ด์ง๊ธฐ ๋๋ฌธ์, ํด๋น ์ํฐํฐ ๊ฐ์ฒด์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ธ๋ํค ๊ด๊ณ๋ ๋์ด์ง๊ฒ ๋ฉ๋๋ค.
์๋ก์ด ์์์ฑ ์ปจํ ์คํธ์์ team1์ members ์กฐํ
try
{
Team team1 = em.find(Team.class, "team1");
for (Member member : team1.getMembers()) {
System.out.println("member.getUsername() = " + member.getUsername());
}
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally {
em.close();
}
- ์ถ๋ ฅ ๊ฒฐ๊ณผ X
<์ ๋ฆฌ>
- ๋จ๋ฑกํญ ๋งคํ์ ๋นํด ์๋ฐฉํฅ ๋งคํ์ ์กฐ๊ธ ๋ณต์กํ์ต๋๋ค.
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ ์ ํด์ผ ํ๊ณ , ๋ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์๋ฐฉํฅ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ก์ง๋ ์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋จ๋ฐฉํฅ ๋งคํ์์๋ ๊ฐ๋ฆฌํค๋ ์ชฝ์ด ์ธ์ ๋ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ, ์ธ๋ํค ๊ด๋ฆฌ์๊ฐ ๋ฉ๋๋ค.
- ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ์ฅ์ ์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ๊ฐ์ฒด๊ทธ๋ํ ํ์์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ ๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง ๋จ๋ฐฉํฅ์ ์ฐ์ ์ผ๋ก ํ๊ณ ๋ฐ๋์ชฝ ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด ํ์ํ ๊ฒฝ์ฐ ์๋ฐฉํฅ ๋งคํ์ ์ถ๊ฐํ๋๋ก ํฉ์๋ค.
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๋น์ฆ๋์ค ์ค์๋์ ๊ด๊ณ๊ฐ ์์ต๋๋ค. ๋ฌด์กฐ๊ฑด ์ธ๋ํค๋ฅผ ๊ฐ๊ณ ์๋ ์ชฝ์ ์ฃผ์ธ์ผ๋ก ์ค์ ํ๊ณ ๋ฐ๋์ชฝ์ mappedBy ์์ฑ์ ์ถ๊ฐํด ์ฃผ๋๋ก ํฉ์๋ค.
- + Tip : @ManyToOne ์์๋ ํญ์ Many์ชฝ์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๋ค๋๋ค ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2023.05.02 |
---|---|
[JPA] ๋ค๋์ผ, ์ผ๋๋ค, ์ผ๋์ผ (๋จ๋ฐฉํฅ, ์๋ฐฉํฅ) ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2023.05.01 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ - ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ (0) | 2023.04.29 |
[JPA] Entity Mapping : ํ๋ โก๏ธ ์ปฌ๋ผ ๋งคํ (0) | 2023.04.28 |
[JPA] Entity Mapping : ๊ธฐ๋ณธ ํค(PK) ๋งคํ (0) | 2023.04.27 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422