개발공작소
article thumbnail
728x90

 

 

 

테이블명이 숫자로 시작하는 경우, 구문오류 발생?

 

기능이 제대로 작동하지 않는다는 연락을 받고, 로그를 확인해보니 다음과 같은 에러가 발생했다.

 

샘플 쿼리

 

위의 이미지는 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";

 

 

결과

 

 

 

이렇게 하면 맨앞이 숫자로 되어 있어도 오류 없이 해당 쿼리를 실행할 수 있다.

아마 숫자로 시작하는 계정에 대한 생각없이 쿼리문을 짜서 이런 에러가 발생한 것 같다.

하드코딩을 할때야 바로바로 에러가 뜨니 확인이 가능하겠지만, ${ }를 통해 동적으로 테이블명을 가져올때는

쌍따옴표로 묶어주는게 더 안전하지 않을까? 라는 생각을 하게 되었다.

 

 

 

728x90
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!