ecsimsw

JPA / 연관 관계 매핑 / 단방향 매핑 본문

JPA / 연관 관계 매핑 / 단방향 매핑

JinHwan Kim 2020. 6. 26. 02:40

"T아카데미 / JPA 프로그래밍 기본기 다지기 - 김영한 " 강좌를 듣고 정리한 글입니다.

연관 관계 매핑

 

1. 데이터 중심 모델링

 

  아래 Member와 Team의 구조를 보자.

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    
    @Column(name= "TEAM_ID")
    private long teamId;
}
@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;
}

 

  위 설계처럼 기존의 데이터 중심 모델링으로 멤버에 대한 Team 객체를 얻고자 한다면,

 

  다음처럼 member.TeamId를 뽑고, 엔티티매니저에서 그 teamId에 해당하는 Team 객체를 찾아야할 것이다.  

 

  Member와 Team은 사실 연관관계가 없기 때문이다.

Member memberA = em.find(Member.class, member.getId());

Long teamId = memberA.getTeamId();

Team teamA = em.find(Team.class, teamId);

 

2. 단방향 매핑 / 객체 지향 모델링

 

  Member에 해당하는 Team 매핑은 가능하나, Team에 해당하는 Member는 매핑할 수 없다.

 

  이런 구조를 단방향 매핑이라고 한다.

 

  이 둘을 @JoinColumn을 사용하면 보다 객체 중심적으로 모델링이 가능하다.

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    
    @ManyToOne
    @JoinColumn(name="TEAM_ID")
    private Team team;
}
// member.setTeam(team); 멤버를 persist할 때도 team을 집접 넣음

Member memberA = em.find(Member.class, member.getId());
         
Team teamA = memberA.getTeam();

  @JoinColumn : 객체의 참조와 테이블 외래 키를 매핑한다.

 

 

  3. 지연 로딩 (FetchType = Lazy)

 

  Member안의 Team 객체의 로딩을 실제로 Team이 실제로 사용될 때로 지연하도록 하려면 FetchType을 바꾸면 된다.

 

  대부분의 경우에서 지연 로딩이 더 유리하다.

//default : FetchType.EAGER

@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name="TEAM_ID")

private Team team;

 

Comments