Spring 숙련 15 (Entity 연관 관계)
모두다 알다 시피
서비스를 이용 하는 데 한개의 SQL테이블& 엔티티 클래스 하나로만 운영 되지는 않습니다.
e.g 배달의 민족의 login account 엔티티 , memo 엔티티 , foodorder 엔티티 ...
그럴때
테이블 들 관하여 연관 관계 를 어떻게 표현 해야 할가요?
고객이 여러명 있을수 있고 & 여러개의 음식을 주문할수 있습니다.

우선 둘이 연결 될수 있게
ALTER TABLE users ADD food_id bigint;
food_id 를 유저에게 넣어 줍니다.
유저들도 추가
food table 에도 연결 될수 있게 user_id 추가
ALTER TABLE food ADD user_id bigint;
- 고객 테이블
- 한명의 고객은 음식을 여러개를 주문할 수 있습니다.
- 고객과 음식은 1 대 N 관계입니다
- 한명의 고객은 음식을 여러개를 주문할 수 있습니다.
음식들도 추가

//////////////////////////////////////////////////////////////////////////////////
- DB 테이블들간의 관계에서 방향의 개념이 존재할까요?
- 방향에는 크게 단방향과 양방향을 생각해 볼 수 있습니다.
- 예를 들어 단방향은 users 테이블에서만 food 테이블을 참조할 수 있을 때를 의미합니다.
- 양방향은 users 테이블과 food 테이블이 서로를 참조할 수 있을 때를 의미합니다.
- 그렇다면 DB 테이블간의 방향이 있는 게 맞을까요?
- 방향에는 크게 단방향과 양방향을 생각해 볼 수 있습니다.
////////////////////////////////////////////////////////////////////////////////
이렇게 N : M 관계 를 해결 하기 위해서 중간 테이블을 만들어 해결할수 있어요.
오더 테이블 만들기
drop table if exists food;
drop table if exists users;
create table users
(
id bigint not null auto_increment,
name varchar(255),
primary key (id)
);
create table food
(
id bigint not null auto_increment,
name varchar(255),
price float(53) not null,
primary key (id)
);
alter table orders
add constraint orders_user_fk
foreign key (user_id)
references users (id);
alter table orders
add constraint orders_food_fk
foreign key (food_id)
references food (id);
INSERT INTO users (name) VALUES ('Robbie');
INSERT INTO users (name) VALUES ('Robbert');
INSERT INTO food (name, price) VALUES ('후라이드 치킨', 15000);
INSERT INTO food (name, price) VALUES ('양념 치킨', 20000);
INSERT INTO food (name, price) VALUES ('고구마 피자', 30000);
INSERT INTO food (name, price) VALUES ('아보카도 피자', 50000);
INSERT INTO orders (user_id, food_id, order_date) VALUES (1, 1, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (2, 1, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (2, 2, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (1, 4, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (2, 3, SYSDATE());
'Robbie 가 주문란 음식 정보를 user 테이블 기준으로 조회'
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;

- 고객 1명은 음식 N개를 주문할 수 있습니다.
- 고객 : 음식 = 1 : N 관계
- 음식 1개는 고객 N명에게 주문될 수 있습니다.
- 음식 : 고객 = 1 : N 관계
- 결론적으로 고객과 음식은 N : M 관계입니다.
- 고객 : 음식 = N : M 관계
(DB에서는 어떤 테이블을 기준으로 하든 원하는 정보를 JOIN을 사용하여 조회할 수 있습니다.)
(이처럼 DB 테이블간의 관계에서는 방향의 개념이 없습니다)
Entity간의 연관 관계
그렇다면 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에서만 고객 Entity를 참조할 수 있습니다.
- 이러한 관계를 단방향 관계라 부릅니다.
- 고객 Entity에는 음식 Entity의 정보가 없기 때문에 음식 정보를 조회할 수 없습니다.
DB 테이블에서는
테이블 사이의 연관관계 를 FK(외래 키)로 맺을 수 있고 방향 상관없이 조회가 가능합니다.
Entity에서는
상대 Entity를 참조하여 Entity 사이의 연관관계를 맺을 수 있습니다.
상대 Entity를 참조하지 않고 있다면 상대 Entity를 조회할 수 있는 방법이 없습니다.
Entity에서는 DB 테이블에는 없는 방향의 개념이 존재합니다.