JPA 관련 웹 애플리케이션 제작 과제를 진행하던 중 JPA 쿼리 동작 방식의 이해도가 낮아서 애플리케이션 제작에 어려움을 느끼고 이를 해결하고자 인프런에서 김영한님의 ORM 강의를 공부하며 그 내용들을 기록하고자 한다.
자세한 엔티티 정의는 이전글에서 확인할 수 있다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
//역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);
em.persist(member);
이전 포스팅에서 말했듯이 양방향 매핑에서 테이블의 입력이나 수정등은 주인 객체만이 가능하다.
그렇기 때문에 위의 예제처럼 주인 객체가 아닌 객체에 연관관계를 설정하게되면 외래키에 값이 들어가지 않게된다.
그렇기 때문에 꼭 관계설정은 주인객체를 통해 해야한다.
하지만 순수한 객체 관계에서 볼 때 주인뿐만 아니라 주인이 아닌 객체에도 값을 넣어서 양쪽 모두에 값을 설정하는 것이 바람직하다고 볼 수 있다.
이를 위해 양방향 매핑의 편의 메서드라는 것을 추가해주면 좋다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
team.getMembers().add(member);
위의 코드는 양쪽 엔티티 모두 값을 넣는 예제이다.
하지만 매번 데이터 삽입마다 두 엔티티를 각각 세팅한다는 것은 효율적이지 못한 일이므로 주인 엔티티쪽에 편의 메서드를 작성하는 것이 좋다.
@Entity
public class Member {
...생략
@ManyToOne
@JoinColumn(name = "TEAM_ID)
private Team team;
public void setTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
이런식으로 간단하게 setter
메서드에 주인이 아닌 객체의 값세팅까지 추가해준다면 주인 객체의 값설정만으로도 두 객체의 설정이 이루어질 수 있다.