fetchFirst() NullPointerException 에러가 발생했을 때 이유는
fetchFirst() null을 반환할 경우 발생한다.
이 경우 fetchOne()을 사용하면 해당 에러를 해결할 수 있지만
하지만 fetchOne()은 더 많은 리소스를 사용하여 성능에 영향을 미칠 수 있어
다른 방법을 고려해야한다.
먼저, etchFirst()가 null을 반환하는 이유를 확인해 보자
예를 들어, 조건에 맞는 데이터가 없는 경우 null을 반환하는 것이 의도된 동작이라면,
fetchFirst()를 그대로 사용하는 것이 올바른 방법이다.
하지만, fetchFirst()가 null을 반환하는 것이 예상치 못한 결과일 떄
필요한 데이터만 선택적으로 가져오는 등의 방법으로 쿼리를 최적화할 수 있다.
예를 들어, 좋아요 수를 가져올 때 fetch().size 대신 fetchCount()를 사용하면
좀 더 효율적인 쿼리를 작성할 수 있다.
또한, fetchFirst()가 null을 반환할 경우
대체 값을 지정해 주는 등의 방법으로 에러 처리를 개선할 수도 있다.
아래의 간단한 예제코드를 보며 확인해보자
하나의 응답을 원할 때
위 코드는 memberId를 입력 받아 해당 memberId가 존재하는지 확인하는 코드이다.
memberId가 일치하는 회원을 찾는다.
fetchFirst() 메서드를 사용하여 첫 번째 결과를 반환하고,
결과가 null이 아니면 해당 memberId가 존재하는 것으로 판단하여 true를 반환하고,
결과가 null이면 해당 memberId가 존재하지 않는 것으로 판단하여 false를 반환한다.
fun memberExist(memberId: Long): Boolean {
val findMember = queryFactory
.selectOne()
.from(member)
.where(member.memberId.eq(memberId))
.fetchFirst()
return findMember != null
}
fetchFirst()를 사용할 경우 limit(1)과 같은 개념이다.
원하는 결과를 찾으면 쿼리가 종료되므로 성능이 향상된다.
반면에 exist()를 사용할 경우, select에 count(1)의 결과를 받아 > 0 조건을 통해 조건을 반환한다.
그러나 이렇게 사용하면 원하는 결과를 찾아도 DB는 계속 검색을 진행하게 되므로 성능 문제가 발생할 수 있다.
또한, selectOne에서 검색 결과가 없는 경우 null이 반환되므로 return 문에서 null을 검사해야한다.
요약하자면, 상황에 따라 fetchFirst(), exist(), 또는 selectOne을 사용하는 것이 쿼리의 성능과 효율성에 다른 영향을 미칠 수 있다.
따라서 각 쿼리의 고유 상황을 고려하여 시스템의 요구 사항에 가장 잘 맞는 방법을 선택하는 것이 중요하다.
'Back-end Skill > DataBase' 카테고리의 다른 글
[PostgreSQL] 운영서버DB를 개발서버로 pg_dump 하는법 (0) | 2023.03.13 |
---|---|
[queryDsl] Q-type Class 는 도대체 왜 만드는건가? (0) | 2022.10.24 |
[queryDsl] queryDsl에서 데이터 insert하는 방법 (0) | 2022.10.24 |
JPA 사용할 때 주의해야할 점 2편_관계매핑의 정의와 mappedBy 이해하기 (0) | 2022.10.06 |
Python pandas을 통해 DB 마이그레이션하는 방법 (1) | 2022.10.05 |