본문 바로가기
Spring

[Spring/Mybatis] 마이바티스 조회 시 NULL 반환 이슈(returnInstanceForEmptyRow)

by 상후 2024. 6. 24.
728x90
반응형

버전 업그레이드 프로젝트 중 발견한 사항을 기록합니다.

기존 버전에는 오류가 나지 않았으나, 버전 업그레이드가 된 버전에서는 오류가 발생하여 해당 원인을 파악하고 해결방법을 찾아 기록합니다. 


 

Mybatis에서 조회 시 Null이 반환되어 NullPointerExeception(NEP)가 발생

 

비즈니스 로직 내 코드나 쿼리가 변경된 것은 없었습니다.

기존 프로젝트에선 Null을 반환하지 않았는데, 신규 프로젝트(버전업)에서는 Null이 반환되었습니다.

 

테스트 케이스는 아래와 같습니다.

 

SELECT PHONE_NUMBER
  FROM USER
 WHERE USER_ID = 'TESTID'

 

위와 같이 한 컬럼만을 조회하는 쿼리를 실행하는데, 조회되는 ROW(데이터)는 있지만 null이 허용된 컬럼으로 컬럼 내 데이터는 존재하지 않았습니다.

 

xml 쿼리 내 마이바티스 속성으로 resultType은 hashMap을 반환하도록 설정이 되어있습니다.

 

기존 버전 및 예상 데이터는 아래처럼 Value가 없는 hashMap을 반환할 것이라고 생각했습니다.

하지만 신규 버전에서는 Null을 반환하고 있었고, 이후 비즈니스 로직에 의해 NPE가 발생한 것입니다.

{PHONE_NUMBER = }

 


해결 방법

 

마이바티스에서 반환되는 문제로 판단되어 공식 문서를 찾아보았습니다.

 

https://mybatis.org/mybatis-3/ko/configuration.html

 

mybatis – 마이바티스 3 | 매퍼 설정

매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할

mybatis.org

 

위 문서에서 returnInstanceForEmptyRow 해당 속성에 대한 내용을 읽게 되었습니다.

해당 속성은 마이바티스는 3.4.2 버전 이후부터는 모든 열들의 행이 NULL이 조회되었을 때, 결과 값도 Null을 반환한다는 속성입니다. 기본값은 false로 빈 인스턴스가 아닌 Null로 반환하도록 기본값이 변경된 것입니다.

 

 

해당 속성은 true로 지정하여 문제를 해결할 수 있었습니다.

 


설정 방법

 

Mybatis config 파일에 해당 설정을 추가해 주시면 됩니다.

 

xml 파일로 설정

<configuration>
	<settings>
		<setting name="returnInstanceForEmptyRow" value="true"/>
	</settings>
</configurtion>

 

 

properties로 설정

mybatis.configuration.return-instance-for-empty-row=true

 

 

 

728x90
반응형

댓글