베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • leetcode
    • 코드업
    • 데이터베이스
    • 함수형인터페이스
    • dfs
    • 이펙티브자바
    • 운영체제
    • 스프링
    • BFS
    • 자바8
    • C++
    • java
    • 자바
    • Spring
    • jpa
    • 토비스프링
    • 스프링시큐리티
    • 스레드
    • 알고리즘
    • 백준

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    [JPA] 연관관계의 주인이 '다'쪽에 있는 이유
    JPA

    [JPA] 연관관계의 주인이 '다'쪽에 있는 이유

    2022. 9. 18. 16:44

    연관관계의 주인이 '다'쪽에 있는 이유에 대해 살펴보자. 이를 위해 먼저 객체지향세계와 DB의 차이에 대해 알아야 한다.

     

    🔍 객체지향과 DB, 연관관계의 주인이 필요한 이유

       Member와 Team이라는 클래스 또는 테이블이 있다고 해보자. 여기서 이 둘은 다대일 단방향 관계이다. 객체지향에서 Member Team은 다음과 같이 표현될 수 있다.

    public class Member {
        int id;
        String memberName;
        Team team;
    }
    
    public class Team {
        int id;
        String teamName;
    }

    RDBMS에서는 다음과 같이 표현이 된다.

    Member와 Team

    DB와 객체지향의 큰 차이점은 객체지향 프로그래밍에서는 Member에서 Team으로의 조회는 가능하지만, Team에서는 Member의 조회가 불가능 하다. 반면에 DB는 '외래키'라는 것을 이용해 Team에서도 Member를 조회할 수 있다. JPA에서는 이런 '외래키'의 개념의 공백을 채우기 위해서 연관관계의 주인이라는 말이 등장했다. 

     

    🔍 연관관계의 주인이 '다'에 있는 이유

    1. PK의 중복

       Team에 외래키가 있고, 멤버 여러명이 teamA에 속하고 있다고 가정해보자. 테이블의 데이터는 다음과 같이 표현 될 수 있다.

    ID (PK) 팀 이름  멤버 ID
    1 teamA 1
    1 teamA 2
    1 teamA 3

    PK가 중복으로 등장한다는 문제가 있다. 

    2. 쿼리문의 복잡성 증가

       PK가 중복이 되기 때문에 데이터베이스의 구조는 다음과 같을 것이다.

    Member와 Team

    여기서 Team이 연관관계의 주인이 된다고 가정하고 members안에 들어있는 멤버1의 이름을 바꿔보자.

    public class Member {
        int id;
        String memberName;
        Team team;
    }
    
    public class Team {
        int id;
        String teamName;
        List<Member> members;
    }

    Team에 있는 members의 id가 변경되는 것이 아니라 Member 테이블의 memberName이 변경된다.

    실제 쿼리문

    이런 쿼리는 나중에 디버깅이 어렵게 만들며 성능이슈의 여지가 생기게 된다.

     

    🔍 결론

    1. 일대다, 다대일 관계에서 연관간계의 주인은 '다'쪽에 있다.

    2. '다' 쪽에 있어야 하는 이유

    •  쿼리문이 다른 테이블에서 실행된다.
    •  PK의 중복 문제가 있다.
      'JPA' 카테고리의 다른 글
      • [JPA] JPA의 필요성: 객체와 데이터베이스 간의 격차 해소하기
      • [JPA] QueryDsl Gradle 설정
      • [JPA] 영속성 컨텍스트의 생명주기(feat.OSIV)
      • 영속화와 GeneratedValue 전략
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바