[ Querydsl ] exists를 어떻게 구현해야할까?

김동찬·2024년 5월 20일

우리는 querydsl을 통해 exists를 구현하고는 한다
이 exists를 구현할 때 우리는 어떻게 구현하는 것이 좋을지 알아보려고 한다.

1. fetchCount()

public Boolean findByMember(Entity entity) {
        return queryFactory.selectFrom(entity)
                .where(entity.eq(entity))
                .fetchCount()>0;
    }

위와 같이 count를 한 후 그 결과가 1보다 큰지 확인하는 방법이 있다.
그러나 이 방법은 결국 모두 조회한 후 0보다 큰지 확인하기 때문에 성능적으로 비효율적이다.

2.exists()

일반 query의 exists는 분명 효율적이다
그러나 querydsl의 exists는 이상하게도 fetchCount를 사용하는 위의 방법과 같이 구현되어있다.
그럼 우리는 대체 어떻게 구현해야할까?

3.fetchFirst()

public Boolean findByMember(Entity entity) {
        return queryFactory.selectFrom(entity)
                .where(entity.eq(entity))
                .fetchFirst()!=null;
    }

과 같이 구현하면 조회를 하며 하나라도 조건에 맞는 칼럼을 발견하면
즉시 탐색을 종료하므로 최악의 경우에는 fetchCount()를 사용한 것과 같은 성능을 보여줄 수도 있으나 전체적으로 보았을 때에는 분명 더 좋은 성능을 보여줄 수 있을 것이다.

0개의 댓글