[JPA] 다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다)
프로그래밍 언어/JPA

[JPA] 다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다)

반응형

다양한 연관관계 매핑

 

우선 연관관계 매핑에 대해서 알아보기전에 테이블과 객체의 단방향, 양방향 개념을 이해해야한다.

 

테이블과 객체의 단방향, 양방향

테이블은 외래키 하나로 양쪽 조인이 가능하며, 사실 방향이라는 개념이 없다.

 

객체는 참조용 필드가 있는 쪽으로만 참조가 가능하며, 한쪽만 참조면 단방향! 양쪽이 서로 참조면 양방향!

객체에서 양방향일 경우에는 연관관계의 주인을 정해줘야하는데, 이때 연관관계 주인은 외래키를 관리하는 객체(테이블)을 주인으로 정하면 된다.

쉽게 생각하면 테이블은 항상 다(N)쪽이 외래키를 관리한다.

 

다대일 ( N:1 )

다대일 단방향

가장 많이 사용하는 연관관계이며, 다대일의 반대는 일대다이다.

 

Member객체에서 Team객체를 참조하는 구조

@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String username;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    Team team;
  }

다대일 양방향

양쪽을 서로 참조하도록 설계하며, 외래 키가 있는 쪽이 연관관계의 주인이다.

Member는 그대로 둔 상태에서 Team에 관계를 추가해야한다.

@Entity
public class Team {

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

    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();

}

 

일대다 ( 1:N ) 

일대다 매핑 보다는 다대일 매핑을 사용!

일대다 단방향

일대다 단방향은 일대다( 1:N )에서 일(1)이 연관관계의 주인이 되며, 객체와 테이블의 차이 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조이다. 엔티티가 관리하는 외래 키가 다른 테이블에 있기 떄문에 연관관계 관리를 위해 추가로 UPDATE SQL이 실행된다.

 

@JoinColumn을 꼭 사용해야한다. 그렇지 않으면 조인 테이블 방식을 사용하기 때문에 중간에 테이블이 추가된다.

create table Team_Member (
       Team_TEAM_ID bigint not null,
        members_MEMBER_ID bigint not null
    )

 

테이블 일대다 관계는 항상 다(N) 쪽에 왜리 키가 있다. 

일대다 단방향 매핑 보다는 다대일 양방향 매핑을 사용하는것을 권장

public class Team {

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

    private String name;

    @OneToMany
    @JoinColumn(name = "TEAM_ID")
    private List<Member> members = new ArrayList<>();
 }

일대다 양방향

이런 매핑은 공식적으로 존재하지 않기 때문에 읽기 전용 필드를 사용해서 양방향 처럼 사용한다.

public class Member {
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String username;

    @ManyToOne
    @JoinColumn(insertable = false, updatable = false)
    private Team team;
 }

 

일대일 ( 1:1)

일대일 관계는 반대도 일대일이기 때문에 주 테이블이나 대상 테이블 중에 외래 키 선택이 가능하며, 다대일(@ManyToOne) 단방향 매핑과 유사하다.

 

반응형