연관 관계 매핑
객체의 참조와 테이블의 외래 키를 매핑하는 것
연관 관계 매핑이 왜 필요할까?
객체를 테이블에 맞춰 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
아래 두가지의 객체와 테이블의 차이를 보면 알 수 있다.
- 테이블은 외래 키로 조인을 사용해 연관된 테이블 찾음
- 객체는 참조를 사용해 연관된 객체를 찾음
연관 관계 정의 규칙
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 |