qwerasdfzxc
165
2020-07-25 22:54:24
5
335

JPA FetchType 질문입니다.


JPA를 공부중인데, one to Many와 같은 경우, 즉 컬렉션을 가져오는 경우에는 default가 lazy로 알고있습니다.


그리고 컬렉션을 가져오는데에는 많은 비용이 소모되어서 lazy로 해야한다는 글을 보았습니다.

하지만 자주사용하는 경우에는 Eager로 가져오는 것이 좋다라는 애매모호한 설명 또한 보았습니다.


그렇다면 예를들어 게시글과 댓글은 1:N관계인데, 댓글은 게시글이 가져와야하는 것이니, 

EAGER로 선언하여 post.comments 이런형식으로 직접 접근해서 사용하는 것이 좋은 것일지,

아니면  commentRepository로부터 postId의 인자로 검색해서 DB에서 가져오는 것이 좋을 지

모르겠습니다. 조언 좀 부탁드립니다 ㅠㅠ

0
  • 답변 5

  • 돈벌어서치킨뜯자
    70
    2020-07-25 23:23:21

    우선 궁금하신 부분에 대한 답변을 먼저 말씀드리겠습니다.

    모든 관계에 대해서는 Eager보다는 LazyLoading이 맞습니다.

    Eager로 가져오게 되면 언급하신것처럼 연관된 엔티티를 가져오기 위해 많은 SQL이 실행되어 성능이 악화됩니다. 

    그리고 질문 작성하신것만 봐서는 현재 ORM이 잘못 설계되어 있는 것 같습니다.

    게시글과 댓글은 일반적으로 하나의 Content의 field로 봅니다. 


  • devcrema
    1k
    2020-07-25 23:31:08

    lazy로딩을 해두면 필요한 경우에만 호출되서 비용을 절약할 수 있고 더불어서 한번에 fetch해오는 사이즈를 넣어서 페이징처리도 가능해집니다.

    엄청 자주사용하는 케이스여도.. ManyToOne관계가 아니라 OneToMany라면 차라리 lazy를 걸고 캐싱을 추가하는게 좋겠네요.

    그리고 ManyToOne일때는 굳이 lazy를 쓸필요는 크게 없습니다. (양방향일때 순환참조만 조심하면요)

    게시글 댓글 사례에서는 저같으면 oneToMany lazy로 해두고 캐싱을 걸어둘 것 같네요.

    다만 transactional로 묶기 어려운 상황이거나 (영속성 컨텍스트 이슈로 lazy가 동작하지 않습니다) 서로 별도의 도메인으로 분리되어 있다면 repo를 따로 만드는게 맞습니다.

  • qwerasdfzxc
    165
    2020-07-25 23:52:56

    우선 현재 게시글과 댓글 OneToMany, 댓글과 게시글 ManyToOne으로 양방향 참조가 되어있습니다.

    각자 Entity와 repo도 갖고있구요.


    게시글에서 접근할경우 comment가 List로 되어있기때문에 접근이 용이할 것 같아서 양방향으로 해놓았습니다. (사실 지금 양방향을 풀어야 하나 고민중입니다)


    @돈벌어서치킨뜯자님

    말씀해주신 게시글과 댓글은 일반적으로 하나의 Content의 field로 봅니다.

    를 이해하지못했습니다 ㅠㅠ.. 관계로 맺어주는게 아닌 Post필드에 그냥 넣어줘야 하는 것인가요??


    @devcrema님

    서로 별도의 repo가 있을 경우 각자의 repo를 통해 DB에 접근해서 가져오는 것이 더 효과적이라는 말씀이신가요??


  • devcrema
    1k
    2020-07-26 00:00:47

    별도의 repo가 있을경우의 기준은 두개의 기능이나 엔티티가 너무 커져서 하나로 묶기 어려운 경우에 두면 좋습니다.

    예를들어 게시글과 유저는 참조가 걸려있지만 서로 묶지 않는 것처럼 이렇게 나누어진 경우에는 repo를 별도로 두는 것이 좋습니다.


    일단 단방향으로 하고 외래키를 comment에 두는것도 가능합니다.

    거기에 cascade옵션을 쓰면 comment에 대한 repo를 만들 필요도 없겠죠.

    양방향을 써야하는 순간도 있겠지만 저는 왠만하면 단방향을 권장드리고 싶네요...

    일단 양방향 관계를 깔끔하게 만들기가 쉽지 않습니다...

  • 커맨드센터
    466
    2020-07-26 00:03:54

    n+1 문제로 찾아보시면 feach를 어떻게 설정해야 하는지 파악할 수 있을 거에요.

    https://vladmihalcea.com/n-plus-1-query-problem/


  • 로그인을 하시면 답변을 등록할 수 있습니다.