연관 관계 매핑

seongmin·2022년 11월 5일
0

Spring

목록 보기
32/38
post-thumbnail

다대일 연관 관계 매핑

@NoArgsConstructor
@Getter
@Setter
@Entity(name = "ORDERS")
public class Order {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderId;

 	...
	...

@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;

	...
	...
    }

다대일 연관관계 매핑에서 다(N)에 해당하는 ORDERS 테이블에서 @ManyToOne 애너테이션을 이용하여 일(1)에 해당하는 MEMBER 테이블과 다대일 매핑을 한다.

@JoinColumn 애너테이션으로는 ORDERS 테이블에서 외래키에 해당하는 컬럼명을 적어준다.

일반적으로 부모 테이블에서 기본키로 설정된 컬럼명과 동일하게 외래키 컬럼을 만드는데, 여기서는 MEMBER 테이블의 기본키 컬럼명이 MEMBER_ID 이기 때문이다.

다대일 매핑에 일대다 매핑 추가

  • 다대일 매핑이 되어 있는 상태에서 일대다 매핑을 추가하여 양방향 관계를 만들어준다.
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Member {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long memberId;
    ...
    ...
    
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
    
    ...
    ...
    }

@OneToMany(mappedBy = "member") 을 통해 매핑을 일대다 매핑을 해주는 모습을 볼 수 있다.

mappedBy 는 참조할 대상이 있어야 하는데 일대다 단방향 매핑의 경우에는 참조할 대상이 없다. 그러므로 일대다 단방향에서는 mappedBy 애트리뷰트의 값이 필요하지 않다.

현재 코드 상황에서...

MEMBER 테이블과 ORDER 테이블의 관계에서 ORDER 테이블의 외래키로 MEMBER 테이블의 기본키 컬럼인 MEMBER_ID의 값을 지정하고 있다.
그렇다면 Order 클래스에서 외래키의 역할을 하는 필드는 바로 member 필드이다.

그렇기 때문에 mappedBy의 값이 member 가 되는 것이다.


  • mappedBy 값은

    1. 두 객체들 간의 외래키의 역할을 하는 필드를 찾는다.
    2. 외래키의 역할을 하는 필드는 다(N)에 해당하는 클래스 안에 있다.

일대일 연관관계

일대일 연관 관계 매핑은 다대일 단방향 연관 관계 매핑과 매핑 방법은 동일하고 @OneToOne 애너테이션을 사용한다는 차이만 있다.

일대일 단방향 매핑에 양방향 매핑을 추가하는 방법도 다대일에 일대다 매핑을 추가하는 방식과 동일하다.

단, 역시 @ManyToOne 애너테이션이 아닌 @OneToOne 애너테이션을 사용한다.

엔티티 간의 연관 관계 매핑 권장 방법

  • 일대다 매핑은 사용하지 않는다.

  • 제일 먼저 다대일 단방향 매핑부터 적용한다.

  • 다대일 단방향 매핑을 통해 객체 그래프 탐색으로 조회할 수 없는 정보가 있을 경우, 그때 비로소 양방향 매핑을 적용한다.

0개의 댓글