TIL 2023-11-17 Entity 연관 관계 정리!

2023. 11. 17. 23:05TIL
목차
  1. Entity의 연관관계
  2. 기본키와 외래키
  3. 외래키 PK말고 다른 걸로 안 되나?
  4. 연관관계 고민
  5. DB의 방향
  6. 외래키의 주인
  7. 외래키의 주인 - Entity에서 정하기

나는 노트파인가보다

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 간의 관계에서 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
  1. Entity의 연관관계
  2. 기본키와 외래키
  3. 외래키 PK말고 다른 걸로 안 되나?
  4. 연관관계 고민
  5. DB의 방향
  6. 외래키의 주인
  7. 외래키의 주인 - Entity에서 정하기
'TIL' 카테고리의 다른 글
  • TIL 2023-11-21 PUT과 PATCH의 차이
  • TIL 2023-11-20 CascadeType.REMOVE orphanRemoval = true 차이
  • TIL 2023-11-16 RestTemplate 짧은 설명
  • TIL 2023-11-15 JWT 검증 과정에서 일어나는 문제 해결 과정
wonow_
wonow_
꾸준히 성장하는 개발자 WONOW 입니다. 🤗
wonow_
wonow_
wonow_
전체
오늘
어제
  • 분류 전체보기
    • Language
      • JAVA
    • TIL
    • 코딩테스트
      • 프로그래머스
      • 백준
    • 프로젝트
      • JAVA
      • Spring
    • 기타
    • ERROR
      • Spring
    • CS
      • 알고리즘
      • DB
      • Kafka
    • 잡담
    • 활동
      • 척척박사

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 티스토리 꾸미기
  • 공부열심히하자
  • 문자열 붙여서 출력하기
  • 오블완
  • 프로그래머스
  • 나는바봉가봉가
  • 홀짝 구분하기
  • 문자열 돌리기
  • 티스토리챌린지

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
wonow_
TIL 2023-11-17 Entity 연관 관계 정리!
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.