Spring Boot 프로젝트 중, schema.sql 과 data.sql 에 function(procedure) 를 기입했더니 다음과 같은 PSQLException 이 발생하며 제대로 동작하지 않았다.
👾 오류메세지 👾
Caused by: org.postgresql.util.PSQLException: Unterminated dollar quote started at position 95 in SQL CREATE OR REPLACE FUNCTION public.create_schema() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ DECLARE msg varchar(100). Expected terminating $$
오류 내용을 확인해보면 함수 내부에 쓰인 $$ 달러 쿼트 가 종료되지 않았다고 하는데 나는 분명히 종료해줬고, pgAdmin 에서는 같은 함수 쿼리문으로 생성만 잘 되길래 도대체 어디서 문제가 생긴건지 찾기가 어려웠다.
구글링해서 알아보니, Spring 에서 sql 파일을 초기화할때 구분자가 기본으로 세미콜론(;)으로 되어있는데, 달러구분자 뒤의 세미콜론을 종료로 인식하지 못하고 계속 이어지는 것으로 판단하는 것 같았다.
그래서 좀 더 확실하게 종료처리를 알려주기 위해서 spring 설정파일에서 구분 separator 를 변경해주고, sql 파일에도 적용해주었더니 잘 작동했다.
1. application.properties 혹은 yml 에 구분자를 새로 지정해준다. (기본으로 세미콜론)
spring.sql.init.separator={원하는 구분자}
spring.sql.init.separator=;;
세미콜론 두개로 바꿔주었다. 원하는 다른 걸로 바꿔도 무관하다.
property 이름은 Spring Boot 버전에 따라 차이가 있는 것 같다.
최신 버전은 위 속성명으로 지정해주면 되고 적용이 안되는 예전 버전은 아래 속성으로 지정해주면 된다.
spring.datasource.separator={원하는 구분자}
spring.datasource.separator=;;
2. 해당 함수 달러구분자 뒤에 위에서 작성했던 구분자로 종료되었음을 알려준다.
기존 : $BODY$;
변경 : $BODY$;;
참고로 다른 부분은 변경하지 않아도 된다. 기존에 세미콜론으로 종료한 일반 쿼리문들을 모두 바꾼 세미콜론 두개로 바꿔줘야하나 했는데, 위의 경우처럼 $$ 달러 $$ 를 사용한 함수에 마지막에만 적용해줬더니 오류 없이 잘 작동했다.
참고 :
stackoverflow
spring.sql.init.separator
https://docs.spring.io/spring-boot/docs/1.1.1.RELEASE/
'디버깅∕오류해결' 카테고리의 다른 글
[IntelliJ] 프로젝트 import 구문 에러 발생할 경우, 해결 방법 (0) | 2024.05.20 |
---|---|
Address already in use: JVM_Bind (0) | 2022.04.03 |
[Spring Boot] org.springframework.beans.factory.BeanCreationException (2) | 2021.09.03 |
[Spring Boot] To display the conditions report re-run your application with 'debug' enabled (0) | 2021.09.02 |
[JUnit 5] org.junit.platform.launcher.core.EngineDiscoveryOrchestrator (0) | 2021.09.02 |