Entity의 연관관계
실제 서비스에서는 Entity 하나로 연관 관계없이 구현하는 경우가 없다.
DB를 배울 때 기본키(PK) 와 외래키(FK)로 서로 참조를 할 수 있다는 것을 배웠다
기본키와 외래키
- 기본키
- 테이블 내에서 각 행을 구별하기 위해 사용
- 중복되지 않는 유일한 값
- 외래키
- 다른 테이블의 기본키를 참조하는 역할
외래키 PK말고 다른 걸로 안 되나?
다른 테이블의 기본키 말고 다른 필드를 외래키로 사용하는 것은 일반적인 방법은 아니다.
데이터의 무결성을 보장해줄 수 없기 때문이다.
Unique 제약 조건 달면 무결성 유지 되는 거 아닌가?
맞다... 근데
데이터 베이스 설계 관점에서 예측 가능하고 명확한 구조를 유지하는 것이 중요하기에
특별한 요구가 있지 않은 이상 이런 방법은 비선호 한다고 한다.
연관관계 고민
고객이 음식을 주문하는 걸 구현하는 DB를 만드려는데 어떻게 만들까...?
고객 테이블이 음식 외래키를 참조?
음식 테이블이 고객 외래키를 참조..? ->
food_id | user_id | foodname |
1 | 1 | 후라이드 |
2 | 1 | 양념 |
3 | 2 | 후라이드 |
4 | 2 | 양념 |
중복된 값이 너무 많이 들어간다 !
우리는 테이블간의 관계 정의를 해야한다.
고객은 여러 개의 음식을 주문 할 수 있다. - 1:N (OneToMany)
음식은 여러 고객에게 주문 될 수 있다. - 1:N (OneToMany)
고객과 음식은 다 대 다 관계다 - N:M (ManyToMany)
이런 N:M 관계의 경우 중간 테이블을 사용하여 쉽게 해결 할 수 있다.
DB의 방향
- DB에서 테이블 간 관계에서 방향이라는 개념이 존재 할까?
- 여기서 방향은 단방향/양방향이 존재한다.
- 단방향 - 고객 테이블 -> 음식 테이블
- 일방적인 참조를 할 수 있을 때를 의미
- 양방향 - 고객 테이블 <-> 음식 테이블
- 서로 참조를 할 수 있을 때를 의미
- 단방향 - 고객 테이블 -> 음식 테이블
- 여기서 방향은 단방향/양방향이 존재한다.
- DB에서는 Join을 통해 어떤 테이블을 기준으로 잡아도 조회가 가능하다.
- 이처럼 DB에서는 테이블간의 방향이라는 개념이 없다.
근데... Entity에서는 방향이라는 개념이 존재한다...
- Entity에서는 상대 Entity를 참조하여 Entity 사이의 연관 관계를 맺을 수 있다.
- 하지만 상대 Entity를 참조하지 않고 있다면 상대 Entity를 조회할 수 있는 방법이 없다.
- 이게 단방향이다.
- 따라서 Entity에서는 DB 테이블엔 존재하지 않는 방향의 개념이 존재한다.
- Entity는 객체형태이기 때문에 서로 참조하기 위해 상대 Entity의 타입을 필드를 가지고 있어야한다.
- 참조할만한 필드가 없다면 조회가 불가능한 상황이 발생해서 방향이라는 개념이 생겼다.
- 하지만 상대 Entity를 참조하지 않고 있다면 상대 Entity를 조회할 수 있는 방법이 없다.
외래키의 주인
- Entity 간의 관계에서 DB의 외래키를 관리하는 Entity를 관리하는 Entity를 지정하는데 사용된다.
JPA에서 Entity간의 관계를 맵핑할 때, 한 쪽 Entity가 다른 Entity를 참조한다.
이때 외래키의 주인은 이 관계에서 외래키를 실제로 DB에 저장하고 관리하는 Entity를 말한다.
즉 외래키의 주인은 DB 테이블에서 외래키를 포함하는 쪽이다.
외래키의 원래 주인이 아닌
외래키를 직접 가지고 있는 Entity가 주인이라는 것
외래키의 주인 - Entity에서 정하기
@JoinColumn() 애너테이션을 주인이 될 Entity에 달아준다.
- 컬럼명, null여부, unique 여부 지정 가능
외래키의 주인만이 외래키를 등록, 수정, 삭제 할 수 있다.
주인이 아닌 쪽은 외래키를 읽기만 가능하다.
이 부분이 중요하다..
절대! 헷갈리면 안된다.
'TIL' 카테고리의 다른 글
TIL 2023-11-21 PUT과 PATCH의 차이 (0) | 2023.11.21 |
---|---|
TIL 2023-11-20 CascadeType.REMOVE orphanRemoval = true 차이 (0) | 2023.11.20 |
TIL 2023-11-16 RestTemplate 짧은 설명 (1) | 2023.11.16 |
TIL 2023-11-15 JWT 검증 과정에서 일어나는 문제 해결 과정 (1) | 2023.11.15 |
TIL 2023-11-13 Session과 JWT 뭐가 더 좋을까? (2) | 2023.11.13 |