inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 데이터 JPA

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

415

옥타비아

작성한 질문수 4

0

안녕하세요.

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

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

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

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

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

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

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

< BaseEntity >

<글 Entity>

< 호출 쿼리 >

spring spring-boot JPA java

답변 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

김영한

ㅎㅎ 코드를 봐야겠네요.

전체 프로젝트를 압축해서 올려주세요.

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

0

옥타비아

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

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

0

옥타비아

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

0

김영한

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

0

옥타비아

빠른 답변 감사합니다~

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

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

< Service >

< Repository >

< 호출결과 >

0

김영한

안녕하세요. 옥타비나님

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

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

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

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

67

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

103

3

MemberRepository 구현체

0

56

1

pdf 표현 질문드립니다.

0

60

1

로그가 남지 않는 문제.

0

79

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

68

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

71

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

91

2

Sort 인터페이스는 잘 사용 안하나요?

0

52

1

스캔대상 질문드립니다.

0

45

1

하이버네이트6에서의 최적화에 이은 질문

0

82

1

save() vs saveAndFlush DB 통신 횟수

0

51

1

순수 JPA 리포지토리 코드 수정부분

0

85

2

bulk연산 후 flush하는 이유를 모르겠어요

0

150

3

bulk insert 질문입니다.

0

174

2

교만했던 것 같아요.

0

145

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

144

2

동적 테이블에 대한 질문

0

85

1

영속성 전이와 연관관계

0

130

2

강의 10:25 질문

0

73

1

단건 update 질문

0

95

2

엔티티 와 도메인의 경계

0

126

1

UsernameOnlyDto 타입 type mismatch 오류

0

119

1

Projection 개념과 데이터 전달과정에 대해 질문 있습니다.

0

135

1