Programming/Spring

[QueryDSL] fetchFirst()와 fetchOne()의 차이

기록하는 백앤드개발자 2024. 6. 29. 10:10
반응형

ㅁ 들어가며

ㅇ QueryDSL을 사용하다 보면 fetchFirst()와 fetchOne() 메서드를 자주 마주치게 된다. 
ㅇ 이 두 메서드는 비슷해 보이지만 중요한 차이점이 있다. 
ㅇ 오늘은 이 두 메서드의 차이점을 정리하였다.

 

ㅁ fetchFirst()

ㅇ fetchFirst() 메서드는 쿼리 결과에서 첫 번째 결과만을 반환한다.

ㅇ 주요 특징

 - 항상 단일 결과를 반환한다.

 - 결과가 없으면 null을 반환한다.
 - 여러 결과가 있어도 예외를 발생시키지 않고 첫 번째 결과만 반환한다.
 - 내부적으로 LIMIT 1을 사용하여 데이터베이스에서 하나의 결과만 가져온다.

 

ㅁ fetchOne()

ㅇ fetchOne() 메서드는 쿼리 결과가 정확히 하나일 때 사용한다. 

ㅇ 주요 특징

 - 결과가 정확히 하나일 때만 해당 결과를 반환한다.
 - 결과가 없으면 null을 반환한다.
 - 결과가 두 개 이상이면 NonUniqueResultException을 발생시킨다.
 - 데이터베이스에서 모든 결과를 가져온 후 결과의 개수를 확인한다.

 

ㅁ 사용 시 주의사항

ㅇ fetchFirst()는 여러 결과가 있어도 첫 번째 결과만 반환하므로, 유일성을 보장해야 하는 경우에는 주의해서 사용해야 한다.

ㅇ fetchOne()은 결과가 두 개 이상일 때 예외를 발생시키므로, 결과가 하나임을 확신할 수 있는 경우에만 사용해야 한다.

 

ㅁ 성능 

ㅇ fetchFirst는 내부적으로 limit(1)을 걸고 있다.

ㅇ 이럴 경우 테이블 전체를 색인하는 과정에 1건이 발견되면 색인을 멈추게 된다.

ㅇ 하지만 fetchOne은 모든 데이터를 색인 후 결과의 개수를 확인하기 때문에 느릴 수 있다.

 

ㅁ 마무리

ㅇ fetchFirst()와 fetchOne()은 각각 다른 상황에서 유용하게 사용될 수 있다. 

ㅇ 데이터의 특성과 쿼리의 목적을 고려하여 적절한 메서드를 선택하는 것이 중요하다. 

ㅇ 성능 측면에서는 fetchFirst()가 더 효율적일 수 있지만, 
     데이터의 정확성과 유일성이 중요한 경우에는 fetchOne()을 사용하는 것이 안전할 수 있다.

 

ㅁ 함께 보면 좋은 사이트

 

querydsl 공식 문서 - fetchOne

반응형