728x90

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