본문 바로가기

TIL

TIL 240524 Entity 연관관계

Entity 연관관계

 

1. 고객 테이블

- 한명의 고객은 음식을 여러개를 주문할 수 있습니다.

- 고객과 음식은 1 N 관계입니다.

 

2. 음식 테이블

- 하나의 음식은 여러명의 고객에게 주문될 수 있습니다.

- 음식과 고객은 1 N 관계입니다.

 

3. 주문 테이블

- 주문에 대한 정보를 기록할 orders 테이블을 추가합니다.


- 
고객 1명은 음식 N개를 주문할 수 있습니다.

- 고객 : 음식 = 1 : N 관계

- 음식 1개는 고객 N명에게 주문될 수 있습니다.

- 음식 : 고객 = 1 : N 관계

- 결론적으로 고객과 음식은 N : M 관계입니다.

- 고객 : 음식 = N : M 관계

 

 

 

단방향users 테이블에서만 food 테이블을 참조할 수 있을 때를 의미

양방향users 테이블과 food 테이블이 서로를 참조할 수 있을 때를 의미

 

고객 ‘Robbie’가 주문한 음식 정보를 users 테이블 기준으로 조회

SELECT u.name as username, f.name as foodname, o.order_date as orderdate
FROM users u
         INNER JOIN orders o on u.id = o.user_id
         INNER JOIN food f on o.food_id = f.id
WHERE o.user_id = 1;

 

‘Robbie’가 주문한 음식 정보를 food 테이블 기준으로 조회

SELECT u.name as username, f.name as foodname, o.order_date as orderdate
FROM food f
         INNER JOIN orders o on f.id = o.food_id
         INNER JOIN users u on o.user_id = u.id
WHERE o.user_id = 1;

 

DB에서는 어떤 테이블을 기준으로 하든 원하는 정보를 JOIN을 사용하여 조회할 수 있다

이처럼 DB 테이블간의 관계에서는 방향의 개념이 없다

 

JPA Entity에서 테이블간의 연관 관계

음식 : 고객 = N : 1 관계를 표현

 

음식

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

 

고객

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user")
    private List<Food> foodList = new ArrayList<>();
}

 

 

한명의 고객은 여러번 주문이 가능한 상황

- 이를 Entity에서 여러번 가능함을 표현하기 위해 Java 컬렉션을 사용하여 List<Food> foodList = new ArrayList<>() 이처럼 표현할 수 있다.

  • DB 테이블에서는 고객 테이블 기준으로 음식의 정보를 조회하려고 할 때 JOIN을 사용하여 바로 조회가 가능하지만 고객 Entity 입장에서는 음식 Entity의 정보를 가지고 있지 않으면 음식의 정보를 조회할 방법이 없습니다.
  • 따라서 DB 테이블에 실제 컬럼으로 존재하지는 않지만 Entity 상태에서 다른 Entity를 참조하기 위해 이러한 방법을 사용합니다.
  • 현재 음식 Entity와 고객 Entity는 서로를 참조하고 있습니다.
    • 이러한 관계를 양방향 관계라 부름.

 

단방향 관계에서의 표현

 

음식

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

 

고객

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

 

 

  • 음식 Entity에서만 고객 Entity를 참조할 수 있습니다.
    • 이러한 관계를 단방향 관계라 부릅니다.
    • 고객 Entity에는 음식 Entity의 정보가 없기 때문에 음식 정보를 조회할 수 없습니다.

 

 

<정리>

  • DB 테이블에서는 테이블 사이의 연관관계를 FK(외래 키)로 맺을 수 있고 방향 상관없이 조회가 가능합니다.
  • Entity에서는 상대 Entity를 참조하여 Entity 사이의 연관관계를 맺을 수 있습니다.
  • 하지만 상대 Entity를 참조하지 않고 있다면 상대 Entity를 조회할 수 있는 방법이 없습니다.
  • 따라서 Entity에서는 DB 테이블에는 없는 방향의 개념이 존재합니다.

'TIL' 카테고리의 다른 글

240528 MVC 패턴  (0) 2024.05.29
240527 TIL 1대1 관계, N대1관계, 1대N관계, N대M관계  (0) 2024.05.28
TIL 240523 JDBC  (0) 2024.05.24
TIL 240522 NAVER Open API  (0) 2024.05.23
TIL 240521 Bean  (0) 2024.05.21