inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

JPA N+1 (entity 안의 entity 연결시)

258

phc

작성한 질문수 1

0

안녕하세요. 강사님.

강의 내용을 참고로 현업에서 구현중에 궁금한 점이 있어 질문들 드립니다. ^^

JPA N+1 관련 내용인데요.

@ManyToOne 이나 @OneToOne 으로 2개의 테이블을 단방향으로 연결한 후, 해당 정보를 다른 entity에서 @ManyToOne 으로 양방향 설정을 할 경우에

조회시 처음 @ManyToOne으로 연결된 부분의 데이터도 fetchJoin으로 가져올 수 있나요?

[예시]

1. Entity 정보

  1) 사용자 : UserEntity

  2) 사용자 아바타 : AvatarEntity

  3) 게시판 : BoardEntity

2. 연결정보

  1) BoardEntity.createUser = UserEntity (N:1)

  2) UserEntity.avatar = AvatarEntity (N:1 or 1:1)

3. 상태

  1) 게시판 내용 조회 시 createUser 정보를 UserEntity에서 조회 (이때 avatar 정보도 같이 fetchJoin)

  2) UserEntity와 AvatarEntity 의 fetch 를 EAGER 로 할 경우 -> 게시판내용과 사용장 정보 1회 + AvatarEntity 반복

  3) UserEntity와 AvatarEntity 의 fetch 를 LAZY 로 할 경우 -> 게시판 내용 1회 + 사용자 정보 반복 + AvatarEntity 반복

-----------------------------------

@Entity

@Table(name = "user_tab")

data class UserEntity(

    @Id @GeneratedValue(generator = "system-uuid")

    @GenericGenerator(name = "system-uuid", strategy = "uuid")

    @Column(name = "user_key", length = 128)

    var userKey: String = "",



    @Column(name = "user_id", length = 128)

    var userId: String = "",

 

 @ManyToOne(cascade = [CascadeType.ALL], optional = false, fetch = FetchType.LAZY)

    //@ManyToOne(cascade = [CascadeType.ALL], optional = false, fetch = FetchType.EAGER)

 //@OneToOne(cascade = [CascadeType.ALL], optional = false, fetch = FetchType.LAZY)

    @JoinColumn(name = "avatar_id")

    var avatar: AvatarEntity = AvatarEntity()

)



@Entity

@Table(name = "avatar_tab")

data class AvatarEntity(

    @Id

    @GeneratedValue(generator = "system-uuid")

    @GenericGenerator(name = "system-uuid", strategy = "uuid")

    @Column(name = "avatar_id", length = 128)

    var avatarId: String = "",



    @Column(name = "avatar_type", length = 100)

    var avatarType: String = UserConstants.AvatarType.FILE.code,



    @Column(name = "avatar_value", length = 512)

    var avatarValue: String = UserConstants.AVATAR_BASIC_FILE_NAME

)



@Entity

@Table(name = "board_tab")

data class BoardEntity(

    @Id @GeneratedValue(generator = "system-uuid")

    @GenericGenerator(name = "system-uuid", strategy = "uuid")

    @Column(name = "board_id")

    var boardId: String = "",

 

 @Column(name = "board_group")

    var boardGroup: String = "",



    @Column(name = "board_title")

    var boardTitle: String = "",

 

 @CreatedBy

    @JoinColumn(name = "create_user_key", nullable = false, updatable = false)

    @ManyToOne(fetch = FetchType.LAZY)

    var createUser: UserEntity? = null,

 

    ...

)



-- querydsl 조회

    override fun findBoardList(limit: Long): List<BoardEntity> {

        val board = QBoardEntity.boardEntity

        return from(board).distinct()

            .innerJoin(board.createUser).fetchJoin()

            .orderBy(board.createDt.desc())

            .limit(limit)

            .fetch()

    }

-----------------------------------

위의 경우처럼 게시판을 조회할 때 사용자 정보를 포함하여 단일 쿼리로 가져오려고 합니다.

이때, 사용자의 아바타 정보도 포함하여 가져오고 싶은데... 아바타만 반복조회로 실행됩니다.

이부분은 어떻게 처리하는지 궁금합니다.

java JPA

답변 1

0

김영한

안녕하세요. phc님^^

1. 모든 연관관계는 지연로딩으로 설정해주세요.

2. XtoOne 관계는 무한대로 패치조인이 가능합니다.

따라서 user -> avatar로 추가로 패치조인 하시면 문제가 해결됩니다.

관련해서 활용2편에서 매우 자세하게 설명드리고 있습니다. 꼭! 활용2편을 마스터주세요^^!

감사합니다.

SpringBoot 4.X에서의 Querydsl 설정

0

82

2

querydsl 오픈소스에 대한 질문

0

69

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

108

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

316

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

68

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

159

1

querydsl sum() 메서드 없어요.

0

157

2

build 디렉터리 생성

0

135

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

113

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

90

1

오타 제보 드립니다.

0

70

2

벌크 연산과 flush, clear

0

76

1

Run As Intellij 로 변경시 Q타입 import 불가

0

87

1

QHello import하기 문제 발생

0

147

2

등록된 함수 보는법(H2Dialect) 질문

0

68

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

195

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

200

1

querydsl 설정 문제

0

222

2

quey dsl 설정부분

0

157

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

89

2

(OrderSpecifier)관련 내용 어디있을가요

0

64

1

중급문법 벌크연산에서

0

81

2