JPA #5 ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์ ๋ฌธ์ ์ , ์ฐ๊ด ๊ด๊ณ ๋งคํ
by JiwonDev๐ ํ ์ด๋ธ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ฒด๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
๊ธฐ์กด์ JDBC๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ ๊ฐ์ฒด ์ค๊ณ๋ฅผ ํ ์ด๋ธ์ ๋ง์ถฐ์ผํ๋ค๋ ๋จ์ ์ด ์์๋ค. ๊ฐ์ฒด๊ฐ ์๋ ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ.
public class Order{
private Long id;
private Long memberId; // ์ฐ๊ด ๊ด๊ณ๋ ๋จ์ํ id๋ก ํํ
// ... ์ดํ ์๋ต ... //
}
private Member member // ์ด๋ ๊ฒ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ์ ์๋ค.
member.getAddress().getCity() // ์ด๋ฐ๊ฑด ๋น์ฐํ ๋ถ๊ฐ๋ฅ
๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด ๋ถ๊ฐ๋ฅํ๊ณ , ๋จ์ํ id ๊ฐ๋ง ๊ฐ์ง๊ณ ์์ ๋ฟ ๊ฐ์ฒด๋ผ๋ฆฌ ์ด๋ ํ ๊ด๊ณ๋ ์ฐ๊ฒฐ๋์ด์์ง ์๋ค.
JPA๋ก ์ฝ๋๋ฅผ ์ฎ๊ธฐ๋ฉด, ์๋์ ๊ฐ์ด ๋ง๋ค ์ ์๊ฒ ๋ค.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamId; //๋ง์ฝ Team ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด?
…
}
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
…
}
์๋ฌด๋ฆฌ JPA๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค, ์ด๋ ๊ฒ ์ง์ ํด๋ฒ๋ฆฌ๋ฉด ์๋ณ์(id)๋ฅผ ์ด์ฉํด์ ํ๋ฒ ๋ ์กฐํํด์ผํ๋ค.
์ด๋ ๊ฒ ๊ฐ์ฒด์งํฅ์ ํฌ๊ธฐํ๊ณ ํ ์ด๋ธ์ ๋ง์ถฐ ๋ชจ๋ธ๋งํ๋๊ฒ ๋ง๋ ๋ฐฉ๋ฒ์ผ๊น?
//ํ์ ์ ์ฅ
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId()); // ๊ทธ๋ฅ id๊ฐ์ ์ ์ฅ
em.persist(member);
//์กฐํ
Member findMember = em.find(Member.class, member.getId());
//์ฐ๊ด๊ด๊ณ๊ฐ ์์. ๊ทธ๋ฅ id ๊ฐ์ผ๋ก ์กฐํํ๋ ๊ฒ์ผ ๋ฟ์
Team findTeam = em.find(Team.class, team.getId());
- DB ํ ์ด๋ธ์ ์ธ๋ ํค์ ์กฐ์ธ์ ์ด์ฉํด์ ์ฐ๊ด๋ ํ ์ด๋ธ์ ์ฐพ๋๋ค.
- ๊ฐ์ฒด์์๋ ์ธ๋ ํค๋ผ๋ ๊ฐ๋ ์ด ์๋ค. ์ฐธ์กฐ๋ฅผ ํตํด์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๋๋ค.
๊ฐ์ฒด์งํฅ์ ์ด๋ ํ ๋ฌธ์ ๋ฅผ ๊ฐ ๊ฐ์ฒด๋ค์ด ํ๋ ฅํ๊ณ ์ฑ ์์ ๋๋ ํด๊ฒฐํ๋ค.
๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ๋ง์ถ์ด์ ์์ ๊ฐ์ด ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ๋ชจ๋ธ๋งํ๋ฉด, ํ๋ ฅ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์๋ค.
๐ ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ
@ManyToOne์ผ๋ก ๋จ๋ฐฉํฅ ๋งคํ์ ์ค์ ํ๊ณ
@JoinColumn์ผ๋ก ์กฐ์ธํ ์นผ๋ผ์ ์ง์ ํด์ฃผ๋ฉด ๋๋ค. ์ ๋ ธํ ์ด์ ์ผ๋ก ๋งคํ์ด ๋๋๋ค.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
์ด๋ ๊ฒํ๋ฉด ๋๋๊ฒ๋ ์ฌ์ฉํ ๋ ๊ทธ๋ฅ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฏ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฌ์ง์ด ํ ํธ๋์ญ์ ์์ ๋ ๋ค ์์ฑํ๋ฉด 1์ฐจ ์บ์๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์, ์ปค๋ฐ ์ ์๋ DB ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ์ง๋ ์๋๋ค.
//ํ ์ ์ฅ
Team team = new Team();
em.persist(team);
//ํ์ ์ ์ฅ
Member member = new Member();
member.setTeam(team); //๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ์ค์ , ์ฐธ์กฐ ์ ์ฅ
em.persist(member)
//์กฐํ
Member findMember = em.find(Member.class, member.getId());
//์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๊ด๊ณ ์กฐํ
Team findTeam = findMember.getTeam();
๋ง์ฝ ๋ค๋ฅธ Team์ผ๋ก ๊ต์ฒดํ ๋๋, ๊ทธ๋ฅ Member.setTeam(~)์ผ๋ก ๋ณ๊ฒฝํ๋ฉด DB ์ธ๋ํค ๊ฐ์ด ์ ๋ฐ์ดํธ๋๋ค.
๐ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ
์ ์๊ฐํด๋ณด๋ฉด, DB ํ ์ด๋ธ์๋ '๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ'๋ผ๋ ๊ฐ๋ ์์ฒด๊ฐ ์กด์ฌํ์ง ์๋๋ค.
์ ์ด์ ์ธ๋ ํค๋ก ๊ด๊ณ๋ฅผ ๋งบ์๋ค๋ฉด, ์์ชฝ์์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ฒด๋ ๊ทธ๋ ์ง ์๋ค. ์ฐธ์กฐ ๊ฐ์ด ์์ผ๋ฉด ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ ๋จ๋ฐฉํฅ ์ฐธ์กฐ 2๊ฐ๋ฅผ ๋ง๋ค์ด ์๋ฐฉํฅ์ผ๋ก ๋ง๋ค์ด์ผํ๋ค.
๋ค๋ง ์ธ๋ํค๋ก ๊ด๊ณ๊ฐ ๋งบ์ด์ก๋ค๋ฉด ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ์ ์ฌ๋ถ์ ์๊ด์์ด DB ํ ์ด๋ธ์ ๋๊ฐ๋ค๋ ๊ฑธ ์ธ์งํ์.
์ฐ์ Member์์ ๋ค๋ฅธ์ ์ ์๋ค. ๋จ๋ฐฉํฅ ๋งคํ๊ณผ ๋์ผํ๋ค.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
Team์์๋ @OneToMany๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ์ฌ๋ฌ Member๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ปฌ๋ ์ ์ ์ด์ฉํด์ผํ๋ค.
* ๋จ, mappedBy๋ฅผ ์ ๋๋ก ์ดํดํ๊ณ ์์ง ์์ผ๋ฉด DB์ ์ ๋๋ก ๋ฐ์๋์ง ์๋๋ฐ, ์ด๋ ์๋์์ ์์๋ณด์.
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "team") // Member.team ์ด ์ฃผ์ธ์.
List<Member> members = new ArrayList<Member>();
}
์ด์ Team์์ Member๋ฅผ ์กฐํํ ์ ์๊ฒ ๋์๋ค.
//์กฐํ
Team findTeam = em.find(Team.class, team.getId());
int memberSize = findTeam.getMembers().size(); //์ญ๋ฐฉํฅ ์กฐํ
โ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๊ณผ (mappedBy="~")
mappedBy๋ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ(=์ธ๋ํค๋ฅผ ์์ ํ ์ ์๋ ์ชฝ)์ ์ค์ ํ ๋ ์ฌ์ฉ๋๋ค.
@OneToOne, @OneToMany, @ManyToMany ์์ ์ฌ์ฉํ ์ ์๋ ์ต์ ์ด๋ฉฐ, mappedBy๊ฐ ์๋ค๋ฉด JPA์์๋ ์๋ฐฉํฅ ๊ด๊ณ๋ก ์ค์ ํ์ง ์์ ์ํ๋ก ํ ์ด๋ธ์ ๋งคํํ๋ค.
// List<players>๊ฐ ๊ด๊ณ์ ์ฃผ์ธ์์ ๋ํ๋ด๊ธฐ์ํด, mappedBy = "team" ์ ์ ์ด์ค๋ค.
@OneToMany(mappedBy = "team") // Member.team
private List<Player> players = new ArrayList<Player>();
๊ทธ๋ฐ๋ฐ @OneToMany๋ฅผ ์ฌ์ฉํ ๋, ๋ฐ๋์ mappedBy๋ก ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํด์ค์ผํ๋ค. ์ ๊ทธ๋ด๊น?
@OneToMany // ?? ๊ทธ๋ฅ ์ด๋ ๊ฒ ์ฌ์ฉํด๋ ๋ณ ๋ฌธ์ ์๋๊ฑฐ ์๋๊ฐ?
List<Member> members = new ArrayList<Member>();
๊ทธ ์ด์ ๋ ๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ 2๊ฐ๋ฅผ ๊ฐ์ง์ง๋ง, DB๋ ์ธ๋ํค 1๊ฐ๋ก ์๋ฐฉํฅ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
- DB์์๋ 1๊ฐ์ ์ธ๋ํค๋ก ํ ์ด๋ธ์ ์๋ก ์ฐธ์กฐํ ์ ์๋ค.
- ๊ฐ์ฒด์์๋ ๋จ๋ฐฉํฅ ์ฐธ์กฐ๊ฐ 2๊ฐ๊ฐ ๋ง๋ค์ด์ง๋ค. ์ฆ ์ธ๋ํค ์ญํ ์ ํ๋ ์ฐธ์กฐ๊ฐ 2๊ฐ๊ฐ ์์ฑ๋๋ค.
๋ณ๋ก ์์ค์ํด๋ณด์ฌ๋, ์ด๋ ๋งค์ฐ ์ค์ํ๋ค. ์ธ๋ํค๋ฅผ ๋ณ๊ฒฝํ๋๊ฑด 'ํ ๊ฐ์ฒด๋ง' ๊ฐ๋ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- DB๋ ์ธ๋ํค๊ฐ 1๊ฐ์ง๋ง, ๊ฐ์ฒด์๋ ์์ชฝ ๋ ๊ฐ์ง ์ฐธ์กฐ๊ฐ์ด ์๋ค.
Member โก Team ์ฐธ์กฐ๊ฐ
Team โก Member ์ฐธ์กฐ๊ฐ - ๊ทธ๋ฅ ๋ ๊ฐ์ ์ฐธ์กฐ๊ฐ ๋ค ๋งคํํ๋ฉด ์๋๋?
๊ทน๋จ์ ์ผ๋ก Member.team์๋ ๊ฐ์ ๋ฃ๊ณ , Team.members์๋ ๊ฐ์ ๋ฃ์ง ์๋๋ค๋ฉด?
๋ฐ๋๋ก Member.team์ ๊ฐ์ ๋ฃ์ง ์๊ณ , Team.members์๋ง ๊ฐ์ ๋ฃ๋๋ค๋ฉด?
์๋๋ฉด ๋ ๋ค ๋ค๋ฅธ ๊ฐ์ ๋์์ ๋ฃ๋๋ค๋ฉด?
๊ฐ์ ์ฐธ์กฐ์ธ๋ฐ ์์ชฝ์ ๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด JPA๋ ๋ฌด์์ ๊ธฐ์ค์ผ๋ก ๋ณ๊ฒฝํ์ง? - ๋ฐ๋ผ์ ๊ท์น์ด ์๊น
๋ ์ค ํ๋๋ก ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค โก ์ฐ๊ด๊ด๊ณ(์ธ๋ํค)์ ์ฃผ์ธ
(์ฃผ์ธ์ด Member) Member์ ์๋ team๊ฐ์ด ๋ฐ๋์์ ๋ ์ธ๋ํค ๊ฐ์ ์ ๋ฐ์ดํธ ํด์ผํ๋.
(์ฃผ์ธ์ด Team) Team์ ์๋ members๊ฐ์ด ๋ฐ๋์์ ๋ ์ธ๋ํค ๊ฐ์ ์ ๋ฐ์ดํธ ํด์ผํ๋.
๊ทธ๋์ JPA์์๋ ์ธ๋ํค๋ฅผ ๋ค๋ฃฐ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ ํ๊ณ , ์ฃผ์ธ์ด ์๋ ์ชฝ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์ด์๋ค.
์ฆ ์ฐ๊ด๊ด๊ณ์ โจ์ฃผ์ธ์ด ์๋ ์ชฝ์์๋, ์ฐธ์กฐ๊ฐ์ ํตํด ๊ฐ์ ์์ ํ ์ ์๋ค. ์์ ํด๋ DB์ ๋ฐ์๋์ง ์๋๋ค.
๋ ์๋ฌด ์๊ฐ์์ด ์ฃผ์ธ์ ์ ํด๋ฒ๋ฆฌ๋ฉด ๊ฐ์ฒด์ฒ๋ผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์์ง๊ณ , ์ ํ ์๊ด์๋ ํ ์ด๋ธ์ DB ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
โ ๋๊ตฌ๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ ํด์ผํ๋๊ฐ?
ํด๋น ์ธ๋ ํค๊ฐ ์๋ ๊ณณ์ ์ฃผ์ธ์ผ๋ก ์ ํด์ผํ๋ค.
๋น์ฆ๋์ค๋ง๋ค Team์ด ์ฃผ์ธ์ด ๋ ์๋, Member๊ฐ ์ฃผ์ธ์ด ๋ ์๋ ์๋ค. ๊ทธ๋ฌ๋ ๋ณดํต์ ๋ค๋์ผ ๋ฐฉํฅ์ผ๋ก, Many๊ฐ ์ฃผ์ธ์ด ๋๋๊ฒ ์ข๋ค. ์์ ์์ ์์๋ ManyToOne ๊ด๊ณ์์ Many์ชฝ, Member.team์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ค.
๋ฌผ๋ก Team์ ์ฃผ์ธ์ผ๋ก ์ ํ ์ ๋ ์๋ค. ์ ๊ทธ๋ ๊ฒ ํ๋ฉด ์๋ ๊น?
- ํ๋์ ํ์ ์ฌ๋ฌ Member๋ฅผ ๊ฐ์ง๋ค. ๋ง์ฝ Team์ ์์ ํ๊ฒ๋๋ฉด ๋ชจ๋ members์๊ฒ DB ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
- Member์์ ์ธ๋ํค๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ๋๋ฌธ์, Member๊ฐ ์ค์ค๋ก Team์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ฒ๋ฆฐ๋ค.
๋ณ๋ก ์ด๋ ต์ง์์ง๋ง ์ค์ ์ฝ๋์์ ์ ๋ง ์ ๋ง ๋ง์ด ์ค์ํ๋ ๋ถ๋ถ์ด๋ค. JPA๋ฅผ ์ดํดํ๊ณ ์์ง์์ผ๋ฉด ์ฐพ๊ธฐ๋ ์ด๋ ต๋ค.
// ํด๋น JPA์ฝ๋๋ Member์ Team์ด ์ฐ๊ฒฐ๋์ง ์๋๋ค. DB ์ธ๋ํค์๋ null์ด ๋ค์ด๊ฐ์๋ค.
// ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ๋ณด์ด๋๊ฐ?
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
team.getMembers().add(member);
em.persist(member)
์๋์ ๊ฐ์ด ์ธ๋ํค๋ฅผ ๊ฐ์ง ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ (Member)์์ ๋ฑ๋กํด์ฃผ์ด์ผ ๋๋ค.
member.setTeam(team); //์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ ์ค์
์ฃผ์ธ์ชฝ์ธ member์์ ๋จ๋ฐฉํฅ ๋งคํ๋ง ํด์ฃผ๋๋ผ๋, ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
// Team์๋ ์ฐ๊ด ๊ด๊ณ ์ค์ ์ ํ์ง ์์์.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
// Member์์๋ team๊ณผ ๊ด๊ณ ์ค์ ์ ํ์์.
Member member = new Member();
member.setName("member1");
member.setTeam(team);
em.persist(member)
// ํ์คํ๊ฒ DB์์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์์ ํ ์ ๊ฑฐ
em.flush();
em.clear();
// Team์์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ง์ ํ์ง ์์์์๋, ์๋์ ๊ฐ์ด ์ฌ์ฉํด๋ member๊ฐ ์ ์ ์ฐธ์กฐ๋จ.
Team findTeam = em.find(Team.class, team.getId());
findTeam.getMembers();
โ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ ์์ชฝ์์ ๋งบ์ด์ฃผ๋๊ฒ ์ข๋ค.
์์์ ๋งํ๋๋ก ์ฃผ์ธ์ชฝ (Member)์์๋ง ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด๋, ์๋ฐฉํฅ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธดํ๋ค.
ํ์ง๋ง ์ค์ ์ฌ์ฉ์ ์๋์ ๊ฐ์ด ๊ด๊ณ๋ฅผ ๋ถ์ฌ์ ์์ชฝ์์ ๋ค ๋งบ์ด์ฃผ๋๊ฒ ๋ง๋ค.
member.setTeam(team);
team.getMembers().add(member); // ์ฅ? ์ด๊ฑด DB์ ๋ฐ์์ด ์๋๋ค๋ฉด์์? ๊ท์ฐฎ๊ฒ ์ ๊ตณ์ด
๋ ํ์คํ ๋ฐฉ๋ฒ์, ๊ทธ๋ฅ ์์์ ์ผ๋ก ๋์ํ๊ฒ Member์ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ์๊ฐ ๋ฐ๋ก ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋งบ์ด๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
Team์์ ์๋์ ๊ฐ์ด ์ค์ ํด์ค๋ ์๊ด์ ์๋ค. ๋ค๋ง ์์ชฝ ๋ค ํ๋ฉด ๋ฌดํ๋ฃจํ & ๋ฒ๊ทธ์ ์ํ์ด ์์ผ๋ฏ๋ก ํ๋๋ง ํ์.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
public void setTeam(Team team){
this.team=team;
team.getMembers().add(this); // ๋ฐ๋ก ์์ชฝ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค์ .
}
}
๊ตณ์ด ์ด๋ ๊ฒ ํ๋๊ฑด Java๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์์ฐ์ค๋ฌ์์ ๊ทธ๋ฐ ๊ฒ๋์์ง๋ง, ๋ด๋ถ๋์์๋ ์ฐจ์ด๊ฐ ์๋ค.
- ํ ํธ๋์ญ์ ๋ด์์ ์ ๋๋ก ์กฐํ๊ฐ ๋์ง ์์ ์ ์๋ค.
DB์ ๋ฐ์์ด ๋๋ ์์ ์๋ ์๊ด์์ง๋ง, ์๋์ ๊ฐ์ด ํ ํธ๋์ญ์ ์์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค. ๋น์ฐํ ์ปค๋ฐ ๋๊ธฐ์ ์์ํ Team ๊ฐ์ฒด์๋ ์์ง ๊ฐ์ด ๋ค์ด๊ฐ์ง ์์์ผ๋๊น.
// Team์๋ ์ฐ๊ด ๊ด๊ณ ์ค์ ์ ํ์ง ์์์.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
// Member์์๋ team๊ณผ ๊ด๊ณ ์ค์ ์ ํ์์.
Member member = new Member();
member.setName("member1");
member.setTeam(team);
em.persist(member)
// ์กฐํํ๋ฉด null์ด ๋์จ๋ค.
// ๋น์ฐํ๊ฑฐ๋ค. ์ปค๋ฐ๋์ง ์์์ผ๋ฉด ์์ํ ์๋ฐ ๊ฐ์ฒด๋๊น. ๊ฐ์ ๋ฃ์์ ์ด ์์์?
Team findTeam = em.find(Team.class, team.getId());
findTeam.getMembers();
Team์์ ์๋์ ๊ฐ์ด ์ค์ ํด์ค๋ ์๊ด์ ์๋ค. ๋ค๋ง ์์ชฝ ๋ค ํ๋ฉด ๋ฌดํ๋ฃจํ & ๋ฒ๊ทธ์ ์ํ์ด ์์ผ๋ฏ๋ก ํ๋๋ง ํ์.
์์ชฝ์ผ๋ก ์ค์ ํ์ง ๋ง๋ผ๋ ์ด์ ์ ๊ฐ๊ฒ toString(), lombok, JSON ๋ฑ์ ์ฌ์ฉํ ๋ ์๋ฐฉํฅ ๋งคํ์ ์๋ชป์ฌ์ฉํ๋ฉด ๋ฌดํ๋ฃจํ๊ฐ ์๊ธธ ์ ์๋ค. ์ด๋ฅผ ์กฐ์ฌํด์ ์ฌ์ฉํ๋๋ก ํ์.
์ ์ผ ์ข์ ๋ฐฉ๋ฒ์ lombok์์ team.toString() ๊ฐ์ ๊ฑธ ์์ ์ฐ์ง๋ง๊ณ , ์คํ๋ง ์ปจํธ๋กค๋ฌ์์ Entity ๋์ DTO๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค. ์ด๊ฒ๋ง ์ฃผ์ํด๋ ํฐ ๋ฌธ์ ๊ฐ ์์๊ธด๋ค.
// ์ด๋ ๊ฒ ์์ชฝ์ผ๋ก ๋ฌดํ ์ฐธ์กฐ๋ฅผ ํ๋ฉด์ ์ฑ์ด ์ฃฝ์ด๋ฒ๋ฆด ์ ์๋ค.
public toString(){
return "member=" + name + "team" + team; // team.toString() ํธ์ถ
}
public toString(){
return "team members" + members; // member.toString() ํธ์ถ
}
๐ ๊ฒฐ๋ก : ์๋ฐฉํฅ ๋งคํ์ ๋๋๋ก์ด๋ฉด ์ฌ์ฉํ์ง ๋ง์ธ์.
DB ํ ์ด๋ธ์ ์ฒ์ ์ค๊ณํ ๋, ๋จ๋ฐฉํฅ ๋งคํ๋ง์ผ๋ก ์ค๊ณ๋ฅผ ์๋ฃํ๋ ๊ฒ ์ข๋ค.
์ด์ฐจํผ ManyToOne ๊ด๊ณ๊ฐ ๋์ค๋ฉด ์กฐํํ๋ ๋ฐฉํฅ์ ์ฝ๊ฒ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์์ ๋ฐฐ์ ๊ฒ ์ง๋ง ๊ฐ์ฒด์ ์ฅ์์ ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉํ๋๊ฑด ์ ๋ง ๋จธ๋ฆฌ ์ํ ์ผ์ด๋ค. ์ต์ด ์ค๊ณ์๋ ๋จ๋ฐฉํฅ๋ง ์ฌ์ฉํ์.
๊ทธ๋ฆฌ๊ณ ๋์ ์๋ฐฉํฅ ๋งคํ์ด ๊ผญ ํ์ํ ๋ (ex JPQL์ ์ด์ฉํด์ ์ญ๋ฐฉํฅ์ผ๋ก ํ์ํ ๋) ์ฌ์ฉํ๋๊ฒ ์ข๋ค.
์ด์ฐจํผ ์๋ฐฉํฅ, ๋จ๋ฐฉํฅ์ ๊ฐ์ฒด์๋ง ์๋ ๊ฐ๋ ์ด๊ณ DB ํ ์ด๋ธ์๋ ์๋ฌด๋ฐ ์ํฅ์ด ์์ด์ ํ์ํ ๋ ์ฝ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
'๐ฑBackend > JDBC & JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA #7 ๊ณ ๊ธ ๋งคํ (์์ ๊ด๊ณ) (0) | 2021.11.09 |
---|---|
JPA #6 ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ (1:N, N:1, N:N) (0) | 2021.11.09 |
JPA #4 ์ํฐํฐ ๋งคํ (๊ฐ์ฒด-ํ ์ด๋ธ ๋งคํ) (0) | 2021.11.08 |
JPA #3 ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ, ์์์ฑ ์ปจํ ์คํธ (0) | 2021.11.07 |
JPA #2 ๋ณธ๊ฒฉ์ ์ผ๋ก ์์๋ณด์. (0) | 2021.11.07 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev