JPA exists 쿼리 성능 및 queryDsl 구현


개발을 하다보면, 데이터가 유무를 판별하는 경우가 많다.

보통은 size(), count, exists 중에서 데이터의 유무를 판별하게 되는데,

어떤것을 사용하는게 성능이  좋을까???

size() 모든 데이터를 select을 해야하는 부분이 있어서 성능이 안나온다고 생각했었다.

하지만, count vs exists는 크게 생각을 안해본거 같아서 정리해본다.

count는  몇건인지 확인을 하기 위해 전체를 확인해봐야하고,

exists는 첫번째 결과에서 바로 true를 리턴하게 된다.

'exists가 count보다 성능이 좋은 이유가 결국 전체를 조회하지 않고 첫번째 결과만 확인하기 때문이다.'

하지만, 

exists는 @Query에서 사용할  없으므로 Querydsl을 사용해야한다.

아래는 Querydsl로 직접 exists를 구현한 내용이다.
limit로 1개만 조회하고 해당 데이터가 있는지 없는지 판단한다.

public Boolean existsErrScrap(SchScrapRequestDto requestDto, BatchStatus status) {
    return jpaQueryFactory.select(schScrapErrHist.id)
            .from(schScrapErrHist)
            .where(
                    schScrapErrHist.id.orgCd.eq(requestDto.getOrgCd()),
                    schScrapErrHist.id.svcCd.eq(requestDto.getSvcCd()),
                    schScrapErrHist.status.eq(status)
            ).fetchFirst() != null;
}