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