SPRING

[SPRING] JPA 연관관계

집한구석 2021. 5. 19. 18:09
728x90

연관관계 매핑 구성 

  • 방향 : 단방향 / 양방향이 있음, 방향은 객체관계에서만 존재함, 테이블 관계같은 경우 항상 양방향
  • 다중성 : 다대일, 일대다, 일대일, 다대다와 같은 다중성이 존재
  • 연관관계의 주인 : 객체를 양방향 관계로 만들시, 주인을 지정해야함  

연관관계는 객체들의 협력 공동체를 만들기 위하여 필요함, JPA에서 가장 중요한 것은 객체와 테이블을 어떻게 매핑되는지 이해하는 것이므로 연관관계는 중요함


테이블 중심의 설계의 문제

  • 객체를 테이블에 맞추어서 모델링할 경우, 협력관계를 만드릭가 어려움
  • 테이블은 외래키로 조인을 사용하여, 연관된 테이블을 찾고, 객체는 참조를 사용하여 연관된 객체를 찾음
  • 테이블과 객체사이의 이러한 차이로 인한 제약조건이 생김

단방향 연관관계

객체 연관관계 예시

객체 연관관계

  • 회원 객체는 Member.team 필드로 팀 객체와 연관관계를 맺음
  • 회원 객체와 팀 객체는 단방향 관계 (회원객체에서 팀으로 member.getTeam()으로 가능하지만 Team은 접근필드가 없음 불가)

테이블 연관관계

  • 회원 테이블은 TEAM_ID 외래키로 팀테이블과 연관관계
  • 회원 테이블과 팀 테이블은 양방향 관계 (TEAM_ID를 조인해서 회원에서 TEAM로 조회, Team에서 회원 조회)

객체, 테이블 연관관계 차이

  • 객체는 참조를 통한 연관 관계이므로 단방향관계이기 때문에 양방향으로 만들려면 반대쪽에도 필드추가가 필요함, 테이블은 양쪽다 외래키를 통한 조인으로 접근이 가능하기 때문에 양방향관계

양방향 연관관계

  • 단방향 관계에서 예시를 보면 Member에서 Team으로 접근이 가능하지만 Team에서 Member로 접근이 불가함, 하지만 참조를 넣어두면 양쪽에서 접근이 가능하게됨
  • 이러한 양쪽에서 접근이 가능하도록 양쪽다 관계를 설정하면 양방향 연관관계가 됨
  • JPA 설계를 진행할 때는 단방향으로 설계를 진행하고, 추후에 JPQL을 통하여 역방향으로 조회할 일이 많기 때문에 해당 부분이 필요한 경우에 양방향으로 설정해 주는 것이 좋음
  • 무조건 양방향으로 매핑할 경우는 추후에 비즈니스적으로 매우 복잡해짐

객체 관계 매핑 예시

@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
public class Member {

  @Id
  @GeneratedValue
  @Column(name = "member_id")
  private Long id;
 
  private String username;
  
  @ManyToOne //다대일 관계 매핑 정보 설정 (회원과 팀은 다대일 관계)
  @JoinColumn(name = "team_id") //외래키 매핑 설정
  private Team team;

  public void setTeam(Team team) {
  	this.team = team;
  }
}

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "name"})
public class Team {

  @Id
  @GeneratedValue
  @Column(name = "team_id")
  private Long id;
  private String name;

}

단방향 관계를 매핑 할 때 둘 중 어떤 것을 사용해야하는 지는 반대편 관계에 달려있음. 반대편이 일대다이면 다대일 관계 일대일관계면 일대일 관계 사용하면 됨


연관관계 주인

  • 객체의 두 관계 중 하나의 연관관계를 주인으로 지정
  • 연관관계의 주인이 외래키를 관리 (등록, 수정)
  • 연관관계의 주인이 아닌 경우 단순 조회만 가능함
  • 주인이 아닌 경우 mappedBy로 주인을 지정해야함
  • 외래키가 있는 곳으로 주인으로하는 규칙을 하는경우 설계가 깔끔해져서 외래키가 있는 테이블에서 관리가 됨 (DB의 N에 해당하는 경우 연관관계의 주인으로 함, 외래키가 없는경우 무조건 다대일에서 일에 해당됨)

연관관계 요약

  • 단방향 매핑만으로도 이미 연관관계 매핑은 완료된 것임
  • 양방향 매핑은 반대방향으로 조회 기능이 추가된 것
  • 단방향 매핑을 잘하고 양방향 매핑을 필요할 때 추가해도 됨
  • 연관관계 주인을 정하는 기준은 외래키의 위치를 기준으로 정해야함

'SPRING' 카테고리의 다른 글

[SPRING] DISPATCHER-SERVLET  (0) 2021.06.07
[SPRING] Bean  (0) 2021.05.23
[SPRING] 컨테이너 (Container)  (0) 2021.05.23
[SPRING] 의존성 주입  (0) 2021.05.17
[SPRING] JPA 영속성 컨텍스트  (0) 2021.05.16