단방향, 양방향

  • 테이블은 외래키 하나로 양방향 쿼리가 가능해서 방향이라는 개념이 없습니다.
  • 객체는 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있습니다.
  • 단방향 : 객체 관계에서 한쪽만 참조하는 것을 말합니다.
  • 양방향 : 객체 관계에서 양쪽이 서로 참조하는 것을 말합니다.

연관관계 주인

데이터베이스는 외래키 하나로 두 개의 테이블을 연관관계를 맺습니다.

데이터베이스는 연관관계를 관리하는 지점은 외래키 하나인 반면에 엔티티를 양방향으로 매핑하면 두 개의 객체는 서로 참조를 해서 객체의 연관관계를 관리하는 지점은 2개가 됩니다.
연관관계 주인은 두 객체의 연관관계 중 하나를 정해서 데이터베이스의 외래키를 관리하는 것입니다.
연관관계 주인은 @JoinColumn(name = "참조하는 테이블 기본키")

연관관계 주인이 아닌 것은 mappedBy = "연관관계 주인에서 정의한 변수"를 써주면 되고 단방향일 경우는 연관관계 주인에 @JoinColumn만 해주고 mappedBy를 안 해줘도 됩니다. 만약 양방향일 경우 연관관계 주인 아닌 곳에도 mappedBy를 해주시면 됩니다.

 

* 참고

@ManyToOne은 무조건 연관관계주인이기도 해서 mappedBy 속성이 없습니다.

 

연관관계 주인을 정하는 방법

  • 1 : N or N : 1 일 경우 : N이 연관관계 주인
  • 1 : 1 일 경우 : 주테이블이 연관관계 주인
  • M : N 일경우 : M과 N을 연결해주는 테이블 추가하여 1 : M과 N : 1을 만들어서 M과 N이 연관관계 주인

 

예시(팀 엔티티와 회원 엔티티)

 

Team엔티티 -> Member엔티티 : N

Member엔티티 -> Team엔티티  : 1

연관관계 주인 : Member엔티티

 

단방향일 경우

 

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

@Entity
@Getter @Setter
public class Member {

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

 

양방향일 경우

 

@Entity
@Getter @Setter
public class Team {
    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

@Entity
@Getter @Setter
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    public Team team;
}
  • 연관관계 주인이 아닌 Team엔티티에서 @OneToMany는 1 : N관계여서 엔티티를 하나 이상 참조할 수 있으므로 Collection, List, Set, Map 중 하나를 사용해야 합니다.

 

 

'JPA' 카테고리의 다른 글

[JPA] N+1 원인 및 해결방법  (0) 2023.01.18
[Querydsl] 스프링 부트에서 Querydsl 설정  (0) 2022.06.14
[JPA] 프록시, 즉시 로딩, 지연 로딩  (0) 2022.01.30
[JPA] 엔티티 매핑  (0) 2022.01.25
[JPA]영속성 컨텍스트란?  (0) 2022.01.19