강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

ang11585님의 프로필 이미지
ang11585

작성한 질문수

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

대량 학살이 시작된다... 데이터베이스 심판의 시작 💀

메타테이블에 데이터가 생기지 않는 이유

작성

·

38

·

수정됨

1

킬구형 내가 그동안 보면서 정리한내용으로, 실습을 진행해보려고 혼자 스스로 파일을 만들었어.

 

실습 환경은 h2 데이터 베이스로 테스트 했고,

메타테이블은 자동으로 만들어졌어.

 

간단한 스텝과 잡을 만들어서 콘솔에서 잘 실행되는것 까지는 확인을 했는데

 

실제 데이터 베이스 테이블인 batch_job_instance와 같은 테이블에는 데이터가 들어가지 않아.

 

혹시 몰라서 db url도 확인해봤는데 정확하게 일치하고..

 

이런경우는 어디를 확인해보면 제일 좋을까..?

 

콘솔에서 에러도 나지 않고 정상적으로 배치가 실행돼서 답답해 미치겠어 ㅠㅠㅠ

콘솔에서 insert 쿼리는 안나가고 있는데, 쿼리가 왜 안나가는지를 도통 모르겠어 ㅠㅠ

 

다 잘되는데 메타테이블에만 데이터가 들어가지 않네..

 

참고로 tasklet 방식으로 테스트 해봤어.

부트 4.0.1 버전 사용하고 있어

 

 킬구형 강의자료 에서도 중간에 postgresql로 전환하던데 혹시 h2는 뭔가 지원을 하지 않는걸까?

답변 2

1

KILL-9님의 프로필 이미지
KILL-9
지식공유자

반갑다 ang형

부트4 배치6??

build.gradle에 단서가있을것같다

파일 내용좀 전달달라 💀💀
ang11585님의 프로필 이미지
ang11585
질문자

plugins {
    id 'java'
    id 'org.springframework.boot' version '4.0.1'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.batch'
version = '0.0.1-SNAPSHOT'
description = 'Demo project for Spring Boot'

java {
    toolchain {
       languageVersion = JavaLanguageVersion.of(17)
    }
}

configurations {
    compileOnly {
       extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-h2console'
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-webmvc'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-batch-test'
    testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa-test'
    testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}

부트 4 배치는 6버전 사용하고있어!

KILL-9님의 프로필 이미지
KILL-9
지식공유자

굿굿 starter-batch말고 starter-batch-jdbc를
사용하도록 💀

자세한 내용은 배치6강의 5장을 참고하라
KILL-9님의 프로필 이미지
KILL-9
지식공유자

FYI. ResourcelessJobRepository / JdbcDefaultBatchConfiguration

0

안녕하세요, 인프런 AI 인턴입니다.

ang11585님께서 H2 데이터베이스를 사용하여 Spring Batch를 테스트하시는 중에 메타 테이블에 데이터가 들어가지 않는 문제가 발생한 것 같습니다. 배치가 정상적으로 실행되지만 메타 테이블이 업데이트되지 않는 부분은 다소 특이한 상황일 수 있습니다. 아래에 몇 가지 확인해볼 사항을 안내드립니다.

확인해야 할 사항

  1. 트랜잭션 설정 확인:

    • Batch 작업이 트랜잭션에서 커밋되기 전에 종료되거나 트랜잭션 관리가 잘못 설정되면 데이터가 메타 테이블에 반영되지 않을 수 있습니다. @Transactional이나 트랜잭션 전파 옵션이 제대로 설정되어 있는지 확인하세요.
  2. JobRepository 설정:

    • Spring Batch가 사용하는 JobRepository 설정을 확인하세요. 저장소가 올바르게 구성되지 않았을 경우 메타데이터가 저장되지 않을 수 있습니다. 인메모리 데이터베이스를 사용할 때도 URL, 사용자명, 비밀번호가 정확한지 확인하세요.
  3. 잘못된 Console output 확인:

    • 배치 실행 로그에서 SQL 디버그 레벨(LOG_LEVEL_SQL)로 설정하고, 실제 수행된 쿼리를 확인해보세요. 데이터베이스로 명확한 쿼리가 전달되고 있는지 확인이 필요합니다.
  4. H2 데이터베이스의 in-memory 특성:

    • H2 데이터베이스를 인-메모리로 사용하고 있을 수 있습니다. 이 경우 애플리케이션 종료시 데이터가 유지되지 않는 특징이 있습니다. 데이터베이스 URL이 jdbc:h2:mem:test와 같은 형태가 아니라 jdbc:h2:~/test처럼 파일로 저장되도록 설정했는지 확인하세요.
  5. Tasklet의 완결성:

    • Tasklet이 정상적으로 종료(정상적인 리턴 상태가 포함되어 있는지)되었는지 확인해 보세요. 만약 RepeatStatus.FINISHED로 리턴되지 않았거나 예외를 처리하고 다시 던지지 않았다면 상태가 반영되지 않을 수 있습니다.

참고 자료

유사한 문제가 다루어진 내용을 포함한 문서나 토론은 다음 URL에서도 확인할 수 있습니다:
- Spring Batch job 도중 메타데이터 저장 이슈 관련 토론

질문자님의 문제 해결에 도움이 되기를 바라며, 추가적인 질문이 있으시면 언제든지 다시 문의해 주세요. 곧 지식공유자님께서 함께 도움을 주실 것입니다. 참고로 이는 베타 기능이며 답변이 완벽하지 않을 수 있는 점 양해 부탁드립니다. 🙏

ang11585님의 프로필 이미지
ang11585

작성한 질문수

질문하기