스터디/JPA
JPA 스터디2 - 6
라퐁
2025. 8. 27. 22:30
다양한 연관관계 매핑
핵심 개념
- 다중성(Multiplicity): 다대일(@ManyToOne), 일대다(@OneToMany), 일대일(@OneToOne), 다대다(@ManyToMany)
- 방향성(Directionality): 두 엔티티 간의 관계를 한쪽에서만 알게 할 것인지, 양쪽 모두에서 알게 할 것인지
- 단방향(Undirectional): 한쪽 엔티티만 상대방을 참조 / 설계가 단순하고 직관적
- 예를 들어,
Member는Team을 알지만Team은 자신에게 속한Member들을 모른다
- 예를 들어,
- 양방향(Bidirectional): 양쪽 엔티티가 서로를 참조 / 신경 쓸 점이 많다
- 따라서
Member는Team을 알고,Team도 자신에게 속한Member리스트를 가진다
- 따라서
- 단방향(Undirectional): 한쪽 엔티티만 상대방을 참조 / 설계가 단순하고 직관적
- 연관관계의 주인(Owner of the Relationship): 두 엔티티가 서로를 참조할 때, 둘 중 누가 데이터베이스의 외래 키(FK)를 관리하고 변경할지 정해야 한다.
- 주인(Owner): 외래 키를 직접 관리하는 쪽으로 보통 다대일(N:1) 관계에서 '다(N)'쪽이 주인이된다.
- @JoinColumn 어노테이션 사용
- 주인이 아닌 쪽(Non-owner): 외래 키에 영향을 주지 않고, 단순히 읽기 전용으로만 사용한다.
- mappedBy 속성을 사용해 매핑 필드 지정
- 양방향 매핑 시 mappedBy 속성을 설정하지 않으면 연결 테이블이 생성되니 주의
- 주인(Owner): 외래 키를 직접 관리하는 쪽으로 보통 다대일(N:1) 관계에서 '다(N)'쪽이 주인이된다.
다대일(N:1, @ManyToOne)
가장 안정적이고 권장되는 관계이다.
- 단방향(N:1): '다(N)'쪽이 '일(1)'을 참조한다.
Member→TeamMember엔티티에만Team객체 참조가 있다.Team은 자신에게 속한Memeber를 알 수 없다.
- 양방향(N:1, 1:N): 양쪽이 서로를 참조한다.
Member↔Team- 연관관계의 주인은 '다(N)'쪽인
Membber로 @JoinColumn을 사용한다. - '일(1)'쪽인
Team은 mappedBy를 사용하여 주인이 아님을 명시한다.
일대다(1:N, @OneToMany)
- 단방향(1:N): '일(1')쪽이 '다(N)'를 List 등으로 참조한다.
Team→List<Memeber>- '일(1)'쪽에서 외래 키를 관리하게 되어 UPDATE 쿼리가 추가로 발생하는 등 성능상 문제 가능성
- 권장하지 않는다.
- 양방향(1:N, N:1): 다대일 양방향과 동일하다.
일대일(1:1, @OneToOne)
- 단방향(1:1): 한쪽만 상대방을 참조한다.
Member→Locker- 주 테이블에 외래 키를 두는 것을 권장한다.
- 양방향(1:1): 양쪽이 서로를 참조한다.
- 다대일 양방향과 마찬가지로, 외래 키를 가진 쪽이 연관관계의 주인이 된다.
다대다(N:N, @ManyToMany)
실무에서는 사용을 피해야 하는 관계이다.
- 관계형 데이터베이스는 다대다 관계를 표현할 수 없어서, 중간에 연결 테이블이 자동으로 생성된다.
- 이 연결 테이블은 JPA에서 직접 관리할 수 없어, 추가적인 컬럼을 넣거나 세밀한 제어가 불가능하다.
- 다대다를 일대다, 다대일 관계로 풀어내는 것이 정석이다.