twocowsong

일 대 다 본문

IT/JPA

일 대 다

WsCode 2022. 6. 13. 22:24

1 : N 관계는 N : 1 관계의 반대 방향입니다.

1 : N 관계는 엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션인 Collection, List, Set, Map중에 하나를 사용합니다.

 

1 : N [일 대 다 단방향]

하나의 팀은 여러 회원을 참조할 수 있습니다. 이런 관계를 1 : N 관계라 합니다.

반대로 회원은 팀을 참조하지 않으면 둘의 관계는 단방향입니다.

 

[객체 연관관계]

객체 연관관계의 그림을 보면 약간 특이한곳이 있습니다.

팀 엔티티의 Team.member로 회원 테이블 TEAM_ID 외래 키를 관리합니다.

보통 자신이 매핑한 테이블의 외래 키를 관리하는데, 이 매핑은 반대쪽 테이블에 있는 외래 키를 관리합니다.

 

1 : N 관계에서 외래 키는 항상 N쪽 테이블에 있습니다.

하지만 N 쪽인 Member 엔티티에는 외래 키를 매핑 할 수 있는 참조 필드가 없습니다.

대신에 반대 쪽인 Team 엔티티에만 참조 필드인 members가 있습니다.

따라서 반대편 테이블의 외래키를 거는 특이한 모습이 나타납니다.

 

public class Team {

   @Id
   @Column(name = "TEAM_ID")
   private String id;

   private String name;

   @OneToMany
   @JoinColumn(name = "TEAM_ID") // MEMBER테이블의 TEAM_ID (FK)
   private List<Member> members = new ArrayList<>();
   
}
public class Member {

   @Id
   @Column(name="MEMBER_ID")
   private String id;

   private String username;

   // Getter, Setter...
}

1 : N 단방향 관계를 매핑할 때는 @JoinColumn을 명시해야 합니다.

그렇지 않으면 JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인 테이블 전략을 기본 으로 사용해서 매핑합니다. (추 후 자세하게 공부하겠습니다.)

 

1 : N 단방향 매핑의 단점

1 : N 단방향 매핑의 단점은 매핑한 객체가 관리하는 외래 키 가 다른 테이블에 있다는 점입니다.

본인 테이블에 외래 키가 있으면 엔티티의 저장과 연관관계 처리를 INSERT SQL 한번으로 끝낼 수 있지만

다른 테이블에 외래 키가 있으면 연관관계 처리를 위한 UPDATE SQL을 추가로 실행해야 합니다.

 

public void testSave1(EntityManager em) {
   Member member1 = new Member("member1");
   Member member2 = new Member("member2");

   Team team1 = new Team("team1");
   team1.getMembers().add(member1);
   team1.getMembers().add(member2);
   
   em.persist(member1); // INSERT1
   em.persist(member2); // INSERT2
   em.persist(team1); // INSERT - team
}

회원1, 회원2, 팀1 을 INSERT하였습니다.

Member 엔티티는 Team엔티티를 모릅니다.

그리고 연관관계에 대한 정보는 Team엔티티의 members가 관리합니다.

 

따라서 Member 엔티티를 저장할 때는 MEMBER테이블의 TEAM_ID 외래 키에 아무 값도 저장되지 않습니다.

대신 Team 엔티티를 저장할 때 Team.members의 참조 값을 확인해서 회원 테이블에 있는 TEAM_ID외래 키를 업데이트 합니다.

 

N : 1 양방향 매핑을 사용하자

1 : N 단방향 매핑을 사용하면 엔티티를 매핑한 테이블이 아닌 다른 테이블의 외래 키를 관리합니다.

이것은 성능 문제, 관리문제가 발생할수 있습니다.

그렇기에 N : 1 양방향 매핑을 사용하는 것이 좋습니다.

두 매핑의 테이블 모양은 완전히 같으므로 엔티티만 약간 수정하면됩니다.

'IT > JPA' 카테고리의 다른 글

일 대 일 [ 1 : 1 ]  (0) 2022.06.18
일 대 다 양방향  (0) 2022.06.14
다 대 일  (0) 2022.06.12
연관관계의 주인(mappedBy)  (0) 2022.06.11
정리  (0) 2022.06.09