반응형
Entity 연관 관계
데이터베이스에서 테이블 간의 관계를 의미합니다. 객체 간의 관계를 효과적으로 표현하고 관리하며 Spring에서는 JPA를 사용하여 엔티티 간의 연관관계를 다룹니다.
1대 1 관계 (One-to-One)
어떤 엔티티 쪽에서 상대 엔티티와 반드시 단 하나의 관계를 가지는 것을 말합니다.
학생
학생은 하나의 주소를 가지고 있습니다.
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 1대1 관계: 학생은 하나의 주소를 가짐
@OneToOne
@JoinColumn(name = "address_id")
private Address address;
}
학생 주소
학생의 주소는 학생과 연관 되어 있습니다.
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String street;
private String city;
private String zipCode;
// 1대1 관계: 주소는 하나의 학생과 관련됨
@OneToOne(mappedBy = "address")
private Student student;
}
양방향 관계
두 엔티티 간에 상호적인 관계가 있는 경우를 나타냅니다. 한 엔티티가 다른 엔티티를 참조하고 동시에 그 엔티티도 다시 첫 번째 엔티티를 참조하는 관계입니다. 양방향 관계에서 외래키의 주인을 지정해 줄 때는 mappedBy를 이용합니다.
여기서 mappedBy란 양방향 관계에 사용되는 JPA 어노테이션의 속성중 하나입니다. 양방향 관계에서 두 엔티티 간에 매핑을 설정하는 데 사용됩니다.
N대 1관계
한쪽 엔티티가 다른 쪽 엔티티와 여러 개체를 가질 수 있지만, 다른 쪽 엔티티는 여러 개체 중 하나만 소유할 수 있는 관계를 나타냅니다.
메뉴
메뉴에 여러 요리가 속할 수 있게 OneToMany 사용
@Entity
public class Menu {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// N대1 관계: 하나의 메뉴에 여러 요리가 속함
@OneToMany(mappedBy = "menu")
private List<Dish> dishes;
}
요리
각 요리가 하나의 메뉴에 속할 수 있게 ManyToOne 사용
@Entity
public class Dish {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// N대1 관계: 여러 요리가 하나의 메뉴에 속함
@ManyToOne
@JoinColumn(name = "menu_id")
private Menu menu;
}
N대 M 관계
관계를 가진 양쪽 엔티티 모두에서 1:N 관계를 가지는 것을 말하며 서로가 서로를 1:N관계로 보고 있는 것을 말합니다.
주문
한번 주문할 때 여러 개의 상품이 포함될 때는 ManyToMany 사용
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 다대다 관계: 한 주문에 여러 상품이 포함될 수 있음
@ManyToMany
@JoinTable(
name = "order_product",
joinColumns = @JoinColumn(name = "order_id"),
inverseJoinColumns = @JoinColumn(name = "product_id")
)
private List<Product> products;
}
제품
한 상품이 여러 주문에 속할 경우
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 다대다 관계: 한 상품이 여러 주문에 포함될 수 있음
@ManyToMany(mappedBy = "products")
private List<Order> orders;
}
728x90
'Spring(Boot & FrameWork)' 카테고리의 다른 글
ORM (0) | 2023.11.10 |
---|---|
JPA 영속성 (0) | 2023.11.07 |
IoC와 DI (0) | 2023.11.06 |