연관 관계 매핑

객체의 참조와 테이블의 외래 키를 매핑하는 것

 

 

연관 관계 매핑이 왜 필요할까?

객체를 테이블에 맞춰 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.

아래 두가지의 객체와 테이블의 차이를 보면 알 수 있다.

 - 테이블은 외래 키로 조인을 사용해 연관된 테이블 찾음

 - 객체는 참조를 사용해 연관된 객체를 찾음

 

 

연관 관계 정의 규칙

1) 방향 : 단방향,양방향

2) 연관 관계의 부모 : 연관 관계에서 관리의 주체

3) 다중성 : N:1 , 1:N, 1:1, N:M

 

 

 

단방향, 양방향

여기서 방향이란 한 Entity가 다른 Entity를 가질 수 있느냐로 보면 됩니다.

* 데이터베이스의 Forein Key (외래키) : 데이터베이스의 테이블은 FK하나로 두 개의 테이블이 JOIN가능하다.

* 객체의 참조용 필드 : 객체의 경우 참조용 필드가 있는 객체만 다른 객체를 참조하는 것이 가능하다.

 

 1) 단방향 : 두 객체 사이에 하나의 객체만 참조용 필드를 갖고 참조

 

 2) 양방향 : 두 객체 모두가 각각 참조용 필드를 갖고 참조한다. 양방향 관계를 설정하면 많은 테이블과 연관 관계를 맺게 되고

                   클래스가 굉장히 복잡해진다. 그래서 기본적으로 단방향 매핑을 하고 나중에 역방향으로 탐색이 필요할 때 추가하는게 좋다.

 

 

 

모델링의 예시를 보자

회원과 주문의 관계를 보자

1명의 회원이 여러 상품을 주문을 할 수 있다. 즉, 1:n입니다.

회원은 주문할 때 주문 Id를 알 필요가 있고,

주문에서는 어떤 회원이 주문했는지 알아야하기 때문에 회원 Id를 알 필요가 있습니다.

그렇다면 양방향 관계 매핑이 필요합니다.

그러면 각각 @OneToMany, @ManyToOne 을 이용해야합니다.

 

 

[ MEMBER ]

@Entity
public class Member {

    @Getter
    @Setter
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="MEMBER_ID")
    private Long id; // 시스템에 저장하기 위해 시스템이 정하는 변수

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

    @Getter
    @Setter
    @Column(name = "NAME")
    private String name; // 고객이 입력한 데이터

    public Member(){

    }
}

: MEMBER_ID 컬럼명의 id가 AUTO_INCREMET로 생성된다.

한 명의 회원이 여러 주문을 할 수 있으므로,

Member에서 Order은 @OneToMany를 합니다.

여기서 mappedBy는 양방향 관계 설정 시 관계의 주체가 되는 쪽에서 정의합니다.

그러니까 회원의 입장에서 여러 주문을 하는 것으로 즉, 주체가 회원이므로 mappedBy는 회원에 작성합니다.

 

 

 

[ ORDER ]

@Entity
@Table(name="ORDERS")
public class Order {
    @Getter
    @Setter
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ORDER_ID")
    private Long id;

    @Getter
    @Setter
    @ManyToOne
    @JoinColumn(name="MEMBER_ID")
    private Member member;
    
    public Order() {

    }
}

: Order에서 Member은 @ManyToOne을 합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'JPA(MySQL,H2Database)' 카테고리의 다른 글

임베디드 값 타입  (0) 2022.08.08
SQL 내장함수  (0) 2022.08.05
JPQL 와 JPQL의 테스트 코드 작성  (0) 2022.07.29
EntityManager  (0) 2022.07.29
exception just for purpose of providing stack trace  (0) 2022.07.13

+ Recent posts