월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 배치
@Autowired 관련 질문입니다.
@Autowired private Job fileJob; @Autowired private Job apiJob;각각 다른 클래스에서 주입받아야하는 Job이 다른데 변수 명으로 스프링이 알아서 알맞은 Job을 주입해주는것인가요?
- 미해결스프링 배치
branch Part11 관련질문입니다.
안녕하세요 정수원 선생님 브랜치 Part11에 관해 동작문의가 2개 있습니다.1) SendJobConfiguration에서 apiJob이 제일 먼저 실행이 되는 job이고apiJob에서 apiStep1 (시작로그를 남기는) , apiStep2(끝냈다는 로그를 남기는) 사이에 주입받은 jobStep을 실행시키는데 이 jobStep은 SendChildJobConfiguration에 있는 jobStep 인가요? 2) 이후에 jobStep에서 apiMasterStep을 실행시키고 Partition으로 쪼개서 3개의 스레드에 할당할때는 apiSlaveStep에서 read부터 각 스레드가 담당하는것이 맞나요?
- 해결됨스프링 배치
이클립스에서 아무리 Application을 실행해도 잡이 실행이 안됩니다.
구글링도 많이해보고 질문 게시판도 많이 뒤져봤는데, 강사님이 작성해주신 그대로 Job을 작성했지만, Application 을 실행하면 그냥Started SpringBatchApplication in 1.373 seconds (process running for 2.321)이 실행되었다고만 뜨고 Job은 돌지 않습니다 ........ 따로 설정해주어야 하는 것이 있나요? Application 파일 위에 @EnableBatchProcessing 도 다 붙여놓은 것 확인하였습니다 제 코드는 여기 있습니다.https://github.com/SMJin/Spring-batch
- 해결됨스프링 배치
트랜잭션 경계 와 트랜잭션 begin에 대한 구분
안녕하세요 정수원 선생님 질문이 2개 있습니다.1) "Chunk Process 아키텍처" 첫번째 사진 설명부분 4:26쯤에 트랜잭션 경계와 실제 트랜잭션 begin을 구분하셨는데 이것이 무슨 차이인가요?아니면 어떻게 받아들여야하는것인가요? 2) 또한 코드를 디버깅 걸어서 따라가보니 TaskletStep#doInChunkContext 에서 new TransactionTemplate.execute() 에서 매 chunk마다 트랜잭션이 시작되는것은 확인하였는데 그림에 나온것 처럼 SImpleChunkProvider 다음과정에서 Transaction 시작하는곳을 찾지 못하겠습니다...
- 해결됨스프링 배치
JdbcBatchItemWriter Query
안녕하세요 선생님!JdbcBatchItemWriter 에서 발생하는 Query 가batch query 로 나가지 않는 것 같아서 질문 드립니다! 혹시 jdbc 에서 batch query 로 보내더라도 optimizer 에 의해단일쿼리로 변경되어서 나갈수도 있나요?! 감사합니다. 위 사진은 MySQL 의 Query Log 입니다. 제 설정은 아래와 같습니다@Configuration class HelloJobConfiguration( private val jobBuilderFactory: JobBuilderFactory, private val stepBuilderFactory: StepBuilderFactory, private val dataSource: DataSource, ) { @Bean fun job(): Job { return jobBuilderFactory.get("job") .incrementer(RunIdIncrementer()) .start(step1()) .build() } @Bean fun step1(): Step { return stepBuilderFactory.get("step1") .chunk<Customer, Customer>(5) .reader(customItemReader()) .writer(customItemWriter()) .build() } @Bean fun customItemReader(): ItemReader<Customer> { return JdbcPagingItemReaderBuilder<Customer>() .name("jdbcPagingItemReader") .dataSource(dataSource) .pageSize(5) .rowMapper(BeanPropertyRowMapper(Customer::class.java)) .queryProvider(queryProvider()) .build() } @Bean fun queryProvider(): PagingQueryProvider { return SqlPagingQueryProviderFactoryBean().apply { setDataSource(dataSource) setSelectClause("SELECT id, firstName, lastName, birthdate") setFromClause("FROM customer") setSortKeys(mapOf("id" to Order.ASCENDING)) }.`object` } @Bean fun customItemWriter(): ItemWriter<Customer> { return JdbcBatchItemWriterBuilder<Customer>() .dataSource(dataSource) .sql("INSERT INTO customer2 values(:id, :firstName, :lastName, :birthdate);") .beanMapped() .build() } }
- 해결됨스프링 배치
cursor 동작원리
안녕하세요 선생님.https://www.inflearn.com/questions/341918 좋은 강의 잘 듣고있습니다! 감사합니다. 안녕하세요 선생님.비슷한 고민을 하다가 이 질문을 찾아오게 되었는데요,예를들어 1000 건의 데이터가 있고, 100건씩 데이터를 처리하려고 하더라도실제로 SQL 자체는 단 한번 실행되고,데이터베이스 서버에서 해당 resultSet 을 가지고있으면서cursor 를 batch application 으로 반환하고,cursor 를 통해서 필요시 DB server 에 실제 데이터를 요청한다고 이해했습니다. (그리고 받은걸 메모리에 올려서 작업) 그러면 결국 DB 서버에서는 그 많은 데이터를 전부 메모리에 올려놓고 batch 작업이 종료될 때까지 유지해야한다고 이해했는데, 혹시 제가 이해한게 맞나요?!
- 미해결스프링 배치
ItemStream의 open 메서드 관련 궁금합니다
안녕하세요 강사님~먼저 질좋은 강의를 만들어주셔서 감사합니다 :)ItemStream 관련 궁금증이 생겨 질문드리게 되었는데요!public void open(ExecutionContext executionContext)위 메서드의 ExecutionContext 는 Step의 ExecutionContext 로 이해했습니다.그런데 Step 중간에 오류가 발생할 경우. 전체 Job이 실패하고.JobExecution & JobExecutionContext 가 새로 생성되며, 해당 Step의 StepExecution & StepExecutionContext 또한 새로 생성되어. 재시작전의 StepExecutionContext 에 저장해둔 index 는 꺼내어 사용 못하는게 아닌가요..?!재시작 후에 ExecutionContext 에서 index를 가져올 수 있는 부분이 헷갈립니다ㅜ추가로 index 예제는 ItemStream 통한 복구대비를 해두어. 재시작시 오류가 발생한 Chunk의 item부터 이어서 처리할 수 있었는데요.ItemStream 없이 ItemReader 만 사용할 경우는 트랜잭션 커밋되어 반영된 Chunk 가 있어도 무시하고 처음 Chunk 부터 다시 작업을 하게되는걸까요?
- 해결됨스프링 배치
job execution에 stopped status가 안나타납니다.
안녕하세요 정수원 선생님 현재 Part.4.3.1.3.3 branch에서 mysql db로 실행시켰을때step execution 에서 step1,step2 의 batch status는 각각 completed 이고exit code는 각각 Failed , Pass인 상태입니다. 하지만 job execution에는 status , exitcode 둘다 모두 failed 인상태입니다. 왜 job execution이 stopped로 안나타는지 알 수 있을까요? addDanglingEndStates 에서 끝나는 시점에 transitions에 2개가 추가 되어서 그런것일까요? 4를 타야할 것같은데 뭔가 5를 타는것같습니다.5,6은 StepState:name=[batchJob.step1] 시점에서 !hasFail 분기를 타고 추가된것입니다.
- 미해결스프링 배치
optionalKeys, requiredKeys
안녕하세요 20:00 부분입니다 옵셔널 키는 없어도 된다고 앞에서 해주셨는데왜 체크를 하는건가요 ?!
- 해결됨스프링 배치
Child Job 2번실행되는것에 관한 질문입니다.
안녕하세요 정수원 선생님저도 2번 실행되서 디버깅 해보니 ChildJob까지 @Bean으로 등록하면 JobLauncherApplicationRunner#executeLocalJobs에 ParentJob, ChildJob 이렇게 2개가 등록이 됩니다.그래서 ParentJob 실행할때 child 한번또 다시 child 실행총 2번이 진행된것을 확인 할 수 있었습니다. ChildJob을 @Bean등록을 해제하면 되는데 보통 이렇게 사용하는것이 맞나요?
- 미해결스프링 배치
spring batch 트랜잭션 질문입니다.
아래 설명해주신것처럼 스프링배치에서 외부에서 @Transactional 을 쓰는것을 허용하지 않는다는것을 확인했습니다.https://brunch.co.kr/@anonymdevoo/50여기를보고 semaphore.acquire를 하고 외부 트랜잭션이 끝나지 않아서 afterCompletion에서 해당 semaphore.release를 호출하지 못한다는것을 확인하였습니다.하지만 아래처럼@RequiredArgsConstructor @Configuration public class TaskletStepConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) .start(taskStep()) .next(chunkStep()) .build(); } @Bean @Transactional public Step taskStep() { return stepBuilderFactory.get("taskStep") .tasklet((contribution, chunkContext) -> { System.out.println("step1 has executed"); return RepeatStatus.FINISHED; }) .build(); } @Bean @Transactional public Step chunkStep() { return stepBuilderFactory.get("chunkStep") .<String, String>chunk(3) .reader(new ListItemReader(Arrays.asList("item1","item2","item3"))) .processor(new ItemProcessor<String, String>() { @Override public String process(String item) throws Exception { return item.toUpperCase(); } }) .writer(list -> { list.forEach(item -> System.out.println(item)); }) .build(); } } @Transactional을 걸어도 잘 동작하는데 제가 놓친 부분이있을까요?디버깅을 거며 확인했는데도 잘 모르겠습니다..브랜치는 4.2.4.1입니다.
- 미해결스프링 배치
스키마설정
안녕하세요 강의 초반이지만 대박강의네요 질문이 하나 있습니다배치 설정중에 initialize-schema: never네버라는 설정은 누가 실수로 스키마를 사용할까봐안전 장치용으로 만들어진건가요??(개인적인 생각입니다)
- 미해결스프링 배치
스프링배치와 쿼츠의 연동 질문
안녕하세요, 실무에서 스프링배치를 처음 접하게 되어 알아보던 중 강사님의 강의가 신뢰할 수 있다고 생각되어 신청하였어요. 너무 잘 듣고 있습니다! 다만 강의를 듣다 추가적으로 궁금한 사항이 생겨서 여기저기 찾아보았는데 해결 방법을 찾지 못해 질문을 남깁니다실전예제를 따라하는 과정에서 quartz와 함께 스케줄링을 하는 부분을 보았는데, quartz의 경우 spring batch처럼 메타데이터를 테이블에서 관리할 수 있도록 하는 기능이 있어 해당 설정을 추가하였습니다.spring: quartz: job-store-type: jdbc이렇게 했을 경우 quartz 테이블에 자동으로 JobDetail 및 Trigger 등의 정보가 insert 되어야 할 것 같은데 안 되더라구요, 또한 기존에 작동하던 spring batch의 job이 실행이 되지 않습니다.quartz와 더 관련있는 부분이라 강의 내용과 조금 다른 부분일 거라는 생각에 질문이 조심스러웠지만 해결하고 싶은 마음에 이곳에 글을 남깁니다!
- 미해결스프링 배치
adapter
외부 서비스 호출을 하려면adapter를 사용해야 하는지요?맞다면 청크와 태스크릿 모두 사용이 가능한지와예제 소스 브랜치명 부탁드립니다.
- 미해결스프링 배치
5.0 버전으로 마이그레이션
기존에 하던 프로젝트의 스프링 버전이 3.0.0이라 배치의 버전 또한 5.0을 사용하게 됐습니다. excute 메소드가 실행되지 않는 이유를 알 수 있을까요..??package com.jojoldu.book.freelecspringbootwebservice.config; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.scope.context.ChunkContext; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableBatchProcessing @RequiredArgsConstructor public class HelloJobConfiguration extends DefaultBatchConfiguration { @Bean public Job myJob(JobRepository jobRepository, Step myStep1, Step myStep2) { System.out.println("this is job"); return new JobBuilder("myJob", jobRepository) .start(myStep1) .next(myStep2) .build(); } @Bean public Step myStep1(JobRepository jobRepository) { System.out.println("this is step1"); return new StepBuilder("myStep1", jobRepository) .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("step1 started"); return RepeatStatus.FINISHED; } }, getTransactionManager()) .build(); } @Bean public Step myStep2(JobRepository jobRepository) { System.out.println("this is step2"); return new StepBuilder("myStep2", jobRepository) .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("step2 started"); return RepeatStatus.FINISHED; } }, getTransactionManager()) .build(); } }
- 미해결스프링 배치
전역변수질문
전역 변수가 리더에서만 리스너 참조하니까 읽히고 프로세서와 라이터에선 안 읽힙니다. 왜 그런걸까요
- 미해결스프링 배치
자료공유 질문
ppt자료는 공유 해도 무방한가요?
- 미해결스프링 배치
Multi-threaded과 Partitioning의 차이가 있나요?
Multi-threaded에다가 각 스레드가 담당할 데이터를 구분시켜주는 기능이 포함된게 Partitioning인가요??단지 차이점이 이렇게만 느껴집니다
- 미해결스프링 배치
AsyncItemReader
AsyncItemReader는 없는 이유가 있나요?읽는거도 비동기처리하면 그만큼 또 메인스레드를 다른용도로 활용할 수 있으니까요
- 미해결스프링 배치
소스코드질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 배포해주신 git에 수업하신 모든 코드가 없고 기본 코드만 있는것 같네요 수업의 모든 코드는 어디서 받나요?