본문 바로가기

Spring

Spring Boot init.sql.mode 사용시 쿼리 누락 문제(주석)

인텔리제이로 팀 프로젝트를 진행하던 때 mysql 더미 데이터를 만들어 init.sql.mode로 실행할 때 삽입하는 작업을 진행하고 있었다.

그러다가 하나의 쿼리문이 실행되지 않는 문제가 발생했다.

사진으로 예를 들자면 위의 visa 테이블의 D-2 Tuple이 삽입되지 않는 문제 였다.

순간의 오류인가 싶어 인텔리제이를 재시작해보기도하고, 데이터베이스를 다시 로드해보기도 했으며, 코드의 위치를 바꿔보기도했다.

그러나 오류가 해결이 되지 않았다.

이리저리 시도하던 중 몇 가지 이상함을 발견했다.

1. H-2와 D-2의 순서를 바꾸면 H-2가 안나오고 E-9와 바꾸면 E-9가 안나왔다. (즉 첫 순서의 쿼리가 나오지 않았다.)

2. 각 테이블의 첫 쿼리들이 전부 들어가지 않았다.

3. 작성 쿼리의 일부를 받은 팀원의 컴퓨터에서는 멀쩡히 들어갔다.

위의 내용에 대해 팀원과 상의 중 주석 때문이 아니냐는 팀원의 조언에 주석을 지우고 시도하니 멀쩡히 해결됬다!

문제를 해결하고 만족했으나 문득 왜 주석 때문에 문제가 발생했는지 궁금해졌다.

sql.init 파일에 들어가봤다.

여러 설정이 보인다.

이 중에 아무거나 브레이킹을 걸고 실행해봤다.

실행 순서 중에 DataSourceScriptDatabaseInitializer가 눈에 띄인다.

옳거니! execute!

execute로 들어오니 내가 작성한 걸 받아오는 듯한 코드가 눈에 띄인다.

script 찾았다!

내 코드가 들어있을거 같은 친구를 찾았다 스탭을 차분히 밞아보자

참고로 테스트를 위해 이러한 주석을 이용했다.

scriptBuilder가 보이는가? 한 줄씩 차례대로 넣고 있다!

스크립트를 한 자씩 확인하고 있다!

;에 도달했다. 주석부분에서는 아무런 이후엔 어떤 일이?

스텝을 빠르게 넘기니 sb에 글자가 하나씩 담기더니 statement에 실행될 스크립트가 담겨져 실행되었다. 첫 주석의 #(수많은 하이픈은 어디 갔지?)과 두번째 주석을 넘기고 첫 쿼리문이 같이 들어가서 실행되는 것이 보인다! 즉 주석과 바로 아래의 쿼리문이 하나의 스크립트로 실행되었기에 생긴 문제 였던 것.

그럼 주석을 쓰면 안되는 것인가?

계속 스텝을 이어가다보니

스크립트를 분리하는 splitSqlScript를 찾았다. 저 매개변수 값을 보자.

보이는 가? 한줄 주석은 --으로 블록 주석은 /**/이 기본 주석으로 설정되었다.

그렇기 때문에 #으로 시작하는 주석이 문제가 되어 오류가 발생한 것으로 보인다!

그렇다면 수많은 하이픈은 두 개씩 끊어서 주석으로 처리 된 것일 것이다.

 

+ 스크립트 더 쉽게 보기

splitSqlScript를 찾으니 실행 단위가 바로 다보이네 이런 젠장!

주석을 바꾸어주니 멀쩡해졌다! 

 

결론 : 앞으로는 --나 /**/ 주석을 이용하도록 하자!

수많은 sql이 더블 하이픈(--)과 블록(/**/)을 주석으로 사용한다.

거기에 각 sql 별로 추가적인 주석을 사용한다.(내가 쓴 mysql의 #처럼)

인텔리제이는 모든 sql의 방언 주석까지 신경을 써줄 생각은 없었던 모양이다.

 

++ 재밌는 점을 찾았다.

쿼리문은 세미콜론을 기준으로 자르는 것이다보니 # 주석 마지막에 세미콜론을 넣으면 괜찮지 않을까? 라는 생각해 실행해봤다.

원래는 스크립트에 들어가지 말아야할 주석이 맨 첫 줄에 보인다(ㅎㅎ) 물론 실행에는 아무런 영향이 없었다.

만약 정 # 주석을 사용하고 싶다면 세미콜론을 붙이면 될 거 같다.