• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

같은 테이블 fetch join 시 N+1 문의드립니다.

20.09.12 11:22 작성 조회수 206

0

안녕하세요.

게시판 연습중에 문의가 생겨서 질문드립니다.

게시판 글을 등록하고 해당 글을 여러명이 수정하거나 삭제(상태변경) 할수 있는 방향으로 진행중인데요

아래 그림과 같이 Article에서 Member를 ManyToOne으로 세개의 다대일 단방향을 만들었습니다.

단건 글조회 호출쿼리를 실행했을때 처음 creator 부분은 fetch join이 정상적으로 되지만

이후의 modifier와 deleter는 따로 두번 쿼리가 호출되는 증상이 있는데요

마지막 그림 쿼리의 경우 전부 fetch join을 해도 같은 증상이라

이와 같은 구성의 경우 처음 호출시에만 fetch join이 되는건지 궁금합니다 ㅠㅠ

< BaseEntity >

<글 Entity>

< 호출 쿼리 >

답변 7

·

답변을 작성해보세요.

2

옥타비나님 확인해보았습니다^^

우선 Member 엔티티 코드를 보면 PK가 member_id입니다.

@Entity
@Table(name = "member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member extends BaseTimeEntity implements Serializable {

@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "member_id")
private Long id;

@Column(name = "login_id", unique = true, updatable = false) // , length = 50
private String loginId;

그런데 Article 클래스에서 Member 테이블의 조인 대상 키를 PK인 member_id가 아니라

referencedColumnName를 사용해서 login_id로 잡아주었습니다.

public class Article extends BaseEntity {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modifier_login_id", referencedColumnName = "login_id")
private Member modifier;

referencedColumnName을 Member의 PK인 member_id로 지정하거나 또는

referencedColumnName을 생략하면 Member PK인 member_id를 자동으로 사용합니다.

JPA는 영속성 컨텍스트 단위로 움직이는데, 결국 영속성 컨텍스트의 엔티티 키가 @Id로 매핑한 PK이기 때문에, 지연로딩 같은 객체 그래프 탐색은 PK로 이루어져야 문제 없이 동작합니다.

그리고 이 경우는 특히 login_id로 지정할 이유가 없지요^^

도움이 되셨길 바래요.

1

ㅎㅎ 코드를 봐야겠네요.

전체 코드를 압축해서 zipkyh@naver.com으로 보내주세요^^

테스트 가능한 테스트도 꼭 포함해서 주세요^^

0

메일은 제가 보내드렸구, 주말인데 불구 하고 계속 질문드려서 죄송합니다. ㅠㅠ

천천히 봐주셔도 괜찮습니다~

0

아 다시 따로 전체 캡쳐해서 올려드립니다^^;;;

0

jpql 부터 실행된 모든 sql쿼리를 남겨주세요^^

0

빠른 답변 감사합니다~

수정해서 테스트해봐도 같은 증상이라 음... 애초에 뭔가 설계가 잘못된거 같긴 하지만...

뭔가 생각한 방향대로 동작하지 않아 그래도 원인을 이해하고 가야할거 같아서요 ㅠㅠ

< Service >

< Repository >

< 호출결과 >

0

안녕하세요. 옥타비나님

마지막 그림의 경우 creator만 fetch 조인을 사용했습니다.

전부 fetch 조인을 사용하면 정상 동작하는 것이 맞습니다.

전부 fetch 조인한 호출 쿼리를 보여주시겠어요?