JPA [기본] 연관 관계1 (방향)

신재원·2023년 1월 24일
0

JPA 기본

목록 보기
8/31

연관관계 란?

  • 간단히 말해 객체의 참조와 테이블의 외래 키를 매핑하는것을 말한다.

연관관계 용어

방향 (Direction)

  • 방향에는 단방향과 양방향이 있다.
  • 객체는 참조용 필드를 가지고있는 객체만 연관된 객체를 조회 할수 있음으로 방향이 존재한다.

단방향 연관관계

<회원과 팀의 관계 예시>

  • 회원은 하나의 팀에만 소속된다.
  • 팀은 여러 회원들이 존재한다.
  • 따라서 회원과 팀은 N:1 관계이다.

@Entity
public class Member {

  @Id @GeneratedValue
  @Column(name = "MEMBER_ID")
  private Long id;
  
  private String username;
  
  @ManyToOne
  @JoinColumn(name = "TEAM_ID")
  private Team team;
}

@Entity
public class Team {
	
  @Id @GeneratedValue
  @Column(name = "TEAM_ID")
  private Long id;
  
  private String name;

}
  • N : 1 (다대일) 연관관계를 맺을때는 @ManyToOne 어노테이션 사용
  • 외래 키를 매핑할 때는 @JoinColunm 어노테이션을 사용하고, name 옵션에 외래 키 필드 (Column) 이름을 넣는다.
  • 객체 연관관계
    • 회원과 팀 객체는 단방향 관계다. 회원은 Member.team 필드를 통해서 팀을 알 수 있지만 반대로 팀은 회원을 알 수 없다.
  • 테이블 연관관계 (테이블 연관관계는 항상 양방향)
    • 회원 테이블은 TEAN_ID 외래 키로 팀 테이블과 연관관계를 맺는다.
    • 회원 테이블의 TEAM_ID 외래 키를 통해서 회원과 팀을 조인할 수 있고 반대로 팀과 회원도 조인할 수 있다.
  • 객체 연관관계와 테이블 연관관계의 차이
    • 참조를 통한 연관간계는 언제나 단방향
    • 객체간에 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해서 참조를 보관해야 한다.
    • 결국 연관관계를 하나 더 만들어야 한다

양방향 연관관계

@Entity
public class Team {
    ......
  
    @OneToMany(mappedBy = "Team")
    private List<Member> members = new ArrayList<>();
}
  • 여기선 미리 단방향으로 연관관계를 맺었기 때문에 Team 엔티티에만 추가하면 된다.
  • 1:N 연관관계일 때는 @OneToMany 애노테이션을 사용한다.
  • 양방향일 때 주인이 아닌 엔티티는 mappedBy 옵션에 반대쪽 매핑의 필드 이름을 넣는다.

연관관계 주인과 mappedBy

  • 객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다.
  • 객체 연관관계 = 2개

    • 참조를 통해 매핑
    • 회원 --> 팀 연관관계 1개 (단 방향)
    • 팀 --> 회원 연관관계 1개 (단 방향)
  • 테이블 연관관계 = 1개
    • 외래키 하나로 두 테이블 조인 가능
    • 회원 <--> 팀의 연관관계 1개 (양 방향)

연관 관계 주인

  • 양방향 매핑 규칙
    • 연관관계의 주인만이 외래 키를 관리 (등록, 수정)
    • 주인이 아닌쪽은 읽기만 가능
    • 주인은 mappedBy 속성 사용 X
    • 주인이 아닌쪽이 mappedBy 속성으로 주인 지정
  • 외래 키가 있는곳을 주인으로 지정 !!

0개의 댓글