연관관계 매핑 시 주의사항

shin·2023년 7월 31일
0

💡 연관관계의 주인

  • 외래키가 있는 곳을 연관관계의 주인으로 정하는 것이 좋음

  • 연관관계의 주인 쪽에 값을 세팅, 반대편은 값 조회만 수행

  • 연관관계의 주인은 단순히 외래키를 누가 관리하냐의 문제

    • 일대다 관계에서 항상 다쪽에 외래키가 있으므로 이를 연관관계의 주인으로 정하면 됨
    • 비즈니스상 우위에 있다고 주인으로 정하면 안됨
  • 예를 들어 자동차와 바퀴가 있을 때, 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는 바퀴 테이블의 외래 키 값이 업데이트됨

    • 관리와 유지보수가 어렵고, 추가적으로 별도의 업데이트 쿼리가 발생하는 성능 문제가 있음
    • 따라서 외래 키가 있는 바퀴를 연관관계의 주인으로 정함

💡 양방향 연관관계 매핑 규칙

  • 2개의 단방향 관계 중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인이 FK의 등록 및 수정을 관리
  • 주인이 아닌 경우에는 읽기, 즉 조회만 가능함
  • 주인은 mappedBy 옵션을 사용하지 않음
  • 주인이 아닌 경우, mappedBy 옵션을 사용하여 관계의 주인을 명시

💡 양방향보다 단방향을 더 권장하는 이유

  • 단방향 매핑만으로 연관관계는 충분히 구현이 되기 때문에 양방향으로 구현하지 않는 것이 좋음
  • 단방향으로 매핑된 관계를 역방향으로 조회하는 경우에는 양방향으로 매핑하는 것이 필요함, 하지만 이를 제외하고는 단방향으로 매핑하는 것이 좋음
  • 데이터를 조회할 때, 조인하는 방향이 일방적이라면 FK가 양쪽 다 가지고 있다고 하더라도 단방향 매핑으로 충분함

💡 다대다 관계의 문제점

예제

Student table

학번이름
1김씨
2이씨

Class Table

과목코드과목명
C1Java
C2C++
C3Python
  • 학생은 여러 과목 수강이 가능하고, 한 과목은 여러 학생이 수강이 가능함
  • 김씨C1, C2를 수강하고, 이씨C2, C3를 수강한다고 가정
  • 학생이 수강한 정보를 확인하고, 과목의 수강생 정보를 확인하기 위해서는 아래와 같이 표가 재구성되어야 함

Student table

학번이름과목코드
1김씨C1
1김씨C2
2이씨C2
2이씨C3

Class Table

과목코드과목명수강학생
C1Java1
C2C++1
C2C++2
C3Python2

문제점

  • 테이블의 PK가 없어짐
    • 학번과 과목코드만으로 데이터 구분이 어려워짐
  • 학번이 1번인 학생의 수강 과목을 확인하기 위해선 Student table를 확인하거나, Class table을 확인하면 되기 때문에 조회가 애매해짐
  • 이름이나 과목명의 변경이 필요할 때, 수정해야하는 데이터의 양이 많아짐

해결방법

  • 맵핑 테이블인 수강신청 테이블을 학생과 과목 테이블 사이에 추가해서 관계를 풀어내야 함

Student table

학번이름
1김씨
2이씨

| 1:N
수강신청 table

수강번호학번과목코드
11C1
21C2
32C2
42C3

| M:1
Class Table

과목코드과목명
C1Java
C2C++
C3Python
  • PK는 학번, 수강번호, 과목코드로 유지됨
  • 데이터 변경 시 반영해야 하는 데이터의 양이 줄어듦
profile
Backend development

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기