[JPA] 양방향 매핑의 편의 메서드

재호·2022년 6월 21일
0

개요

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 메서드에 주인이 아닌 객체의 값세팅까지 추가해준다면 주인 객체의 값설정만으로도 두 객체의 설정이 이루어질 수 있다.

profile
Java, Spring, SpringMVC, JPA, MyBatis

0개의 댓글