버전 업그레이드 프로젝트 중 발견한 사항을 기록합니다.
기존 버전에는 오류가 나지 않았으나, 버전 업그레이드가 된 버전에서는 오류가 발생하여 해당 원인을 파악하고 해결방법을 찾아 기록합니다.
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
위 문서에서 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
'Spring' 카테고리의 다른 글
[Test] ConnectionTimeout / ReadTimeout 테스트 하기 (0) | 2024.04.09 |
---|---|
[SpringBoot] H2 데이터베이스 PostgreSQL 모드로 변경하기 (0) | 2024.03.13 |
[Springboot] 외부에서 로컬 서버 접속하기 (0) | 2024.03.12 |
Mybatis cannot change the executortype when there is an existing transaction (2) | 2024.03.07 |
[SpringBoot] 스프링부트 - @SpringBootApplication 이해하기 (0) | 2021.08.21 |
댓글