대머리개발자

[코틀린] queryDSL 본문

개발이야기/코틀린

[코틀린] queryDSL

대머리개발자 2023. 6. 13. 18:28
728x90

☆ 연관된 테이블을 조회하는 2가지 스타일

 

로또 테이블(lotto)과 그에 대한 통계 테이블(lottoSummary)을 조인에서 하나의 그릇으로 조회를 하고자 한다.

 

방법 1)

파일썬에서 잠깐 봤던 튜플이 있어서....너무 좋았다. ☆☆☆

    fun getLatelyWin() : Tuple? {
        return jpaQueryFactory
            .select(lotto, summary)
            .from(lotto, summary)
            .where(lotto.turn.eq(summary.id).and(lotto.type.eq("W")))
            .orderBy(lotto.type.desc())
            .limit(1)
            .fetchOne()
    
    }

조인해서 한방 쿼리 !

Hibernate: 
select
        l1_0.id,
       ...,
        l2_0.lottoId,
       ... 
from
        Lotto l1_0,
        LottoSummary l2_0 
 where
        l1_0.turn=l2_0.lottoId 
        and l1_0.type=? 
order by
        l1_0.type desc limit ?

 

튜플 첫번째 놈은 lotto, 두번째놈은 lottoerSummary

 

방법 2)

@Entity에서 관계를 기술 한다.

    @OneToOne
     @JoinTable(name = "LottoSummary",
             joinColumns = [JoinColumn(name = "id", referencedColumnName="id")],
            inverseJoinColumns  = [JoinColumn(name = "id", referencedColumnName = "lottoId")],
     )
    var lottoSummary: LottoSummary?

 

쿼리 자체는 본 테이블 쿼리와 연관 테이블 쿼리가 각각 발생 2번!

Hibernate: 
    select
        l1_0.id,
       ....
    from
        Lotto l1_0 
    where
        l1_0.type=? 
    order by
        l1_0.type desc limit ?
Hibernate: 
    select
        l1_0.lottoId,
       ....
    from
        LottoSummary l1_0 
    where
        l1_0.lottoId=?

 

느낌 빡 오나?!! 엔티티로 기술하면...

단건(get)일 때는 크게 문제 없지만. 여러건(search)으로 요청한다면 

= 본 테이블 쿼리(1건) + 여러 쿼리... 발생스(N).  => N+1 문제...

 

정책적으로 확인해서 적절하게 사용하면 된다!!...그냥 한방 쿼리제!!!!!!

 

방법1과 방법 2를 동시 적용하면...

( https://hcnmy.tistory.com/21 )  1년전에 작성했던 내용이네. ㅋ

 

따라서...방법1으로 적용할때는 엔티티에 관계를 기술하지 않는다.

그럼 어디 바구니에 맵핑하냐면?  DTO 바구니에! 바로 속!

 

 

ToDo : 투두는 꼭 안하더라..ㅎㄷㄷ;

https://engineering.linecorp.com/ko/blog/kotlinjdsl-jpa-criteria-api-with-kotlin?utm_source=facebook&utm_medium=devrel 

 

Kotlin JDSL: Kotlin을 이용해 좀 더 쉽게 JPA Criteria API를 작성해 봅시다

들어가며 안녕하세요. Global EC(Global E-Commerce, 이하 GEC)에서 주문 파트 개발을 담당하고 있는 서종현입니다. GEC에서는 서버 프레임워크로 Spring을 주로 사용하며 ORM 기술로 JPA를 사용하고 있습니

engineering.linecorp.com

라인썽님들 고생이 많으심돠!

728x90

'개발이야기 > 코틀린' 카테고리의 다른 글

[코틀린] 스프링 배치(2) - 적용  (0) 2023.09.04
[코틀린] 스프링 배치(1) - 사전 주저리  (0) 2023.09.01
[코틀린] NULL 처리  (0) 2023.05.16
[코틀린] 스프링 DI  (1) 2023.04.21
코틀린 + Spring + JPA  (0) 2023.04.17