강의

멘토링

로드맵

Inflearn brand logo image

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

양윤석님의 프로필 이미지
양윤석

작성한 질문수

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

1장. 작전2: 잡 파라미터와 스프링 배치 Scope (파라미터 없는 배치? 그건 그냥 좀비 프로세스나 마찬가지다 ☠️)

JobParameter의 JSON 표기법 명령어 오류

작성

·

149

·

수정됨

1

 

JSON 표기법 실습을 진행중이다. 아래 명령어를 실행하는데, 에러가 난다. json 문자열 속 쌍따옴표를 백슬래시로 이스케이프 하는게 안 먹혀서 그런 것 같다. 견문이 부족하여 스스로 해결 못 하였다. GPT가 알려주는 대로도 해봤지만 따옴표가 문자열에 들어가지 않는다. 문자열이 어떻게 입력되는지는 아래에 있는 에러코드에서 확인 가능하다. 혹시나 답을 알 수 있을까 질문한다.

 

window 환경, 스프링부트 3.5.2, jdk 17이고, 인텔리제이에서 실습중이다.

intellij 로컬 터미널과, git bash등에서 아래 명령어를 실행했으나 실패하였다.

 

 

 

./gradlew bootRun --args="--spring.batch.job.name=terminatorJob infiltrationTargets='{\"value\":\"판교서버실,안산데이터센터\",\"type\":\"java.lang.String\"}'"

./gradlew bootRun --args="--spring.batch.job.name=terminatorJob infiltrationTargets={\"value\":\"판교_서버실,안산_데이터센터\",\"type\":\"java.lang.String\"}"

 

 package com.system.batch.killbatchsystem.JobParameter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.converter.JobParametersConverter;
import org.springframework.batch.core.converter.JsonJobParametersConverter;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@Slf4j
public class SystemTerminatorConfig {
    @Bean
    public Job processTerminatorJob(JobRepository jobRepository, Step terminationStep){
        return new JobBuilder("terminatorJob", jobRepository)
                .start(terminationStep)
                .build();
    }

    @Bean
    public Step terminationStep(JobRepository jobRepository, PlatformTransactionManager transactionManager, Tasklet terminatorTasklet ){
        return new StepBuilder("terminationStep", jobRepository)
                .tasklet(terminatorTasklet, transactionManager)
                .build();
    }

//    @Bean
//    @StepScope
//    public Tasklet terminatorTasklet(@Value("#{jobParameters['terminatorId']}")String terminatorId,
//                                     @Value("#{jobParameters['targetCount']}") Integer targetCount){
//        return (contribution, chunkContext) -> {
//            log.info("시스템 종결자 정보:");
//            log.info("ID: {}", terminatorId);
//            log.info("제거 대상 수: {}", targetCount);
//            log.info("🎇 SYSTEM TERMINATOR {} 작전을 개시합니다", terminatorId);
//            log.info("👻 {}개의 프로세스를 종료합니다.", targetCount);
//
//            for(int i =1; i<=targetCount; i++){
//                log.info("👻 프로세스 {} 종료 완료!", i);
//            }
//
//            log.info("🎯 임무 완료: 모든 대상 프로세스가 종료되었습니다.");
//            return RepeatStatus.FINISHED;
//        };
//    }

    @Bean
    @StepScope
    public Tasklet terminatorTasklet(
            @Value("#{jobParameters['infiltrationTargets']}") String infiltrationTargets
    ) {
        return (contribution, chunkContext) -> {
            String[] targets = infiltrationTargets.split(",");

            log.info("⚡ 침투 작전 개시");
            log.info("첫 번째 타겟: {} 침투 시작", targets[0]);
            log.info("마지막 타겟: {} 에서 집결", targets[1]);
            log.info("🎯 임무 전달 완료");

            return RepeatStatus.FINISHED;
        };
    }

    @Bean
    public JobParametersConverter jobParameterConverter() {
        return new JsonJobParametersConverter();
    }
}


 오류 내용(명령어를 intellij 로컬 터미널에서 실행)

PS C:\Users\Desktop\study\스프링배치\kill-batch-system> ./gradlew bootRun --args="--spring.batch.job.name=terminatorJob infiltrationTargets={\"value\":\"판교서버실,안산데이터센터\",\"type\":\"java.lang.String\"}" 




  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.5.2)

2025-06-23T10:10:06.623+09:00  INFO 36520 --- [kill-batch-system] [           main] c.s.b.k.KillBatchSystemApplication       : Starting KillBatchSystemApplication using Java 17.0.15 with PID 36520 (C:\Users\Bistelligence\Desktop\study\스프링배치\kill-batch-system\build\classes\java\main started by Bistelligence in C:\Users\Bistelligence\Desktop\study\스프링배치\kill-batch-system)
2025-06-23T10:10:06.625+09:00  INFO 36520 --- [kill-batch-system] [           main] c.s.b.k.KillBatchSystemApplication       : No active profile set, falling back to 1 default profile: "default"
2025-06-23T10:10:07.436+09:00  INFO 36520 --- [kill-batch-system] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-06-23T10:10:07.577+09:00  INFO 36520 --- [kill-batch-system] [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:bc0bd0fe-d717-4e43-908b-4ee615d3746b user=SA  
2025-06-23T10:10:07.579+09:00  INFO 36520 --- [kill-batch-system] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2025-06-23T10:10:07.834+09:00  INFO 36520 --- [kill-batch-system] [           main] c.s.b.k.KillBatchSystemApplication       : Started KillBatchSystemApplication in 1.634 seconds (process running for 1.953)
2025-06-23T10:10:07.836+09:00  INFO 36520 --- [kill-batch-system] [           main] o.s.b.a.b.JobLauncherApplicationRunner   : Running default command line with: [infiltrationTargets={\value\:\판교서버실,안산데이터센터\,\type\:\java.lang.String\}]
2025-06-23T10:10:07.884+09:00  INFO 36520 --- [kill-batch-system] [           main] .s.b.a.l.ConditionEvaluationReportLogger : 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-06-23T10:10:07.898+09:00 ERROR 36520 --- [kill-batch-system] [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.batch.core.converter.JobParametersConversionException: Unable to decode job parameter {\value\:\판교서버실,안산데이터센터\,\type\:\java.lang.String\}
        at org.springframework.batch.core.converter.JsonJobParametersConverter.decode(JsonJobParametersConverter.java:121) ~[spring-batch-core-5.2.2.jar:5.2.2]
        at org.springframework.batch.core.converter.DefaultJobParametersConverter.getJob

~~~~
~~~~
Git Bash에서 명령어를 실행할 경우 데이터는 아래처럼 입력되었다.
org.springframework.batch.core.converter.JobParametersConversionException: Unable to decode job parameter {value:판교_서버실,안산_데이터센터,type:java.lang.String}


~~~~

> Task :bootRun FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':bootRun'.
> Process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.15.6-hotspot\bin\java.exe'' finished with non-zero exit value 1

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

BUILD FAILED in 3s


답변 4

1

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

████████████████████████████████████████████████████████████████████████████████
█ ╔══════════════════════════════════════════════════════════════════════════╗ █
█ ║              💀 KILL-9 TACTICAL ANALYSIS TERMINAL 💀                    ║ █
█ ║                    [ WINDOWS QUOTE HELL CONFIRMED ]                     ║ █
█ ╚══════════════════════════════════════════════════════════════════════════╝ █
████████████████████████████████████████████████████████████████████████████████

치직... Windows 쉘 이스케이프 지옥 분석 완료... 치직...

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[WINDOWS QUOTE HELL CONFIRMED]

Gradle이 Windows 쉘에서 실행되면서 이스케이프 처리가 제대로 안 되고 있다. 
우선 IntelliJ → Settings → Tools → Terminal → Shell path를 확인해서 
정확히 어떤 쉘이 사용되는지 확인하라.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[ALTERNATIVE SOLUTIONS TO TEST]
다음과 같은 다양한 방법으로 테스트해보길 바란다.

CMD:
./gradlew bootRun --args="--spring.batch.job.name=terminatorJob infiltrationTargets=\"{\\\"value\\\":\\\"판교_서버실,안산_데이터센터\\\",\\\"type\\\":\\\"java.lang.String\\\"}\""
또는
gradlew bootRun --args="--spring.batch.job.name=terminatorJob infiltrationTargets='{\"value\":\"판교_서버실,안산_데이터센터\",\"type\":\"java.lang.String\"}'"


PowerShell:
./gradlew bootRun --args="--spring.batch.job.name=terminatorJob infiltrationTargets='{`"value`":`"판교_서버실,안산_데이터센터`",`"type`":`"java.lang.String`"}'"



Git Bash: 흠...

이건 Git Bash 자체의 문제라기보단 환경의 문제가 있는 것 같다.
Windows Gradle이 Windows JVM에 파라미터를 전달할 때 추가 이스케이프가 있는 것 아닌가..

위에 제안한 다양한 시도를 Git Bash에서 동일하게 해보길 바란다.

테스트해보고 알려달라, 전사여...

 

 

 

 


1

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

██████████████████████████████████████████████████████████████████████████
█ ╔════════════════════════════════════════════════════════════════════╗ █
█ ║              💀 KILL-9 TACTICAL RESPONSE TERMINAL 💀                ║ █
█ ╚════════════════════════════════════════════════════════════════════╝ █
██████████████████████████████████████████████████████████████████████████

전사여, 분석을 시작한다...

██████████████████████████████████████████████████████████████████████████

1

양윤석님의 프로필 이미지
양윤석
질문자

JSON 이스케이프 문제가 복잡한 양상을 보인다는 사실을 방금 알게 되었다. 이 시스템을 사용하는 것은 나니까 스스로 답을 찾기 위해 최선을 다 해 보겠다. 그래도 에러 코드 링크를 같이 보내겠다.

 

https://github.com/hs-1991317-YoonseokYang/Spring-batch-study/blob/main/intellij-Local_error_log

https://github.com/hs-1991317-YoonseokYang/Spring-batch-study/blob/main/git-bash_error_log

 

1

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


████████████████████████████████████████████████████████████████████
💀 KILL-9 TACTICAL RESPONSE TERMINAL 💀
[ QUERY RECEIVED ]                   
██████████████████████████████████

치직... JSON 표기법 실습 에러 질의 수신... 치직...

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[STATUS UPDATE]
전투 임무 종료 후 저녁 시간에 대응 예정.

JSON 이스케이프 문제는 플랫폼/터미널/쉘 환경에 따라 복잡한 양상을 보인다.
명령어와 에러 코드를 확인한 후 정확한 해결책을 제시하겠다.

퇴근 후 저녁에 답장 예정이다, 전사여. 💀

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[STANDBY MODE ACTIVATED]

██████████████████████████████████
양윤석님의 프로필 이미지
양윤석

작성한 질문수

질문하기