묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 배치
writer에서 다시 processor 호출 질문 드립니다.
질문 드립니다. processor의 return 형식이<A, B> 일 때 processor에서 A를 받아 B로 가공하여 return 하는데 이 때 B말고 다른 C도 함께 writer로 return이 가능한가요? step을 구성할 때 reader -> processor -> writer 순서인데 writer까지 진행된 이후 write 한 객체로 다시 processor 혹은 reader -> writer 등을 진행하고 싶을 땐 어떻게 해야 할까요? processor에서 조건을 사용하여 reader를 호출 하고 있는데 reader를 bean으로 생성하지 않고 reader.read(); 와 같은 방식으로 호출하는데 이 방식이 옳바른 방식인가요?
-
미해결스프링 배치
안녕하세요. 신규 강의 관련
해당 강의와 관련된 질문은 아니지만 동시성 관련 강의 오픈 메일에 링크가 이쪽으로 연결이 돼서요.11/21~28 오픈 예정이라고 하셨는데 혹시 오픈일정을 알 수 있을까요?
-
미해결스프링 배치
다음과 같은 부분에서 어떤 부분을 먼저 수강하는 게 좋을까요?
안녕하세요. 회사에서 저한테 매일 밤 12시에 20개 사이트에서 각각 1000 ~ 6000개의 데이터를 크롤링 후 해당 데이터 목록을 조회하는 웹 사이트 제작 업무를 맡겨서 진행중입니다. 업무를 시키실 때 스프링 배치를 활용해서 만들라고 하시고, 다른 곳에 출장가셔서 사무실에서 혼자 해당 업무를 완료해야하는 상황입니다ㅠㅠ. 다소 답답한 질문일 수도 있지만 다음과 같은 상황에서 제가 잘못 생각하고 있는 게 있는지, 또 이 상황을 해결하려면 어떤 부분의 강의를 들으면 되는지 여쭙고 싶습니다. 스프링 배치 개념이 익숙치 않기 때문에 스프링 MVC로 먼저 만들어봤습니다. 대신 Insert는 배치쪽에서 해야한다고 생각하여 service단에서 DB에 insert를 하는 dao 메소드를 실행시키지 않고 해당 데이터를 담은 List<VO>를 return 후 controller에서 DB insert하는 쪽으로 생각해봤습니다. 그대로 스프링 배치로 가져오려고 하니 step에서 service를 그냥 실행하고 List<VO>를 받아 DB insert를 하는 dao를 실행하면 되는지 아니면 service에 해당하던 내용을 ItemReader, processor, writer과 같이 스프링 배치에서 사용하는 클래스로 바꿔야 하는건지 잘 모르겠습니다. 또 20개의 서비스를 호출해야 하는데, 1개의 job에서 1개의 step에서 호출하는 게 좋을지, 1개의 job에서 20개의 step을 만드는 게 좋을지 각각 20개의 job을 만드는 게 좋을지 여쭤보고 싶습니다. 감사합니다
-
미해결스프링 배치
PagingQueryProvider에서 join 관련 질문 드립니다.
제 소스코드 공유 드립니다. 위 provider를 실행하면 select 절에 ot.tank_seq가 존재함에도 불구하고 order by 절에서 sortKeys로 설정한 ot.tank_seq를 인식하지 못하는 오류가 발생합니다.제가 검색해본 결과 join절을 사용해서 가져온 필드를 order by 하려면 alias를 붙여 사용하라고 하던데요. 그래서 위 코드처럼 alias를 붙여 실행하면 이와 같은 제가 설정한 적 없는 WHERE 절이 실행되게 되는데 혹시 왜 그럴까요?
-
미해결스프링 배치
Spring Batch Test 강의에서 clear()함수 질문드립니다.
Spring Batch Test 강의를 보면@Afterpublic void clear() 함수를 만들어서 insert한 데이터를 직접 삭제하는데 테스트코드에서 자동으로 트랜잭션 롤백이 안되는건가요?안된다면 할 수 있는 방법은 없나요?
-
해결됨스프링 배치
청크 프로세스 - StepExecution, ItemReadListener 질문
안녕하세요. 강의 수강하며 많은 도움이 되고 있습니다!제가 현재 Spring Batch 로 배치 업무를 개발 중에 있는 데 질문이 있어 문의드립니다. 청크 프로세스를 사용하여 개발하면서 reader, processor, writer 로 구현하였을 때,청크 단위로 데이터를 처리할 때 BATCH_STEP_EXECUTION 테이블에 실시간으로reader 시에는 read_count 가. writer 시에는 write_count 가 청크 단위로 업데이트 되는 걸로 이해하고 있습니다. 문의 드리고자 하는 내용은 ItemReadListener(혹은 이외에 방법)를 통해서 StepExecution 객체를 불러와 readCount, writeCount, commitCount 등을 확인(로깅)하는 방법이 있을지 문의드립니다.즉, 동일 Step 안에서 청크단위마다 reader() 메소드를 반복 수행할 때 StepExecution의 readCount 를 조회가 가능할 지 궁금합니다.
-
해결됨[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
Spring Batch 테이블이 생성되질 않습니다!!!!!
안녕하세요 강사님. 우선 강의 잘 들었다고 말씀드리고싶습니다.다름이 아니라, 프로젝트에 스프링 배치를 적용시켜보려합니다.아.. 근데 애플리케이션을 실행하면 기본으로 생성되는 배치 테이블이 생성되질 않습니다. (로컬에서는 h2 사용중입니다.) 현재로서는 임시방편으로 BatchProperties 에 나와있는대로 schema-h2.sql 내용을 복사해서 애플리케이션 구동 후, sql console 에 붙여넣기하여 배치 테이블을 직접 만들어주고있습니다. (이렇게 하면 배치랑 스케줄링이 정상적으로 잘 동작합니다.)현재 yml 은 아래와 같습니다. profile 에 따라 yml 을 분리시켜주었긴 했는데, 포맷은 똑같습니다!(defer-datasource-initialization 와 sql-init-mode 과 관련있나해서 이것도 바꿔보았는데.. 되질 않습니다ㅠㅠ)spring: profiles: active: local jpa: open-in-view: false hibernate: ddl-auto: create defer-datasource-initialization: true properties: hibernate: format_sql: true default_batch_fetch_size: 100 data: web: pageable: one-indexed-parameters: true datasource: url: jdbc:h2:tcp://localhost/~/apartribe;MODE=MySQL username: sa password: driver-class-name: org.h2.Driver sql: init: mode: always mail: host: smtp.gmail.com port: 587 username: EMAIL password: PASSWORD properties: mail: smtp: auth: true starttls: enable: true ssl: trust: "*" security: oauth2: client: registration: kakao: client-name: KOAuth2LoginDemo client-id: KAKAO_CLINET_ID client-secret: KAKAO_CLINET_SECRET client-authentication-method: client_secret_post redirect-uri: http://localhost:8080/login/oauth2/code/kakao authorization-grant-type: authorization_code scope: profile_nickname, profile_image, account_email, age_range, birthyear provider: kakao: authorization-uri: https://kauth.kakao.com/oauth/authorize token-uri: https://kauth.kakao.com/oauth/token user-info-uri: https://kapi.kakao.com/v1/oidc/userinfo user-name-attribute: sub batch: jdbc: initialize-schema: always job: enabled: false application: security: jwt: secret-key: ACCESS_TOKEN_SECRET_KEY expiration: ACCESS_TOKEN_EXPIRATION refresh-token: secret-key: REFRESH_TOKEN_SECRET_KEY expiration: REFRESH_TOKEN_EXPIRATION mail: subject: MAIL_SUBJECT logging: level: sql: debug cloud: aws: s3: bucket: AWS_BUCKET_NAME credentials: access-key: AWS_ACCESS_KEY secret-key: AWS_SECRET_KEY region: static: ap-northeast-2 auto: false stack: auto: false server: error: whitelabel: enabled: false include-exception: false include-message: never include-stacktrace: never include-binding-errors: never 프로젝트 주소는 아래와 같습니다.https://github.com/Revi1337/apartribe-backend Batch 와 Scheduling 설정의 위치는 아래와 같습니다src/main/java/kr/apartribebackend/global/config/BatchConfig.java 와src/main/java/kr/apartribebackend/global/config/SchedulingConfig.java 조언좀 부탁드리겠습니다 선생님..ㅠㅠ
-
미해결스프링 배치
processor 분기 처리
안녕하세요 강의 도움이 많이되고 있어 감사말씀드립니다.제가 FCM을 사용한 그룹 알림 발송 배치 API 를 개발 중에 있습니다. processor 에서 그룹에 속한 알림에 대해서 fcm 전송을 하는데 trcy catch 로성공일 경우 알림성공 업데이트를 위한 객체를 생성하고실패일 경우 알림실패 업데이트를 위한 객체 따로따로 생성하고 있습니다.그 다음으로 writer 로 던집니다. 문제는 stepListener 에서 총 몇개에서 총 몇건 전송했고, 성공, 실패 로깅하는 방법을 모르겠습니다.또 stepListener 에서 모두 다 실패했으면 알림 그룹의 상태 값을 전송 실패 그 외 성공으로 변경하는 로직이 있습니다. 추가 +일단 StepSynchronizationManager 를 사용해서 ExecutionContext 에 저장해서 stepListener 에서 아래와 같이 사용하고 있습니다. 올바르게 사용한건지 궁금합니다.int successCount = stepExecution.getExecutionContext().getInt("successCount", 0); int failureCount = stepExecution.getExecutionContext().getInt("failureCount", 0);
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
db이관시 sql 스크립트 데이터 복붙하라고 하시는데 파일은 어디에 있나요 ?
db이관시 sql 스크립트 데이터 복붙하라고 하시는데 파일은 어디에 있나요 ?
-
미해결스프링 배치
DB - JdbcCursorItemReader 강의 질문
DB - JdbcCursorItemReader 강의에서fetchSize(int chunkSize) API는 정확히 어떤걸 의미하나요?일반적으로 JDBC 프로그래밍에서 fetchSize는 어플리케이션과 DB 사이의 round trip 횟수에 영향을 주는 파라미터로 알고 있습니다. 예를 들어, 테이블에 100rows가 있고 fetchSize가 10이면 어플리케이션은 DB와 10번 데이터를 송수신하는 것으로 알고 있습니다.fetchSize(int chunkSize) API는 제가 알고 있는 fetchSize를 설정하는 API가 맞나요..?
-
미해결스프링 배치
Transition - on() / to() / stop(), fail(), end(), stopAndRestart() 강의 질문입니다.
Transition - on() / to() / stop(), fail(), end(), stopAndRestart() 강의 질문입니다. 강의 31분 35초 강의교안 아래쪽에 Step1()의 ExitStatus에 따라서 메타 테이블의 상태를 비교하는 내용이 있는데요.왼쪽, Step1()에서 ExitStatus를 FAILED로 세팅하면, batch status는 ABANDONED가되는데요.오른쪽, Step4()에서 (코드는 없지만) ExitStatus를 FAILED로 세팅했을 때는 batch status가 FAILED로 나와있는데. 정확히 batch status가 ABANDONED과 FAILED로 세팅되는 차이점은 무엇인가요?(강의를 듣는 도중에 작성하는 질문이라서...다른 강의에서 나오는 주제면 알려주시면 계속 강의를 보도록 하곘습니다.)
-
미해결스프링 배치
FlowJob - 개념 및 API 소개 강의 질문
FlowJob - 개념 및 API 소개 강의 질문드립니다.Step1이 실패했을 경우 Step2를 실행하도록 한 것은 이해했습니다.Step1을 실패시키더라도 Step2까지 실행이되며 Job도 COMPLETED 상태인 것 도 이해했습니다.근데 여기서, 똑같은 JOB을 실행하면 Job Instance가 이미 존재한다는 예외가 아닌 Step already complete or not restartable, so no action to execute: 이라는 메시지가 나오는데요. 이제까지 알기론 Job Execution이 실패한 경우에만 같은 job 파라미터로 실행할 수 있는 걸로 알고 있는데요.FlowJob의 경우는, Job Execution이 COMPLETED 상태여도 StepExecution까지 확인하는건가요?
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
Spring Batch5로 강의내용 최신화 업데이트될 가능성이 있을까요?
안녕하세요 혹시 Spring Batch5점대 최신버전으로 강의내용 업데이트 계획이 있을까요?
-
미해결스프링 배치
스프링 배치 청크 프로세스 - 아키텍처 문의
Chunk Process 아키텍처 챕터를 보고 있는데요. 아키텍처 그림에서 ItemReader가 읽은 item이 null 일 경우,모든 반복문 및 Chunk 프로세스를 종료한다고 되어 있는데ItemProcessor, ItemWriter 처리 이후에 Chunk 프로세스가 종료되는게 맞지 않나요?( 설명만 봐서는 read에서 null 리턴시 바로 Step이 종료되는 것 처럼 이해가 됩니다. )예를 들어 11개의 아이템이 있고 Chunk 사이즈가 5이면,Chunk가 총 3개로 처리가 되고, 각 Chunk의 사이즈는 5, 5, 1 로 3번의 트랜잭션 처리가 처리되고 난 뒤에 Chunk 프로세스가 종료가 되니까요.
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
reader, writer, processor에서 적용
tasklet이 아닌 chunk 단위에서 step 간에 데이터 공유를 하고 싶다면 어떤 식으로 코드를 짜야 할까요 ?찾아보니 방법이 달라서 적용이 힘든데 궁금합니다..
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
똑같이 실행하는데 출력이 안돼요
@Configuration @RequiredArgsConstructor @Slf4j public class HelloWorldJdbcConfig { private final JobBuilderFactory jobBuilderFactory; //이걸 통해 JOb을 생성 private final StepBuilderFactory stepBuilderFactory; //Step 생성을 위해 /** * 두 객체를 활용하여 Job과 Step을 생성할꺼야 Job은 JobBuilderFactory로 만들고 Step은 StepBuilderFactory로 만들자. */ @Bean public Job helloWorldJob() { Job helloWorldJob = jobBuilderFactory.get("helloWorldJob") //이름을 정해주고 .incrementer(new RunIdIncrementer()) //Job을 실행할 때 id를 부여하는데, Sequence를 순차적으로 부여할 수 있도록 RunIdIncrementer를 해주자. .start(helloWorldStep()) //Job안에는 Step이 존재해야해. .build(); return helloWorldJob; } @JobScope @Bean public Step helloWorldStep() { TaskletStep helloWorldStep = stepBuilderFactory.get("helloWorldStep") //역시 똑같이 get을 통해 이름 명시 .tasklet(helloWorldTasklet()) //일단 간단하게 taskLet으로 해보자. .build(); return helloWorldStep; } @StepScope //step 하위에서 실행되기 때문에 @StepScope를 등록하자. @Bean public Tasklet helloWorldTasklet() { //Tasklet은 그냥 만들면 돼 Tasklet tasklet = new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { //내가 원하는 작업 부분 System.out.println("Hello World Spring Batch"); log.info("asdasdasd"); log.info("batch start!!"); //원하는 작업이 끝난 이후 어떻게 할 것인가 ?에 대한 Status를 명시해야함. return RepeatStatus.FINISHED; // FINISHED를 명시함으로써 이 Step을 끝낸다는 뜻. } }; return tasklet; } /** * 위 과정을 모두 다 했다면 * HelloWorld를 보기 위한 하나의 Job이 완성이 된 것이다 ! * 스프링을 실행해서 출력이 되는지 확인하자 !! * Job을 실행시킬 때는 properties에서 설정한 batch.job.names를 파라미터로 넘겨주어야 Job이 실행이 된다. * 위에서 Job 이름은 helloWorldJob이기 때문에 파라미터로 넣어주자 ! *Edit Configurations > Program Parameters에 --spring.batch.job.names=helloWorldJob을 넣어주자. * 그러고 실행하면 돼 ! */ /** * 또한 Job을 실행할 때는 * apllication.properties에 설정한 * spring.batch.job.names에 파라미터로 넘겨주어야 job이 실행이 된다. * --spring.batch.job.names={이름} 이런 식으로 넘겨줘야해 * 내가 현재 설정한 job의 이름은 helloWorldJob이기 때문에 해당 값을 넣어서 파라미터 등록하자. */ }위 코드를 작성한 후에 main에서 @EnableBatchProcessing 어노테이션을 추가해주고 실행하였습니다.또한 application.properties에 spring.batch.job.names=${job.name:NONE}넣어준 후 parameter 까지 제대로 넣어주었는데 실행하면 해당 출력문이 나오지 않습니다.. 뭐가 문제인지 몰라서 질문드립니다.. !
-
해결됨스프링 배치
chunkSize 질문입니다.
안녕하세요. 좋은 강의 감사드립니다 :) 예시에서 ListItemReader 를 통해 5개의 아이템을 주고 있는데요, chunkSize 가 3개라면 아이템을 2,2,1 로 나눠 처리하게 되는걸까요?
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
스케줄러에서 Job을 구분하지 못합니다.
강의 잘 들었습니다!마지막 강의 실행 부분에서 문제가 생겼는데요작성하신 코드와 똑같이 진행했음에도 실행 시"Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed"라는 에러가 나버립니다.제 생각엔 만들어둔 Job이 7개라어떤 Job을 실행시켜야할 지 정하지 못해 나는|에러처럼 보입니다.예상컨데 helloWorldJob이 HelloWorldJobConfig 클래스에서 만든 잡의이름이라고 보는데, 저도 똑같이 했는데왜 이런 에러가 날까요?@Qualifier("helloWorldJob")private final Job helloWorldJob;를 사용해봐도 여전히 에러가 납니다.
-
해결됨스프링 배치
spring batch 5 업데이트
이번 메이저 릴리즈에 대한 내용이 강의에 추가될 계획이 있는지 궁금합니다!
-
미해결스프링 배치
Spring Batch Plugin 설치 관련 질문
Spring Batch Plugin 설치 이유가 궁금합니다.설치하지 않았을 경우 이 부분에서 빨간 줄이 나타나며 Bean을 찾을 수 없다는 에러를 나타냅니다.플러그인을 통해서 빈을 생성하게 된다면 jar로 압축하여 실행하더라도 빈이 생성되지 않아야 되는게 맞다고 생각하지만, 그렇지는 않은걸로 알고 있습니다.또한 jar로 실행하게 되면 잘 실행이 될텐데 그럼 인텔리제이에서도 플러그인 없이 에러가 뜨면 안되지 않나 라는 생각이 들어 질문하게 되었습니다.