[JPA] JPA를 적용하며... mysql 함수 2번 호출되는 문제

2020. 12. 6. 07:00·Develop/spring-data
반응형

왜 querydsl로 조회할때 mysql 함수가 두 번 발생하는 문제가 나타났습니다.

먼저 Spring Data JPA를 사용하면서 왜 mysql 함수를 썼어야 했는지부터 설명드리겠습니다.

진행중인 프로젝트는 mybatis를 사용했었습니다. 그리고 새로운 버전으로 업그레이드하면서 JPA를 도입했고 기존 mapper 쿼리를 걷어내면서 작업을 진행하고 있습니다. 그래서 mybatis를 걷어내기 전까지는 mysql를 함수를 사용하기로 하였습니다. ( 관리포인트를 2개로 나누는 것은 좋지 않다고 판단 )

 

증상

querydsl로 아래 소스처럼 mysql function을 이용하여 조회하는 로직이 있습니다. 그런데 function이 두번 호출되고 있습니다.

public StoreVo findByName(String name) {
    return jpaQueryFactory
            .select(Projections.fields(StoreVo.class,
                    store.id
                    , Expressions.stringTemplate("createPrefix({0})", store.name).as("name")
                    , store.address
                    ))
            .from(store)
            .where(store.name.eq(name))
            .limit(1L)
            .fetchOne();
}

로그

select
    store0_.id as col_0_0_,
    createPrefix(CreatePrefix(account_number)) as col_1_0_,
    store0_.address as col_2_0_ 
from
    store store0_ 
where
    CreatePrefix(account_number)='스토어6' limit 1

 

 

원인

분명히 테스트 완료한 코드인데 갑자기 왜 이러지..? 하면서 예제 코드와 비교하면서 원인을 찾았습니다. 삽질..

직장 동료의 도움으로 원인을 찾았습니다. Entity에 @ColumnTransformer 를 사용하고 있었습니다. 이러니 당연히 Querydsl에서 function 호출하고 Entity에서 또 호출하고 있었습니다.

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Store {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ColumnTransformer(read = "CreatePrefix(account_number)", write = "CreatePrefix(?)")
    private String name;
    private String address;

    @Builder
    public Store(Long id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }
}

 

해결

Querydsl에서 function을 제거하여 문제가 해결되었습니다.

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Store {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
//    @ColumnTransformer(read = "CreatePrefix(account_number)", write = "CreatePrefix(?)")
    private String name;
    private String address;

    @Builder
    public Store(Long id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }
}

로그

select
    store0_.id as col_0_0_,
    createPrefix(store0_.name) as col_1_0_,
    store0_.address as col_2_0_ 
from
    store store0_ 
where
    store0_.name='스토어6' limit 1

 

 

 

p.s 집단 지성은 강력하다! 소스는 거짓말하지 않는다! 내가 거짓말할 뿐...

반응형

'Develop > spring-data' 카테고리의 다른 글

[JPA] Querydsl에 pageable을 적용하며... 2가지 방법을 소개하겠습니다.  (2) 2020.12.10
[Querydsl] Querydsl 사용방법 3가지  (0) 2020.12.07
[JPA] JPA를 적용하며.. ( field convert 편 )  (1) 2020.11.30
[JPA] JPA를 적용하며.. ( insert, update 분기 편 )  (1) 2020.11.27
[JPA] 프로젝트에 JPA를 적용하며.... ( save편 )  (0) 2020.11.26
'Develop/spring-data' 카테고리의 다른 글
  • [JPA] Querydsl에 pageable을 적용하며... 2가지 방법을 소개하겠습니다.
  • [Querydsl] Querydsl 사용방법 3가지
  • [JPA] JPA를 적용하며.. ( field convert 편 )
  • [JPA] JPA를 적용하며.. ( insert, update 분기 편 )
에디개발자
에디개발자
------ 한발자국씩 성장하자 ------ Github: https://github.com/yongtaelim LinkedIn: https://www.linkedin.com/in/%EC%9A%A9%ED%83%9C-%EC%9E%84-622b69218/
    250x250
  • 에디개발자
    에디블로그
    에디개발자
    • 분류 전체보기 (207) N
      • Develop (51)
        • spring-data (28)
        • spring-batch (7)
        • devops (5)
        • java (5)
        • kotlin (3)
        • database (2)
      • MindControl (12)
      • TroubleShooting (16)
      • Study (76)
        • kotlin (16)
        • java (15)
        • spring (6)
        • test (4)
        • message-queue (10)
        • object (22)
      • Develop Tool (1)
      • Daily Develop (7)
      • Book (5)
      • AI (27) N
        • Claude (12) N
        • ChatGPT (6) N
        • Cursor (3) N
        • Gemini (4) N
        • 트랜드 (2)
      • 개발 트렌드 (8) N
        • 데일리 픽 (8) N
  • 인기 글

  • 태그

    queryDSL
    ChatGPT
    Ai
    개발자 도구
    AI 활용
    ai 정보
    클로드
    스터디
    java
    코틀린
    프로그래밍
    에디
    kotlin
    JPQL
    anthropic
    claude
    엘레강트
    객체지향
    JPA
    OpenAI
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에디개발자
[JPA] JPA를 적용하며... mysql 함수 2번 호출되는 문제
상단으로

티스토리툴바