작성
·
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 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 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 TACTICAL RESPONSE TERMINAL 💀
[ QUERY RECEIVED ]
██████████████████████████████████
치직... JSON 표기법 실습 에러 질의 수신... 치직...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[STATUS UPDATE]
전투 임무 종료 후 저녁 시간에 대응 예정.
JSON 이스케이프 문제는 플랫폼/터미널/쉘 환경에 따라 복잡한 양상을 보인다.
명령어와 에러 코드를 확인한 후 정확한 해결책을 제시하겠다.
퇴근 후 저녁에 답장 예정이다, 전사여. 💀
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[STANDBY MODE ACTIVATED]
██████████████████████████████████