본문 바로가기

JPA 프로그래밍

[자바 ORM 표준 JPA 프로그래밍] 실전 예제2 - 연관관계 매핑 시작( 3/3 )

- 실전예제 1에 이어서 진행

https://github.com/oss0202/jpashop

 

oss0202/jpashop

Contribute to oss0202/jpashop development by creating an account on GitHub.

github.com

- 테이블 구조

실전예제1과 테이블 구조는 동일

  • 외래키(FK)가 있는 테이블이 연관관계 주인

 

- 객체 구조

  • 참조를 사용하도록 변경

 

- 단방향 매핑 진행

  • 객체 입장에서는 무조건 단방향이 좋다.
  • 양방향일 경우 신경쓸 부분이 많아진다.

- Order, OrderItem 수정

  • 외래키가 있으므로 연관관계의 주인
// Order.java
// 이전
@Column(name = "MEMBER_ID")
private Long memberId;

// 연관관계 매핑 후
@ManyToOne // 여러 주문을 한 회원은 하나
@JoinColumn(name = "MEMBER_ID")
private Member member;


// OrderItem.java
// 이전
@Column(name = "ORDER_ID")
private Long orderId;

@Column(name = "ITEM_ID")
private Long itemID;

// 연관관계 매핑 후
@ManyToOne // 여러 주문 상품의 주문은 하나
@JoinColumn(name = "ORDER_ID")
private Order order;

@ManyToOne // 여러 상품의 주문 상품은 하나
@JoinColumn(name = "ITEM_ID")
private Item item;

 

- 양방향 매핑 진행

1. Member

  • 실무를 기준으로 보면 굳이 Order Entity와 양방향 매핑을 할 필요가 없다.
  • 회원들이 주문한 목록을 조회하고 싶다면 Member.getOrders(회원의 주문 목록)가 아닌 Order.getmember(주문의 회원목록)를 통해서 풀어나가기 떄문이다.
  • 그러나 예제이기 때문에 진행해 보겠다.
  • Member가 굳이 Order를 알 필요가 없다고 한다.
    • 실시간 어플리케이션에서 특정 회원의 주문을 조회하고 싶을 때에 Member에 접근해서 orders를 조회하지 않는다.
    • Order에도 member_id(외래키)가 존재하기 때문에 굳이 Member에 orders를 넣을 필요가 없다.
    • 결론
      • Order부터 시작하면 된다.
      • 객체의 관계를 잘 맺고, 끊을 수 있어야 한다.
...

	@OneToMany(mappedBy = "member")
    @JoinColumn(name = "MEMBER_ID")
    private List<Order> orders = new ArrayList<>();// 초기값 세팅, NPE 예방, 메모리를 약간 잡아먹긴 함
    
...

2. Order

  • orderItems는 비즈니스적으로 가치가 있을 확률이 높다.
  • 주문서에 포함된 상품 목록을 찾을 일이 많다.
    • 실무에서도 많이 쓴다
..
    @ManyToOne // 여러 주문을 한 회원은 하나
    @JoinColumn(name = "MEMBER_ID")
    private Member member;
...

 

3. OrderItem

  • '1 : 다' 일 때 '다'에 외래키가 존재합니다. 그래서 아래처럼 order, item을 수정한다.
..
    @ManyToOne // 여러 주문 상품의 주문은 하나
    @JoinColumn(name = "ORDER_ID")
    private Order order;
...
    @ManyToOne // 여러 상품의 주문 상품은 하나
    @JoinColumn(name = "ITEM_ID")
    private Item item;
...

 

4. Item

  • 연관관계를 추가해도 된다.
  • 보통 상품이 어떤 주문으로 나갔는지 어플리케이션에서는 중요하지 않다.
  • 나중에 데이터로 통계를 내기위해서 연관관계를 사용한다.

 

- 강사의 실무조언

  • 핵심은 단방향을 잘 설계하는게 중요하다.
  • 비즈니스 상으로는 양방향 연관관계를 설정하는게 나을수도 있다.
    • 연관관계의 주인이 아는거는 조회만 할 수 있다.
  • 실무에서는 JPQL을 결국 많이 작성하게 된다.
    • Order를 조회할 때 OrderItem를 조회하고 싶을 떄가 있다.
    • 이 때 양방향 연관관계를 추가하게 된다.
    • 하지만 Order, OrderItem을 따로따로 조회해도 된다.

 

 

 

출처

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com