Blog

[Spring-LDW] 테스트코드 수정 중 오류해결 could not prepare statement; SQL …

Category
Author
citeFred
citeFred
PinOnMain
1 more property
스프링 부트와 AWS로 혼자 구현하는 웹 서비스  : 인텔리제이, JPA, JUnit 테스트, 그레이들, 소셜 로그인, AWS 인프라로 무중단 배포까지 이동욱 저
테스트 코드 수정 중 오류 발생 원인찾기와 해결
Table of Content

application.properties의 테스트용 설정 문제

교재에서는 CustomOAuth2UserService를 통해 불러오고있는 각종 소셜 로그인 설정값(application-oauth.properties)을 못불러오고 있기 때문에 이 오류를 test 디렉토리에 테스트 환경을 위한 application.properties 모의파일을 만들어 해결하고 있다.
하지만 동일한 파일을 생성 했을 때 아래와 같이 전혀 다른 오류가 발생하고 있다.
could not prepare statement; SQL [insert into posts (created_date, modified_date, author, content, title) values (?, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into posts (created_date, modified_date, author, content, title) values (?, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:259) at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) ...
Java
복사
처음엔 버전의 문제일까? 라는 생각을 했다. 그 이유는 오류 코드에 대한 검색을 통해서는 그레이들과 스프링부트 버전과 관련된 해결안들이 설명된 경우가 많았다. 하지만 다운그레이드 자체에 문제가 있었고 다시 오류 코드를 자세히 살펴 보았다. 결과적으로 오류 문구에서 SQL과 관련된 오류로 결국 데이터베이스와의 문제인 것으로 추려냈다.

TEST용 application.properties

테스트를 위한 application.properties는 다음과 같다.
spring.jpa.show_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.h2.console.enabled=true spring.session.store-type=jdbc # Test OAuth spring.security.oauth2.client.registration.google.client-id=test spring.security.oauth2.client.registration.google.client-secret=test spring.security.oauth2.client.registration.google.scope=profile,email
Java
복사
여기서 추가적인 검색을 통해서 스프링부트 2.3 버전 이후로는 H2 SQL 문법을 MySQL 문법으로 변경한 후 H2 콘솔 사용하기 위해 Datasource를 설정해야 한다. 는 사실을 알게 되었다.
아무래도 프로젝트를 진행하면서 H2를 사용 했을때 이보다 많은 내용이 있었는데 왜 다른 내용은 없는지 궁금했었다. JDBC로 MySQL을 사용할때도 resource.. 로 계정 이름과 비밀번호를 입력하곤 했었다. 이런 설정 없이 데이터베이스를 접근하는 것 자체가 의문이긴했었다.

jdbc의 url 경로 작성을 통한 문제 해결

테스트를 위한 application.properties는 다음과 같다.
그중에 가장 유력한 jdbc의 데이터베이스 경로 자체가 없는 것이 궁금했고 아래 코드를 삽입하여 정상적으로 작동하는 것을 확인했다.
spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb;MODE=MYSQL
Java
복사

설정 관련 추가 내용

데이터베이스 유형을 알려주는 것이 Dialect설정이다.
MySQL5버전, InnoDB 스토리지 엔진을 사용하여 진행한다는 뜻이다.
하지만 이것만 설정한다고 해서 되지는 않는다. H2 DB를 바라보게 설정을 해줘야 한다.
# application.properties spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb;MODE=MYSQL
Plain Text
복사
앞 부분은 jdbc:h2:mem:testdb or jdbc:h2:~/testdb 둘 중 어떤 것을 사용해도 상관없다.
두 가지의 차이점은 이렇다.
jdbc:h2:mem:testdbIn-memory DB다. DB를 연결하고 닫으면 해당 DB는 사라진다. 어플리케이션이 동작할 때에만 존재하는 DB인 것이다.
jdbc:h2:~/dbnameLocal DB다. 직접 로컬에서 홈디렉토리로 가보면 db들이 생성되있는 것을 확인할 수 있다.해당 DB는 저장되며 계속 사용할 수 있다.
테스트에만 사용할 것이니 In-memory방식으로 사용하는 것이 좋아보여서 mem방식으로 진행할 것이다.
뒤에 MODE=MySQL은 MySQL문법을 사용한다는 뜻이다.
Search
 | Main Page | Category |  Tags | About Me | Contact | Portfolio