본문 바로가기
🛠 BackEnd/Spring

[ Spring ] Table 'batch.batch_job_instance' doesn't exist / 에러 해결방법 (SpringBoot 2.5 이상)

by 깸뽀 2022. 11. 30.
728x90
🍃   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 을 추가

 

 

 

📕 공식문서 참고

https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/#howto-initialize-a-spring-batch-database

⚙ 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와 관련된 테이블이 잘 생성이 된다!

 

 

📖 참고

728x90

댓글