[QueryDSL] fetchFirst()와 fetchOne()의 차이
ㅁ 들어가며
ㅇ QueryDSL을 사용하다 보면 fetchFirst()와 fetchOne() 메서드를 자주 마주치게 된다.
ㅇ 이 두 메서드는 비슷해 보이지만 중요한 차이점이 있다.
ㅇ 오늘은 이 두 메서드의 차이점을 정리하였다.
ㅁ fetchFirst()
ㅇ fetchFirst() 메서드는 쿼리 결과에서 첫 번째 결과만을 반환한다.
ㅇ 주요 특징
- 항상 단일 결과를 반환한다.
- 결과가 없으면 null을 반환한다.
- 여러 결과가 있어도 예외를 발생시키지 않고 첫 번째 결과만 반환한다.
- 내부적으로 LIMIT 1을 사용하여 데이터베이스에서 하나의 결과만 가져온다.
ㅁ fetchOne()
ㅇ fetchOne() 메서드는 쿼리 결과가 정확히 하나일 때 사용한다.
ㅇ 주요 특징
- 결과가 정확히 하나일 때만 해당 결과를 반환한다.
- 결과가 없으면 null을 반환한다.
- 결과가 두 개 이상이면 NonUniqueResultException을 발생시킨다.
- 데이터베이스에서 모든 결과를 가져온 후 결과의 개수를 확인한다.
ㅁ 사용 시 주의사항
ㅇ fetchFirst()는 여러 결과가 있어도 첫 번째 결과만 반환하므로, 유일성을 보장해야 하는 경우에는 주의해서 사용해야 한다.
ㅇ fetchOne()은 결과가 두 개 이상일 때 예외를 발생시키므로, 결과가 하나임을 확신할 수 있는 경우에만 사용해야 한다.
ㅁ 성능
ㅇ fetchFirst는 내부적으로 limit(1)을 걸고 있다.
ㅇ 이럴 경우 테이블 전체를 색인하는 과정에 1건이 발견되면 색인을 멈추게 된다.
ㅇ 하지만 fetchOne은 모든 데이터를 색인 후 결과의 개수를 확인하기 때문에 느릴 수 있다.
ㅁ 마무리
ㅇ fetchFirst()와 fetchOne()은 각각 다른 상황에서 유용하게 사용될 수 있다.
ㅇ 데이터의 특성과 쿼리의 목적을 고려하여 적절한 메서드를 선택하는 것이 중요하다.
ㅇ 성능 측면에서는 fetchFirst()가 더 효율적일 수 있지만,
데이터의 정확성과 유일성이 중요한 경우에는 fetchOne()을 사용하는 것이 안전할 수 있다.
ㅁ 함께 보면 좋은 사이트