[문제] 정렬 포함한 쿼리 실행 시 NPE 발생.
[원인] 검색 조건으로 전달받은 String 비교 시 '==' 사용
[해결] 문자열 비교는 '=='가 아닌, .equals() 사용
정렬 포함한 쿼리 실행 시 NPE 발생.
테스트 코드에서는 문제없이 잘 실행됐는데, 실제 API 호출할 때 NPE가 떠서 처음에는 EntityManager가 제대로 주입이 안돼서 그런줄 알았다. 테스트 코드에서는 EntityManager를 명시해줬는데,
CourseRepositoryImpl에서는 JPAQueryFactory만 명시하고 EntityManager는 따로 명시 안했기 때문이다.
따로 명시 안한 이유는
① 김영한님의 스프링 강의에서도 명시를 안했음
② 예전에 다른 개인 프로젝트 할 때도 명시 안했는데 잘 됐었음
③ SpringBoot, Spring Data JPA에서 알아서 찾아줄 거라고 생각했음
테스트 코드에서는 실행이 되는데, 실제 API를 호출했을 때는 NPE가 발생하니까 당연히 EntityManager 문제일 줄 알았는데, 몇 시간째 찾아봐도 도저히 고쳐지지 않았다. 그래서 에러 로그를 다시 살펴보니 orderBy 부분이 문제였다... 개 멍청한 짓 해서 시간만 날렸다...
아니 근데 솔직히 이거 생각 못한 이유가, 정렬하는 부분이 문제였으면 테스트 코드에서도 안돼야 하는거 아닌가??
뭐 어쨌든 문제 원인을 찾았으니 다행이다.
정렬 조건인 cond가 제대로 전달됐는지 확인하기 위한 코드 두 줄을 추가했다.
(원래 sout이 아니라 로그로 출력하는 것이 좋다고 하는데, 아직 로그 사용법을 잘 모르겠다.)
①-1 테스트 코드에서 cond = distance 실행 결과
테스트 코드에서는 검색 조건이 잘 전달되었고, 테스트도 성공했다.
① -1 테스트 코드에서 cond = null 실행 결과
cond = null 이면 courseRepository.searchCourses() 자체에서 NPE가 발생하기 때문에 테스트 코드 실행했을 때 에러가 뜨는 것이 맞는 것 같다.
② API 호출할 때 cond = distance 실행 결과
아니 분명히 cond = distance로 전달 잘 됐으면서 null이라고 한다. 테스트 코드랑 분명 똑같이 한건데 왜 안되는거지??
API request에서 parameter 전달할 때 잘못된건가???
그래서 혹시나 해서 검색 조건 처리하는 코드를 다시 살펴봤다.
아....! 문자열 비교인데 왜 '=='를 썼지??
그래서 == 대신 .equals()로 바꿔서 해봤다.
잘 나온다...
진짜 개 멍청한 실수였다... 이래서 기본기가 중요한가보다...
coding-factory.tistory.com/536
[Java] 문자열 비교하기 == , equals() 의 차이점
자바에서 일반적인 데이터 타입의 비교는 ==이라는 연산자를 사용하여 비교합니다. 하지만 String 문자열의 값을 비교할때에는 ==이 아닌 equals()라는 메소드를 사용하여 비교를 합니다. equals와 ==
coding-factory.tistory.com
'개발' 카테고리의 다른 글
gpx 를 이미지로 변환 (0) | 2021.05.05 |
---|---|
UserProfileDto NPE (0) | 2021.05.04 |
[연습] travis-ci (0) | 2021.04.27 |
[연습] springboot, rest api 서버, 카카오 소셜로그인, jwt (0) | 2021.04.26 |
캡스톤 메모 (0) | 2021.04.02 |