본문 바로가기
부트캠프 개발일기/Spring MVC

50일차: 엔티티간 연관관계 매핑

by shyun00 2023. 4. 24.

❯ 연관관계 매핑

엔티티 클래스간의 관계를 만들어주는것을 연관관계 매핑이라고 한다.

테이블간의 관계를 만들때 외래키를 사용하는것과는 달리 엔티티 클래스간 관계는 객체 참조를 통해 이루어진다.

엔티티간 참조하는 객체 수에 따라 [1 : N], [N : 1], [N : N], [1 : 1] 의 관계로 구분된다.

1. 단방향 연관관계

단방향 관계는 크게 두가지로 구분할 수 있다.

-> 일대다 연관관계

     Member가 Order를 참조하는 단방향 관계

     Member에서는 Order 정보를 얻을 수 있으나 
     Order 에서는 Member의 정보를 얻을 수 없다.

 

-> 다대일 연관관계

     Order가 Member를 참조하는 단방향 관계

     Order에서 Member 정보를 얻을 수 있으나

     Member 에서는 Order의 정보를 얻을 수 없다.

2. 양방향 연관관계

-> 양방향 연관관계

     Member와 Order클래스가 서로 참조하는 양방향 관계

     양쪽 클래스가 서로의 참조 정보를 가지고 있다.

 

 

 

Spring Data JDBC에서는 단방향 연관관계만 지원되었으나 JPA는 단방향과 양방향 연관관계 모두를 지원한다.

일반적으로, 다대일 단방향 매핑을 먼저 한 후 일대다 단방향 매핑을 추가해서 양방향 연관관계를 만든다.

❯ 연관관계 코드 구현

1. 다대일 연관관계 매핑

위 사례에서 다(N)에 해당하는 것이 Order, 1에 해당하는 것이 Member 이다.

따라서 Order  클래스에서 아래와 같이 Member 클래스를 매핑(참조) 해주어야한다.

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

    @Enumerated(EnumType.STRING)
    private OrderStatus orderStatus = OrderStatus.ORDER_REQUEST;

    @Column(nullable = false)
    private LocalDateTime createdAt = LocalDateTime.now();

    @ManyToOne   // 다대일 관계를 매핑한다.
    @JoinColumn(name = "MEMBER_ID")  // 외래키에 해당하는 열 이름을 적어준다. memberId를 기준으로 매핑한다.
    private Member member;

    (...)
    
    }
}

2. 다대일 연관관계에 일대다 연관관계 매핑 추가

다대다 관계가 필요할 경우 다대일 연관관계에 일대다 연관관계 매핑을 추가하여 구현할 수 있다.

1에 해당하는 Member 클래스에 List<Order>를 매핑(참조) 해준다.

이때 사용되는 애너테이션은 @OneToMany(mappedBy =  "...")로, mappedBy에는 참조하는 클래스(N에 해당하는 클래스)에서 외래키 역할을 하는 필드를 설정한다.

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long memberId;

    @Column(length = 100, nullable = false)
    private String name;

    @Column(nullable = false)
    private LocalDateTime createdAt = LocalDateTime.now();
    
    @OneToMany(mappedBy = "member") // 일대다 관계를 매핑해준다.
    private List<Order> orders = new ArrayList<>(); // 일대다 관계이므로 List, Set과 같은 컬렉션을 사용한다.

    (...)
    
}