Spring/JPA

[JPA] 다대일(N:1) 단방향 VS 양방향 정리

lumana 2024. 9. 29. 21:30

사이드 프로젝트로 게시판 만들기를 하고 있었는데, 게시글과 회원 엔티티를 N:1 단방향으로 해야할 지, 양방향으로 해야할 지 고민을 하다가 정리한 내용이다. (인프런 김영한 강사님 강의 질문 게시글의 내용을 일부 포함하고 있다)

 

게시글에서는 회원이 필요함. 기본적으로 글을 작성할 때 회원의 id가 필요하고, 이름이 필요할 수도 있음

 

회원에서는 게시글 엔티티가 필요할까?

:  회원이 작성한 글을 조회할 때는 게시글 엔티티를 리스트로 가지고 조회할 수도 있고, 쿼리(em.find)를 날려서 조회할 수도 있다.(게시글에 있는 member를 조회)

전자는 양방향이고, 후자는 단방향에 해당한다.

 

단방향을 사용해야 하는 이유 1)

회원이 갑자기 뜬금없이 게시글 id를 참조하는 경우가 있을까? 게시글에 존재하는 다른 필드를 참조할 일이 없다(이런걸 객체 그래프 탐색이라고 하더라고요). 이런점이 회원과 Post는 단방향 관계가 되야 하는 이유 중 하나이다.

 

단방향을 사용해야하는 이유 2)

물론 회원이 작성한 게시글을 불러올 때 쿼리를 날려야 하니 양방향으로 설정해놓는게 편하지 않나요? 라고 할 수 있지만 회원이 작성한 게시글을 조회하는 경우는 드문 비즈니스 로직이다… 또한 JPQL에는 이런 상황에서 게시글을 별도로 조회하는 좋은 방법들이 존재하기 때문에 단방향 관계랑 양방향 관계랑 성능은 사실상 똑같다고 보면 된다.

 

단방향을 사용해야 하는 이유 3)

만약 회원이 리스트로 게시글 객체를 필드에 가지고 있다고 해보자. 만약 대형 커뮤니티라면 JVM 메모리 부담이 늘어나게 된다

 

단방향을 사용해야 하는 이유 4)

보통 회원 엔티티는 많은 엔티티와 연관관계를 맺고 있다. 회원에 연관관계를 모두 양방향으로 만들면 회원 객체가 너무 많은 연관관계를 가지게 된다.

 

구분하기 좋은 기준은 기본적으로 설계할 때는 단방향 매핑으로 하고 나중에 개발할 때 역방향으로 객체 탐색이 꼭 필요하다고 느낄 때 추가하는 것으로 잡으면 됩니다.

 

그러면 언제 양방향 매핑을 사용해야 하는가?)

실무에서 복잡한 조회 쿼리에서 양방향 매핑을 하고 싶은 경우가 발생합니다.

예를 들어서 team 1:N member 이런 관계가 있을 때 team과 member를 fetch join으로 한번에 조회하고 싶은 경우가 있습니다.

이럴 때 양방향 매핑이 필요합니다.

 

Ref) https://www.inflearn.com/community/questions/629236/양방향-연관관계에-대한-질문입니다

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

[JPA] Cascade 적용 기준  (0) 2024.09.29
[JPA] JPA 개발 - 도메인 분석 및 설계  (0) 2024.09.29