🍃 spring boot-version '2.7.5'
🌎 java-version 11
🐘 gradle
🐬 (DB) MySQL
✍ Spring Batch를 구현하기위해 간단한 테스트 도중 에러를 맞닥뜨렸다
Failed to execute ApplicationRunner 에러 중
▶ Table 'batch.batch_job_instance' doesn't exist
😈 Error
java.lang.IllegalStateException: Failed to execute ApplicationRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:765) ~[spring-boot-2.7.5.jar:2.7.5]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) ~[spring-boot-2.7.5.jar:2.7.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.7.5.jar:2.7.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.5.jar:2.7.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.5.jar:2.7.5]
at com.sparta.finalpj.FinalpjApplication.main(FinalpjApplication.java:23) ~[classes/:na]
Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is java.sql.SQLSyntaxErrorException: Table 'batch.batch_job_instance' doesn't exist
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239) ~[spring-jdbc-5.3.23.jar:5.3.23]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) ~[spring-jdbc-5.3.23.jar:5.3.23]
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) ~[spring-jdbc-5.3.23.jar:5.3.23]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) ~[spring-jdbc-5.3.23.jar:5.3.23]
.
.
(중략)
Caused by: java.sql.SQLSyntaxErrorException: Table 'batch.batch_job_instance' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-j-8.0.31.jar:8.0.31]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.31.jar:8.0.31]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916) ~[mysql-connector-j-8.0.31.jar:8.0.31]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:972) ~[mysql-connector-j-8.0.31.jar:8.0.31]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na]
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:722) ~[spring-jdbc-5.3.23.jar:5.3.23]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) ~[spring-jdbc-5.3.23.jar:5.3.23]
... 42 common frames omitted
📌 8번라인
Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is java.sql.SQLSyntaxErrorException: Table 'batch.batch_job_instance' doesn't exist
📌 16번라인
Caused by: java.sql.SQLSyntaxErrorException: Table 'batch.batch_job_instance' doesn't exist
🔒 원인
음... 에러코드를 전체 다 해석하진 못하겠지만 JDBC에 관련된 오류들이 보이고 Batch실행 도중 배치와 관련된 정보를 저장하기위해 테이블을 생성하는 과정에서 에러가 난 듯 하다!
구글링 해보니 스프링배치는 수행관련 내용들을 메타데이터로 남겨서 테이블에 저장하는데
해당 테이블 스키마를 생성하지 않아서 오류가 생겼다
🔑 해결 방법
💻 application.properties
spring.datasource.url=DB URL
spring.datasource.username=DB name
spring.datasource.password=DB password
# springbatch 정보를 저장하는 테이블들을 생성
spring.batch.jdbc.initialize-schema=always
- 5번라인: spring.batch.jdbc.initialize-schema=always 을 추가
📕 공식문서 참고
⚙ option
🔹 always: 스키마 자동생성 on
🔹 never: 스키마 자동생성 off
Spring Batch를 사용할때 spring.batch.jdbc.initialize-schema=always로 설정하면
Spring Boot는 데이터베이스 유형을 감지하고 시작 시 해당 스크립트를 실행할 수 있다.
즉, batch와 관련된 스키마를 자동으로 생성해 주는 옵션인 것이다.
➕ )
이렇게 설정하라는 블로그들이 많아서 설정해보니 빨간줄...찌익..
찾아보니 spring boot 2.5.0 이상 버전부터 변경되었네요 ㅎ_ㅎ
📕 공식깃헙 참고
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5.0-M2-Configuration-Changelog
서버를 재시작하면 정상적으로 실행이 됩니다
👀 결과
✔ 서버 실행도 잘 된다
✔ DB에도 batch와 관련된 테이블이 잘 생성이 된다!
📖 참고
댓글