1) DB table 간의 연관관계
❓고객이 음식을 주문시, 주문 정보는 어느 테이블에 들어가야 할까?
- 고객테이블
- 고객 한 명이 음식 여러 개 주문 가능 ➡️ 1 대 N 관계(일대다 관계)
- 불필요하게 고객의 이름이 중복되는 문제 발생
- 음식테이블
- 한 개의 음식은 여러 명의 고객에게 주문될 수 있음 ➡️ 1 대 N 관계(일대다 관계)
- 불필요하게 고객의 이름이 중복되는 문제 발생
- 그렇다고 해서 user_id나 food_id를 1,2 이런식으로 여러 개 넣는 것은 추가, 조회 시 많은 문제가 발생할 수 있어 현실적으로 불가능 (이런 방식은 RDBMS에서 불가능)
➡️ 주문에 대한 정보를 기록할 orders 테이블 추가.
❓ DB 테이블들간의 관계에서 방향의 개념이 존재할까?
- DB에서는 어떤 테이블을 기준으로 하든 원하는 정보를 JOIN을 사용해 조회가능함으로
DB테이블의 관계에서 방향의 개념이 없음.
1) 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; }
- 고객 엔티티와 연관관계를 맺기 위해 상대 엔티티의 필드(user)를 가짐.
- 음식이 N이기 때문에 @ManyToOne annotation을 달아줌.
- 고객
@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<>(); }
- 한 명의 고객이 여러 번 주문을 할 수 있기 때문에 List<Food> foodList = new ArrayList<>() 로 표현
- DB 테이블과는 달리, 고객 Entity 입장에서는 음식 Entity의 정보를 가지고 있지 않으면 음식의 정보를 조회할 방법이 없기 때문에 DB에서 실제 컬럼으로 존재하지는 않지만 Entity 상태에서 다른 Entity를 참조하기 위해 이러한 방법으로 표현
- 한 명의 고객이 여러 번 주문을 할 수 있기 때문에 List<Food> foodList = new ArrayList<>() 로 표현
- 음식
- 단방향 관계일 경우,
- 음식
@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를 조회할 수 있는 방법이 없음.
- 음식
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] Entity 클래스 간의 관계 (0) | 2023.11.20 |
---|---|
[Spring] RestTemplate (0) | 2023.11.10 |
[Spring] Spring Security / Validation (1) | 2023.11.09 |
[Spring] Filter (0) | 2023.11.09 |
[Spring] JWT / 패스워드 암호화 (0) | 2023.11.08 |