티스토리 뷰

회원가입을 하는 경우, 아이디에 대한 중복검사를 하는 기준을 이메일로 선정하였습니다. Postman으로 테스트하던 중 No entity found for query 라는 에러를 발견하였습니다. javax.persistence.NoResultException가 발생하였고, 말 그대로 해석하면 쿼리를 날렸는데 결과를 찾지 못했다는 뜻입니다.

 

여기서 떠올랐던 생각은 쿼리를 잘못 날렸거나, 쿼리는 정상인데 엔티티를 찾지 못했다는 것입니다.

생각해보면, 이메일 중복검사를 하기위해 쿼리를 날렸는데 신규 가입을 하는 경우에는 당연히 엔티티를 찾지 못합니다. 그러면 쿼리의 결과를 반환하는 과정에서 문제가 있다고 판단하였습니다.

findByEmail 메소드

현재 작성된 findByEmail 반환타팁을 보면 User 객체이고 쿼리의 결과를 getSingleResult로 받아오고 있습니다. 여기서 javax.persistence.NoResultException이 발생하는데 NoResultException에 들어가보면 getSingleResult로 결과를 가져왔을 때 결과가 없는 경우에 무조건 예외를 발생시킨다는 것을 알 수 있었습니다. 

NoResultException

try - catch를 통해 예외를 핸들링하는 것이 좋을지 getResultList를 이용해 처리하는 것이 좋을지 생각해보았습니다. 회원가입을 할 때 마다 예외를 발생시켜 예외를 핸들링 하는 것 보다 getResultList 함수를 이용해 쿼리의 결과를 받아오고 Optional 처리를 해주는게 더 깔끔한 로직이라고 판단하였습니다.

 

Optional 객체를 반환하여, 해당 로직을 검증하는 service에서 적절히 판단할 수 있습니다 !

댓글