728x90
# 오류 메시지
com.microsoft.sqlserver.jdbc.SQLServerException: 데이터 형식 varchar을(를) varbinary(으)로 암시적으로 변환할 수 없습니다. CONVERT 함수를 사용하여 이 쿼리를 실행하십시오.
# 오류가 발생한 상황 (예시)
- 웹 플랫폼에서 사용자 목록을 조회한다.
- 검색 조건으로 "거주 지역(country)"을 입력하면 사용자 목록에 거주 여부가 출력된다.
- 하지만 "거주 지역(country)"을 입력하지 않고 사용자 목록을 조회하면 "오류 메시지"와 같은
오류가 발생한다.
# 사용한 쿼리 (예시)
MyBatis
1 SELECT
2 M.USER_ID,
3 M.USER_NAME,
4 M.BIRTH,
5 M.GENDER,
6 CASE
7 WHEN M.COUNTRY = ISNULL(#{country}, '')
8 THEN '거주'
9 ELSE '비거주'
10 END AS LIVE_YN
11 FROM
12 MEMBER M
13 WHERE
14 ...
SSMS
1 SELECT
2 M.USER_ID,
3 M.USER_NAME,
4 M.BIRTH,
5 M.GENDER,
6 CASE
7 WHEN M.COUNTRY = ISNULL(null, '')
8 THEN '거주'
9 ELSE '비거주'
10 END AS LIVE_YN
11 FROM
12 MEMBER M
13 WHERE
14 ...
# 오류가 발생한 원인
먼저 오류가 발생한 부분은 MyBatis 7번 째 줄에 작성된 M.COUNTRY = ISNULL(#{coutry}, '')
검색 조건인 "거주 지역(country)"을 입력하지 않으면 MyBatis에서 #{country}에 null 값이 전달되요.
이 때 MyBatis는 내부적으로 비교하는 컬럼(M.COUNTRY)과 데이터타입을 일치시키기 위해 형변환을 하는데,
null은 MyBatis에서 varbinary 타입으로 인식해요.
오류 메시지를 읽어보면 M.COUNTRY 컬럼이 varchar 타입인데
이 컬럼을 null의 데이터타입인 varbinary로 변경하려다 에러가 발생했다는 것을 알 수 있어요.
하지만 SSMS에서 쿼리를 실행하면 정상 동작 합니다.
결론!
MyBatis에서 ISNULL(#{country}, '')을 사용하여 데이터를 조회/수정/삭제하는 과정에서
오류가 발생할 수 있다는 거에요.
# 해결 방법
결국 오류의 원인은 MyBatis를 이용하여 M.COUNTRY = ISNULL(#{country}, '') 형식으로
쿼리를 작성했다는 것이에요.
이 오류를 해결하기 위해 몇 가지 방법이 있는데요.
- 검색 조건인 "거주 지역(country)"를 입력하지 않았을 때 Front-end에서 null 대신
빈 값의 문자열로 전달해주기 - Back-end에서 country 값이 null인 경우 빈 값의 문자열로 변경하기
- MyBatis에서 조건문을 이용하여 쿼리를 작성하기
<if test="country != null"> ... </if>
<if test="country = null"> ... </if>
어떤 방법을 사용하던 오류는 해결할 수 있어요.
참고로 저는 Back-end에서 빈 값의 문자열로 변경하여 MyBatis에 전달하는 것을 선호한답니다.
728x90