반응형

[문제] 정렬 포함한 쿼리 실행 시 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

+ Recent posts