ERD로 보는 양방향 연관관계

노건우·2023년 10월 11일
0

Spring

목록 보기
18/22


이러한 구조의 테이블을 구성하고자 한다.
어떻게 해야 할까?

Member

package com.codingbox.jpashop.domain;

import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter @Setter
public class Member {
	@Id // 키 값을 id로 설정
	@GeneratedValue	//전략 생략하면 AUTO로 세팅
	@Column(name = "MEMBER_ID")//DB입장
	private Long id; // 객체 입장
	private String name;
	private String city;
	private String street;
	private String zipcode;
	
	@OneToMany(mappedBy = "member")
	private List<Order> orders = new ArrayList<>();
	
	public void addOrder(Order order) {
		order.setMember(this);
		this.orders.add(order);
	}
	
}

mappedBy를 통해 종속관계에 있다는 것을 알 수 있다.
addOrder메서드는 Order 객체를 Member 객체와 연결하고, Member 객체의 orders 리스트에 해당 Order 객체를 추가하는 역할을 한다.

Order

package com.codingbox.jpashop.domain;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

//@Entity
@Getter @Setter
@Table(name = "ORDERS")
public class Order {
	
	@Id
	@GeneratedValue //전략 생략했기 때문에 auto로 세팅
	@Column(name="ORDER_ID")
	private Long id;
	@ManyToOne
	@JoinColumn(name="MEMBER_ID")
	//private Long memberId;
	private Member member;
	private LocalDateTime orderDate;
	private String status;
	
	@OneToMany(mappedBy = "order")
	private List<OrderItem> orderitems = new ArrayList<>();
	
	public void addOrderItem(OrderItem orderitem) {
		orderitem.setOrder(this);
		this.orderitems.add(orderitem);
	}
}

주 관계와 종속 관계를 둘 다 가지고 있다. Member테이블과 비교하면 주 관계이지만, addorderitem테이블과 비교하면 종속이다. 아무튼 member테이블과 놓고 보자면
@JoinColumn(name="MEMBER_ID")
private Member member; 이 부분을 이용해 MEMBER_ID를 fk값으로 가져온다.

OrderItem

package com.codingbox.jpashop.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;

//@Entity
@Getter @Setter
public class OrderItem {
	
	@Id
	@GeneratedValue
	@Column(name = "ORDER_ITEM_ID")
	
	private Long id;
	
//	@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;
	private int orderPrice;
	private int count;
}

외래키를 item에서 하나, order에서 하나 가져온다. 종속되는 부분이 없기에 mappedBy는 사용되지 않는다. 외래키를 받는 방법에 대해 좀 자세히 보자.
@Column(name="ORDER_ID")
private Long orderId; 기존엔 이러한 방식으로 외래키를 가져왔다면

@ManyToOne
@JoinColumn(name="ORDER_ID")
private Order order; 이젠 이런식으로 가져온다.

✍️두 방법의 차이는 무엇일까?
@JoinColumn는 엔티티 간의 관계를 설정할 때 사용된다는 점에서 차이가 있다. 주로 양방향 관계에서 사용되며, 부모 엔티티와 자식 엔티티 간의 관계를 정의하고 어떤 열(외래 키)을 사용하여 이 관계를 구성할 것인지를 지정한다.
결국 양방향 관계를 설정하면서 @JoinColumn 어노테이션을 사용하였고 엔티티 간의 관계를 정의한다.

Item

 package com.codingbox.jpashop.domain;

import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;

//@Entity
@Getter @Setter
public class Item {
	@Id
	@GeneratedValue
	@Column(name = "ITEM_ID")
	
	private Long id;
	private String name;
	private int price;
	private int stockQuantity;
	
	@OneToMany(mappedBy = "item")
	private List<OrderItem> orderitems = new ArrayList<>();
	
	public void addOrderItem(OrderItem orderitem) {
		orderitem.setItem(this);
		this.orderitems.add(orderitem);
	}
	
	
}

⭐크게 특이 사항은 없다.종속 관계라는점과
pk값으로 ITEM_ID을 가지고 addOrderItem 메서드에서
orderitem.setItem(this)는 OrderItem 객체의 item 필드를 현재 Item 객체(this)로 설정하는 역할을 한다

profile
초보 개발자 이야기

0개의 댓글