728x90
Spring을 사용하여 로그인 처리를 하던 중에 email을 사용하여 회원을 찾는 기능에서 error가 발생하였습니다.
javax.persistence.NoResultException: No entity found for query
해당 기능은 Optional을 사용하여 구현하였고, 결과가 null일 경우 404 Not Found error가 발생해야 하지만 예상과는 다르게 500 Internal Server Error가 발생하였습니다. 따라서 Repository에 구현된 findByEmail에 문제가 있다는 것을 알 수 있었습니다.
문제 해결을 위해서는 getSingleResult를 사용하지 않고, getResultList을 사용하는 것으로 해결 가능합니다.
// 수정 전
public Optional<Member> findByEmail(String email) {
return Optional.of(em.createQuery(
"select m from Member m" +
" where m.id = :id", Member.class)
.setParameter("id", id)
.getSingleResult());
}
// 수정 후
public Optional<Member> findByEmail(String email) {
List<Member> members = em.createQuery(
"select m from Member m" +
" where m.email = :email", Member.class)
.setParameter("email", email)
.getResultList();
return members.stream().findAny();
}
getSingleResult를 사용할 경우 결과에 따라 다음의 error를 발생시킵니다.
- NoResultException: 결과가 없을 경우
- NonUniqueResultException: 결과가 2개 이상을 경우
따라서 getSingleResult를 사용하여 error 처리를 하고 싶다면 Repository에 null을 확인하는 코드를 작성하여 합니다. 하지만 그렇게 되면 Repository의 역할이 1개 더 늘어나게 되므로 getResultList를 사용하여 결과가 없을 경우 findAny()를 사용하여 Optional을 반환하고, Service에서 error를 처리하도록 해줍니다.
728x90
'Error' 카테고리의 다른 글
[Error] The following parts of the payload were not documented (0) | 2022.02.28 |
---|---|
[Error] Failed to parse configuration (0) | 2021.11.18 |
[Error] cannot deserialize from object value (0) | 2021.10.29 |
[Error] UnhandledPromiseRejection (0) | 2021.10.08 |
[Error] Initialize a Spring Batch Database (0) | 2021.09.24 |