본문 바로가기
Language/Java

java - NullPointerException (target is null for method equals)

by 쿠키오빠 2024. 10. 15.
반응형

오늘도 동적 마이바티스를 이어서 공부했다.

 

where 절을 이용하여 조건별로 data를 출력해보려 했다.

 

그간 복습을 열심히 해서 그런지 흐름이나 코드 작성이 쉽게 느껴졌다. 

 

 

① 동작순서 : Scanner → 4 → 1 → 예 → 검색할 코드 입력 → 입력한 코드에 따른 검색 결과 (잘 출력됨)

Run 시 입력 화면

역시나 메뉴코드 조건에 맞는 데이터가 잘 출력 되었다. 그러나.....

 

나의 기쁨도 잠시... 전체 조회에서 또다시 NullPointerException 에러가 발생했다.

동작순서 :  Scanner → 4 → 1 → 아니오 또는 아무 글자 → db상에 전체 조회 결과 (에러)

 

여기서 의문이 생겼다.

 

에러가 발생할 거면 전체 조회보다 조건을 하나 더 적용한 ① 이 에러가 나야하는 거 아닌가!?

 

그런데 카테고리 검색 조건을 적용한 ① 항목은 잘 출력이 되고,  전체 조회인 ②이 에러가 발생하는 거 아닌가!


일단 이 에러는 '값이 없다, 값을 담아오지 않았다' 라고 하니, 어디에서 값이 못 담겼나 하고 "확인 " 출력구문을 넣었다.

ex) System.out.println("확인 0 ~ 2")

이 화면에서 boolean 타입으로 예(①) 이외(②)에는 전체 조회가 되도록 설정했다.

 

확인0~1 까지 잘 출력 되지만 MenuService 클래스에 확인 2가 출력이 되지 않았다.

 

mapper에 searchMenuCode 메서드는 잘 호출이 되었지만 담아오는 과정에서 문제가 발생한 것 같다. 

 

----------------------------------------------------------------------------------------------------------------------------------------------

mapper.xml 파일의 쿼리문을 확인해 보았다. 

 

id(호출 메서드 명) , resultType(반환 타입) , resultMap(리절트 맵 아이디) , parameterType(받아주는 타입) 모두 이상이 없어 보인다.

쿼리문도 전~혀 문제될 게 없어 보였다. 

<풀이>

condition(menuCode)가 "예"이거나 null이 아니라면  아래의 where 절 수행, 그게 아니라면 where 절 무시

(SearchCriteria 클래스를 DTO 형식으로 condition , value(값 고정) 두가지만 전역번수로 설정하여 만들었다.) 

 

 

----------------------------------------------------------------------------------------------------------------------------------------------

이쯤에서 뭔가 계속 다른길로 새는 것 같아, 에러 내용을 다시 봤다.

 

왜 이걸 못 봤을까!  (그저께 포스팅에서도 같은 에러였다 ^ㅅ^)

 

equals 메서드 자체가 오류였다!!!

 

다시 쿼리문을 보니

<if test="condition.equls('menuCode') and condition != null">

→ condition이 menuCode와 같으면서 condition이 null이 아니라면 이라는 뜻이다.

 

다시 돌아와서 "예"가 아닌 다른 글을 입력하면 if 문이 작동하지 않는다(set 메서드 호출 x)

그냥 빈 값을 가지고 searchMenuCode로 호출간다는 뜻이다.

 

그러므로

이미 비어있는 condition은 null이고, 풀어보면 null.equals('menuCode')가 된다.

equals 메서드를 이용해서 이미 비어있는 null과 무언가를 비교해라? 말도 안 된다는 말이다!

 

문제가 있는 앞의 구문과 뒤의 condition != null 구문과 자리만 바꾸어서 재실행 해봤다.

if문에서 setter 메서드를 호출하지 않으므로 condition은 null이다.

고로, condition != null 이라는 구문을 컴파일 하자마자 아래의 where절을 생략하고 전체 조회가 잘 동작하는 할 거라 생각했다.

(컴퓨터는 위에서 아래, 왼쪽에서 오른쪽으로 읽으니까!!!!)

에러 없이 잘 출력 된다 ^ㅅ^

 

이것 때문에 1시간을 찾아다녔다... 그저께 봤던 에러인데.... 사람은 망각의 동물, 오늘도 잊지 않기 위해 기록을 남긴다... 

 

★ 오늘의 교훈 : 에러를 잘 확인하자 ^ㅠ^

반응형