1. 테이블명이 숫자로 시작하는 경우, 구문오류 발생?
기능이 제대로 작동하지 않는다는 연락을 받고, 로그를 확인해보니 다음과 같은 에러가 발생했다.

위의 이미지는 DBeaver에서 실제 일어난 에러와 같이 에러나 나도록 한 쿼리문이다.
왜 이런 에러가 떨어지는건지 찾아보니, 아이디의 첫문자가 숫자로 시작하는 사용자의 계정에서만
공통적으로 쿼리문에서 에러가 발생한다는 것을 알게 되었다.
그래서 해당 쿼리문을 보니 다음과 같이 작성되어 있었다.
오류가 발생한 샘플쿼리
<sql />
SELECT id, name FROM ${schema_name}.${table_name}
여기서 ${schema_name}은 스키마명일테고, 에러나 나는 부분은 ${table_name} 이 부근인데,
현재 로직은 사용자의 아이디를 테이블명인 ${table_name}으로 넘겨 주고 있었다.
예를 들면 스키마가 'public'이고, 사용자 아이디가 '1234love' 라고 한다면 결국 실행되는 쿼리는 아래와 같다.
실제 실행 된 쿼리
<sql />
SELECT id, name FROM public.1541_TABLE;
보통 테이블명 또는 컬럼명 등을 파라메터로 받을 때는 #{ }대신 ${ }를 사용한다.
자세한 내용은 "마이바티스에서 샵(#)과 달러($)의 차이점에 대하여"를 참조하도록 하자.
결국 저 테이블명 맨앞의 숫자 때문에 발생하는 에러인데, 해결방법은 쉽다. 그냥 테이블명을 쌍따옴표( " )로
묶어주기만 하면 된다. 그럼 ${ }에서 어떻게 해야 테이블명이 쌍따옴표로 묶일까? 다음과 같이 하면 된다.
2. 해결방법 : 테이블명을 쌍따옴표(")로 묶어주기
테이블명을 쌍따옴표로 묶는 쿼리
<sql />
SELECT id, name FROM ${schema_name}."${table_name}"
실제 실행된 쿼리
<sql />
SELECT id, name FROM public."1541_TABLE";
결과

이렇게 하면 맨앞이 숫자로 되어 있어도 오류 없이 해당 쿼리를 실행할 수 있다.
아마 숫자로 시작하는 계정에 대한 생각없이 쿼리문을 짜서 이런 에러가 발생한 것 같다.
하드코딩을 할때야 바로바로 에러가 뜨니 확인이 가능하겠지만, ${ }를 통해 동적으로 테이블명을 가져올때는
쌍따옴표로 묶어주는게 더 안전하지 않을까? 라는 생각을 하게 되었다.
'MyBatis' 카테고리의 다른 글
[MyBatis] 마이바티스에서 샵(#)과 달러($)의 차이점에 대하여 (0) | 2022.08.20 |
---|---|
[Mybatis] 마이바티스 forEach문법을 활용한 쿼리 반복 실행에 대해 알아보자. (0) | 2022.05.25 |
[MyBatis] 마이바티스 parameterType이 String인 데이터 사용하기 ( String을 <if> 에서 사용 ) (0) | 2022.05.13 |
[MyBatis] 마이바티스 부등호(>, <, >=, <= )가 안 먹히는 현상/부등호 오류 ( CDATA ) (0) | 2022.05.01 |
[MyBatis] 어노테이션 방식과 XML방식의 구현방법 및 차이점 (0) | 2022.03.17 |