java - NullPointerException (target is null for method equals)
오늘도 동적 마이바티스를 이어서 공부했다.
where 절을 이용하여 조건별로 data를 출력해보려 했다.
그간 복습을 열심히 해서 그런지 흐름이나 코드 작성이 쉽게 느껴졌다.
① 동작순서 : Scanner → 4 → 1 → 예 → 검색할 코드 입력 → 입력한 코드에 따른 검색 결과 (잘 출력됨)

역시나 메뉴코드 조건에 맞는 데이터가 잘 출력 되었다. 그러나.....
나의 기쁨도 잠시... 전체 조회에서 또다시 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시간을 찾아다녔다... 그저께 봤던 에러인데.... 사람은 망각의 동물, 오늘도 잊지 않기 위해 기록을 남긴다...
★ 오늘의 교훈 : 에러를 잘 확인하자 ^ㅠ^