인프런 커뮤니티 질문&답변

손원희님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리

다대일 양방향 연관 관계의 주인 지정 관련 질문 드립니다!

23.05.06 20:54 작성

·

305

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
안녕하세요! 항상 강의 잘 듣고 있습니다 :-)

기본적으로 제가 이해하고 있는 연관 관계 주인 개념이 맞는지, 그리고 다대일 양방향 연관 관계 주인 지정과 관련해 드리고 싶은 질문이 있어 글을 작성합니다!

 

  1. 제가 이해한 내용을 바탕으로 기본적인 연관 관계, 연관 관계 주인 개념을 아래와 같이 정리해봤는데, 제대로 이해하고 있는지 궁금합니다.

    JPA에서 제공하는 어노테이션을 이용해 Java 코드로 정의된 엔티티 클래스 간 연관 관계를 설정하면, JPA가 이 코드를 기반으로 테이블을 생성하게 된다. 이때, Member과 Team 엔티티 클래스 중 하나는 무조건 연관 관계 주인으로 지정해주어야 한다.

     

    기본적으로 데이터베이스의 테이블은 외래 키를 통해 두 테이블 간의 관계를 설정할 수 있고, 한 쪽의 테이블에만 (관계를 맺을 테이블에 대한) 외래 키가 존재하면 JOIN을 통해 자유롭게 양쪽 테이블을 참조할 수 있다. (→ 단방향, 양방향(단방향*2) 연관 관계라는 개념이 테이블 간에는 존재하지 않는다.)

     

    그런데 Member 엔티티 클래스의 필드에 member_id, name이 있고, Team 엔티티 클래스의 필드에 team_id, name 존재하고, 일대다 연관 관계를 JPA 통해 설정했을 때 JPA가 매핑 정보를 기반으로 테이블을 생성하는 상황을 생각해본다.

     

    JPA는 기본적으로 MEMBER 테이블, TEAM 테이블을 생성할 것이다. 그리고 MEMBER 테이블에는 member_id, name 컬럼이, TEAM 테이블에는 team_id, name 필드가 컬럼이 존재할 것이다. 그리고 JPA를 통해 설정한 연관 관계 또한 두 테이블에 반영해야할텐데, 이를 위해선 두 테이블 중 하나에 (관계를 맺을 테이블에 대한) 외래 키 필드를 추가해야 한다. 외래 키를 통해 테이블 사이의 관계를 설정할 수 있기 때문이다.

     

    그런데 JPA는 이 외래 키 필드를 어느 테이블에 추가해야할지 자체적으로 결정을 내릴 수 없다. 회원 테이블에 팀 테이블로 접근할 수 있는 외래 키 필드를 생성하는 것이나 팀 테이블에 회원 테이블로 접근할 수 있는 외래 키 필드를 생성하는 것이나 결국 (단방향/양방향 연관 관계 개념 자체가 없는) 데이터베이스 테이블 입장에선 차이가 없기 때문이다.

     

    그래서 JPA를 이용해 연관 관계를 지정해주어야, JPA가 어떠한 엔티티가 다른 엔티티를 참조하는 주체가 되는지 파악할 수 있고, JPA가 테이블을 생성할 때 다른 엔티티를 참조하는 주체 엔티티와 매핑될 테이블에 외래 키 필드를 추가할 수 있게 된다.

  2. Member, Team와 같은 다대일 연관 관계를 양방향으로 설정한 후, Team을 연관 관계의 주인으로 지정했을 때, Team 수정 시 모든 Member를 향한 불필요한 (UPDATE 등의) 쿼리가 발생할 수 있다는 게 잘 다가오지 않습니다... ㅠㅠ Member를 연관 관계의 주인으로 지정했을 때 Team 수정하는 경우와 비교해서 조금 더 자세히 설명해주시면 정말 감사하겠습니다!

답변 1

1

codesweaver님의 프로필 이미지

2023. 05. 08. 12:45

안녕하세요, 손원희 님! 공식 서포터즈 codesweaver 입니다.

정리하신 내용이 맞습니다. 약간의 첨언을 드리면 다음과 같습니다.

 

 

 



JPA에서 제공하는 어노테이션을 이용해 Java 코드로 정의된 엔티티 클래스 간 연관 관계를 설정하면, JPA가 이 코드를 기반으로 테이블을 생성하게 된다. 이때, Member과 Team 엔티티 클래스 중 하나는 무조건 연관 관계 주인으로 지정해주어야 한다.

 

기본적으로 데이터베이스의 테이블은 외래 키를 통해 두 테이블 간의 관계를 설정할 수 있고, 한 쪽의 테이블에만 (관계를 맺을 테이블에 대한) 외래 키가 존재하면 JOIN을 통해 자유롭게 양쪽 테이블을 참조할 수 있다. 

(→ 단방향, 양방향(단방향*2) 연관 관계라는 개념이 테이블 간에는 존재하지 않는다.)

=> 단방향, 양방향(단방향*2) 연관 관계라는 개념이 테이블 간에는 존재하지 않는다 -> 테이블은 기본적으로 양방향이다

 

그런데 Member 엔티티 클래스의 필드에 member_id, name이 있고, Team 엔티티 클래스의 필드에 team_id, name 존재하고, 일대다 연관 관계를 JPA 통해 설정했을 때 JPA가 매핑 정보를 기반으로 테이블을 생성하는 상황을 생각해본다.

 

JPA는 기본적으로 MEMBER 테이블, TEAM 테이블을 생성할 것이다. 그리고 MEMBER 테이블에는 member_id, name 컬럼이, TEAM 테이블에는 team_id, name 필드가 컬럼이 존재할 것이다. 그리고 JPA를 통해 설정한 연관 관계 또한 두 테이블에 반영해야할텐데, 이를 위해선 두 테이블 중 하나에 (관계를 맺을 테이블에 대한) 외래 키 필드를 추가해야 한다. 외래 키를 통해 테이블 사이의 관계를 설정할 수 있기 때문이다.

 

그런데 JPA는 이 외래 키 필드를 어느 테이블에 추가해야할지 자체적으로 결정을 내릴 수 없다. 회원 테이블에 팀 테이블로 접근할 수 있는 외래 키 필드를 생성하는 것이나 팀 테이블에 회원 테이블로 접근할 수 있는 외래 키 필드를 생성하는 것이나 결국 (단방향/양방향 연관 관계 개념 자체가 없는) 데이터베이스 테이블 입장에선 차이가 없기 때문이다.

 

그래서 JPA를 이용해 연관 관계를 지정해주어야, JPA가 어떠한 엔티티가 다른 엔티티를 참조하는 주체가 되는지 파악할 수 있고, JPA가 테이블을 생성할 때 다른 엔티티를 참조하는 주체 엔티티와 매핑될 테이블에 외래 키 필드를 추가할 수 있게 된다.

=> 연관 관계를 지정해 주어야 -> 연관 관계의 주인을 지정해야

 



감사합니다.