728x90
연관관계 매핑에는 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)가 있습니다. 이번 포스팅에서는 다대일(N:1)에 대해서 알아보겠습니다.
다대일(N:1)
가장 많이 사용되는 연관관계 매핑 중 하나
한 엔티티의 여러 인스턴스가 다른 엔티티의 단일 인스턴스와 연관되는 관계
예) 여러 주문이 하나의 회원에 속하는 경우
양방향 연관관계의 경우 "다" 쪽이 주인이 됩니다.
사용 상황
부모-자식: 부서와 직원, 카테고리와 제품 등의 관계
주문-고객: 여러 주문이 하나의 고객에 속하는 경우
블로그 포스트- 작성자: 여러 포스트가 하나의 작성자에 속하는 경우
사용 빈도
실제 비즈니스 도메인에서 이러한 관계가 매우 흔하기 때문에 가장 많이 사용되는 연관관계 매핑이다.
장점
- 단순하고 이해하기 쉬운 관계
- 양방향 매핑 시 객체 그래프 탐색이 용이함
단점
- 다대일 단방향 매핑에서는 역참조가 불가능함
- 양방향 매핑 시 참조 무결성을 신경 써야 한다
- 다대일 양방향 매핑에서 수정 시 주인 엔티티에서만 수정해야 한다
성능 향상
다대일 관계는 조회 시 성능이 향상되는 경우가 많습니다.
컬렉션 조회 시 페이징 처리
다대일 양방향 매핑에서 회원을 조회하고 연관된 주문 목록을 페이징 해서 조회할 때 성능이 좋습니다. 회원을 조회 후 주문 목록만 페이징하면 되므로 쿼리 복잡도가 낮아집니다.
N+1 문제 해결
일대다 단방향 매핑에서는 N+1문제가 발생할 수 있지만, 다대일 양방향 매핑에서는 이를 해결할 수 있습니다. 회원 로딩 시점에 주문도 함께 로딩되므로 쿼리 수가 줄어듭니다.
- 회원 로딩 시점에 주문도 함께 로딩된다의 의미
- 회원 엔티티를 조회한다.
- 회원에 연관된 주문 엔티티 컬렉션을 접근하면(get() 메서드 호출 등)
- 이때 주문 엔티티들이 로딩되어 메모리에 올라온다.
- 이렇게 실제 주문 엔티티가 필요한 시점에 로딩되므로, 불필요한 주문 데이터를 미리 로딩하지 않아 성능 최적화에 도움이 됩니다.
다대일 양방향에서는 기본적으로 지연로딩(LAZY) 전략이 사용되며, 실제 데이터가 필요한 시점에 로딩이 됩니다. 이를 통해 N+1 문제를 해결할 수 있습니다.
728x90