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 |