묻고 답해요
135만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 배치
chunk 처리 기반에서 cursor 방식과 메모리 사용
안녕하세요. 비전공자로 배치 프로그램에 관심이 많아서 해당 강의를 듣다가 커서 방식과 페이징 방식을 스프링 배치에서 사용할 때 고려사항과 관련하여 질문이 있습니다. 커서가 페이징 방법에 비해 데이터 일관성이 보장이 쉽고 속도도 더 빠른 것으로 알고 있습니다. 그리고 청크 기반 배치 처리 로직으로 구현한다면, 커서 기법을 사용하는 경우에도 페이징 방법처럼 트랜잭션 단위를 청크 크기만큼 나눌 수 있을 텐데요.(페이징에서 chunk와 paging 단위를 같이 하는 것처럼 커서에서도 chunk와 fetchsize를 같게 해주면 될 것으로 고려합니다.)그리고 멀티 스레드를 고려한다면,SynchronizedItemStreamReader로 reader 영역을 감싸서 처리할 수도 있는 걸로 알고 있습니다. 그렇다면, 이러한 상황 속에서 커서와 페이징을 사용함에 고려해야할 트레이프 오프가 커넥션 타임 뿐인 걸까요??이런 상황에서도 커서가 메모리 할당 방식으로 인해서 메모리 사용량이 커진다는 단점이 있는 건가요??( 더 정확하게 말하자면 결과를 메모리에 할당한다는 점이 명확히 와닿지 않습니다.제 나름 추론하자면,커서가 fetch size나 chunk로 전체 데이터를 분할하여 메모리에 올리고 읽고나서도 모든 결과값이 메모리에 쌓여 한번에 write(ex- db에 저장) 되기 때문에 메모리 사용량이 많아 진다는 것인가여??반면에, 페이징은 기반 처리는 페이징 단위로 데이터를 읽고 읽은 데이터 크기를 처리 후 메모리에 올리고 write한 후에 다시 정해진 크기 만큼 읽는 방식인건가요??즉, 이것이 커넥션을 맺고 끊는 것 방식과 관련이 깊은 것인지 궁금합니다.)이상 cs적인 지식이 부족한 비전공자의 긴 질문을 읽어주셔서 감사합니다.
-
미해결스프링 배치
스프링 배치 5 변경점 정리
5버전으로 강의 따라가면서 정리하고 있습니다(현재진행중). 공유하고자 올려봅니다.혹여나 틀린점 있으면 지적해주세용.Execution context serialization Updateshttps://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-GuideExecutionContext에 Base64로 인코딩된 데이터가 저장됩니다.@Configuration public class BatchConfig { @Bean public ExecutionContextSerializer jacksonSerializer() { return new Jackson2ExecutionContextStringSerializer(); } }강의처럼 데이터를 json으로 저장하고 싶으면, jackson-core의존성을 추가한 후, 위 설정클래스를 정의합니다.섹션2~3@EnableBatchProcessing 을 쓰게되면 BatchAutoConfiguration이 적용되지 않는다.https://umbum.dev/1320/자동 구성과 수동 구성 요소가 동시에 존재할 때 발생할 수 있는 모호성과 충돌을 피하기 위해BuilderFactory대신 JobBuilder, StepBuilder 직접 사용팩토리 클래스들은 종종 불필요한 복잡성을 추가하고, Spring Batch 구성의 일관성을 떨어뜨림.직접 사용해서 더 많은 제어 권한 획득Tasklet 사용시 , PlatformTransactionManager 함께사용 (단일 사용 deprecated)배치 설정 클래스 BasicBatchConfigurer → DefaultBatchConfiguration으로 변경 섹션 3 - JobLauncher주입받은 JobLauncher가 프록시객체가 아닌 실제 객체라서 DefaultBatchConfiguration 에서 JobLauncher를 얻어올 필요없이 바로 타입캐스팅 가능섹션 4 - 배치 초기화 설정spring:batch:job: names(x) -> name실행 할 job을 찾지 못하면 예외가 발생합니다. 인텔리제이에 환경설정으로 프로그램 인수를 한개만 할당할 수 있게 변경되었습니다.파라미터 관련해서는 코드로 할당해줘야 합니다.multiple jobs 실행 불가능.JobLauncherApplicationRunner 의 executeLocalJobs 메서드에서 split으로 job 이름을 구분하는 코드가 삭제되었습니다.섹션 7 - 스프링 배치 청크 프로세스 이해chunk사용시 , PlatformTransactionManager 함께사용 (단일 사용 deprecated)ItemWriter의 write(List<? extends String> items ) -> write(Chunk<? extends String> chunk)Items에 접근하려면 getItems로 꺼내야합니다.
-
미해결스프링 배치
ExecutionContext 질문
안녕하세요. 아래 코드에서 둘 다 ExecutionContext가 반환되는데, 둘은 같은 ExecutionContext가 아니라 다른 ExecutionContext인가요?메서드 참조로 계속 타고 들어가서 하나는 getJobExecution()에서, 나머지 하나는 getStepExecution()에서 꺼내오는데 둘다 동일한 타입의 ExecutionContext라 헷갈립니다.그리고 저렇게 각각 꺼내올 때 다른 ExecutionContext라 JobExecutionContext에 저장된 값을 Step에서 공유가 가능하고, stepExecutionContext에 저장된 값은 Step에서 공유가 불가능한 것이 맞는지 궁금합니다.ExecutionContext jobExecutionContext = stepContribution.getStepExecution().getJobExecution().getExecutionContext(); ExecutionContext stepExecutionContext = stepContribution.getStepExecution().getExecutionContext();
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
spring batch 5버전 소스는 없나요
안녕하세요 오늘부터 강의를 듣기 시작했는데강의 버전이 옛날 버전이여서요ㅠ최신 버전으로 시작하는게 맞을거 같은데 혹시 버전 업된 소스가 따로 없으신가요ㅠㅠ
-
해결됨스프링 배치
선생님 다음 신규강의는 어떤걸 준비중이세요?
시큐리티도 신규강의가 나와서 너무 좋았는데 스프링배치도 신규강의가 나오는지 궁금해서 질문 남깁니다.
-
미해결스프링 배치
Which Database Should I use?
안녕하세요 수원님!강의에서 보면 Mysql을 DB로 사용하는거로 나와있는데 강의교안 PDF를보면 postgres로 DB를 사용하더라구요!혹시 어떤 DB를 써야 강의내용을 쭉 따라갈 수 있을까요?
-
미해결스프링 배치
Retry 동작 관련 문의
안녕하세요. Retry 관련해서 궁금증이 있어 문의 드립니다.FaultTolerant 을 사용하여 Retry 관리를 하려고 하는데 Processor에 인입되는 Item을 아래와 같이 조작하여 Writer에 넘겨줄 경우 Writer에서 문제 발생 시 RetryState의 키가 바뀌어 '무한루프'가 도는 현상이 발생합니다.Listener 나 별도 Custom RetryPolicy 등을 활용하여 해결해보려 했지만 실패하여 고민끝에 글 남깁니다.혹시 관련하여 고려해야 할 점이나, 방안에 대하여 알 수 있을까요.public class PersonItemProcessor implements ItemProcessor<Person, Person> { @Override public Person process(final Person person) { person.setFirstName(person.getFirstName()+"A"); return person; } }
-
미해결
spring batch 관련 질문
chunk 지향 처리 방식에 대한 질문스프링 배치를 공부 중에 궁금한 점이 있어서 질문을 남기게 됐습니다.chunk란 여러 아이템을 묶은 덩어리 블록을 의미.chunkSize를 100으로 했을 경우제가 OPEN API로부터 데이터를 한번에 10개씩 읽어오도록 ItemReader를 설정했다면 (한 페이지에 10개의 데이터를 가져오도록 함) 그렇다면 동작 과정이ItemReader를 10개씩 10번 돌고, 이후에 ItemWriter로 이동하는 것인가요아니면 ItemReader, ItemProcessor, ItemWriter를 거치는 이 과정을 10번 하는 것인가요 ? chunk 단위로 트랜잭션을 처리한다고 이해했는데 위 과정에서 ItemWriter는 그럼 chunk단위로 10개씩 10번 모두 읽어온 이후에 처리해야 한다고 생각하는데어떻게 동작하는지 궁금합니다.또한 궁금한 것이 pageSize와 chunkSize를 동일시 하는 것이 성능에 좋다고 봤습니다.그렇다면 ItemReader에서 제가 만약 10개를 읽어온다면 chunkSize역시 10으로 하는게 좋다는 건가요 ?- 위와 동일하게 item을 10번 read하고 ItemWriter로 이동하는지 (ItemReader - ItemWriter)를 10번하고 하나의 트랜잭션에서 ItemWriter에서 동작하는 내용을 처리하는지 궁금합니다.. 부족한 질문이라 죄송합니다 ㅠㅠ
-
미해결스프링 배치
배치 메타 데이터 사용
안녕하세요. 강의 잘 듣고 있습니다. 다름이 아니라 현업에서 배치 업무에 배정되어 급하게 강의를 수강중인데 메타 데이터를 꼭 설정해야 한다고 들었습니다. 현재 디비는 pom.xml 의존성으로 티베로 디비를 사용하고 있습니다.그리고 스프링 배치의 버전은 4.1.4 RELEASE 버전을 사용중입니다. 또한 강의와 다르게 Job 구성을 XML로 하고 있습니다. 궁금한 사항은 아래와 같습니다.배치 잡을 디버깅으로 찍어보면 Job이 수행된 후 JobExcution에 id, version, start, end, status 등이 찍히긴 하는데 데이터베이스에는 메타 데이터 테이블이 따로 존재하지 않습니다. 그리고 같은 파라미터와 xml id 값으로(찾아보니 job_name을 의미하는 것 같음) 중복 실행이 가능합니다. 이럴경우 현재 프로젝트에서는 DB 테이블에서 메타 데이터를 쓰고 있지 않는게 맞나요? 쓰고 있지 않다면 어떻게 실행이 가능한 것 인가요? 강의에서는 무조건 써야한다고 들었습니다.배치 프로그램이 Spring 사용 없이 그냥 자바 자체로만 실행이 가능한가요? 원래 Spring이 뜰 때 Spring 배너가 보여야 하는데 Spring 배너가 보이지 않습니다. 또한 @EnableBatchProcess(?) 어노테이션도 사용하지 않고 특정 클래스에 Main 함수에서 실행하게 됩니다. (Springboot의 run도 없음) 이럴 경우 Spring을 사용하지 않는 것인가요? pom.xml 의존성에는 스프링 부트 의존성이 있긴합니다.(추가) 확인해보니 Java 어플리케이션으로 그냥 돌아가는 것 같습니다. 근데 스프링 부트를 사용한 이유는 스프링에서 제공하는 @Bean, @Component 등 스프링의 편의 기능을 사용하기 위해서 스프링을 사용했다고 봐도 무방할까요??, 물론 소스코드 없이 이렇게 말씀드리는게 판단이 어려우실 것 같긴합니다만 아무래도 회사 소스라 공개하기는 어려울 것 같아서요 ㅠㅠ)배치를 XML로 구성하는 것의 용어는 배치 네임스페이스가 맞나요?
-
미해결스프링 배치
DB 스키마 없음
안녕하세요. 아직 학습을 많이 듣진 않았지만 당장 회사 업무에 들어간 신입이라 여쭤봅니다! 프로젝트 구조는 아래와 같습니다.스프링 부트 2.1MyBatis티베로스프링 배치 4.1XML로 빈 등록 및 Job & 스텝 등록 강의 초반에 DB를 사용하게 되면 DB 메타데이터를 저장하는 스키마가 꼭 있어야한다고 했는데, 테이블을 아무리 뒤져봐도 배치에 대한 스키마가 보이지 않습니다.또한 job key(job_name, job_parameters)가 정확한진 모르겠으나 xml 잡 정의에 <job id="jobid"> 이런식으로 정의되어 있는데(job paramaeters 는 JVM 아규먼트로 받음) 같은 파라미터와 job를 id로 돌려도 잘 돌아갑니다. 제가 초반부에 수업 내용을 듣기로는 job_key가 동일하면 중복으로 안 돌아간다고 들었습니다. 이런 경우 DB를 사용하지 않는 것이 맞나요? 그리고 또 DB를 사용하지 않게 된다면 job_key도 영향이 없는 것이 맞을까요? 코드로 예시를 보여드리고 싶지만 회사 코드라 공개하기는 어려울 것 같습니다 ㅠㅠ
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
질문드립니다.
현 시점에서 springboot가 3점대 버전이라 build.gradle 정보좀 알려주시길 바랍니다.spring initializr에 2.5.13 버전이 없네요.2.5.13 버전에 맞는 build.gradle정보좀 알려주시면 감사하겠습니다. 현 시점에서 실행가능 정보였으면 좋겠네요.
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
@Configuration 어노테이션 관련 질문있습니다.
Spring에서 @Configuration은 Spring의 설정 파일에 사용 되는 용도로 알고 있습니다.따라서 Spring Project를 구성할 때 @Configuration이 붙은 파일은 Spring 설정 파일로 사용되고, 핵심 비지니스 로직은 @Service 등을 사용하여 구성하는 게 기본적인 것으로 알고 있는데 Batch에서는 @Configuration이 있는 Job class에서 reader, processor, writer 등의 핵심 비지니스 로직을 구성하는 이유가 있을까요? 예를 들면 accountRepository.save()를 실행하는 test라는 메소드를 Service.class에 선언하고 wirter에선 Service::test와 같이 호출할 수 있지 않나요?
-
미해결스프링 배치
예제 프로젝트 소스를 받고 싶습니다!!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 실제로 현업에서 제가 배치를 처음부터 만질 기회가 생겨서 선생님의 프로젝트를 받아서 그걸 참고하면서 만들고 싶습니다.예제 프로젝트의 완성본 깃허브 링크를 받을 수 있을까요?
-
미해결스프링 배치
연속적이지 않은 Id의 Partitioner
안녕하세요.partitioner 강의를 듣다가 스프링 배치에서 제공하는 샘플 ColumnRangePartitioner을 확인했습니다.해당 파티셔너의 경우 연속적인 Id일 경우에는 파티션에 균등하게 분배를 할 수 있을텐데요. 중간에 삭제된 아이디가 있을 때는 어떻게 해야 균등하게 분배를 할 수 있을까요?[1, 2, 5, 7, 10, 11, 12, 13, 15, 17, 19, 20] ColumnRangePartitioner를 사용했을 때 파티션[1, 2, 5], [7, 10], [11, 12, 13, 15], [17, 19, 20] 균등하게 분배되는 파티션[1, 2, 5], [7, 10, 11], [12, 13, 15], [17, 19, 20] 아니면 ColumnRangePartitioner을 사용하고 어느정도 균등하게 분배되는거는 포기하고 사용해야할지 의견이 궁급합니다
-
해결됨스프링 배치
ItemReader에서 chunkSize의 두 사용 방법 비교
안녕하세요~ 강의 잘 들었습니다!다름이 아니라 ItemReader를 구현하는 과정에서 궁금한 게 생겨 질문드립니다.상황 1)chunkSize가 2000이면서 ItemReader에서는 1개의 row만 DB로부터 읽어 1개의 객체씩 반환하는 ItemReader상황 2)chunkSize가 1이면서 ItemReader에서는 2000개의 row를 DB로부터 읽어 2000개의 객체가 포함된 1개의 List 객체를 반환하는 ItemReader두 상황 다 DB커넥션은 1번만 맺고 쿼리를 실행할 것 같긴 한데DB 입장에서는 둘 중 어느 상황을 더 빨리 처리할지,또 코드 상으로는 둘 중 어느 방식으로 구현하는 게 유지보수나 외 측면에서 좋을지,또 어느 방식으로 ItemReader를 구현해야 성능 상 더 좋을지 궁금합니다!
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
다중 Job 구동시 질문 있습니다!!
안녕하세요. 강사님!다중 Job 구동 시에 질문이 있습니다.별도의 작업을 하는 Job을 생성하여 배치를 돌릴때, 각각의 Job을 테스트 하기 위해서는 파라미터로 Job Name을 넘겨주는 방법 밖에 없는 건가요?!
-
미해결스프링 배치
빈등록 관련 에러
***************************APPLICATION FAILED TO START***************************Description:Parameter 4 of constructor in io.springbatch.batch.job.api.SendJobConfiguration required a single bean, but 4 were found: - apiMasterStep: defined by method 'apiMasterStep' in class path resource [io/springbatch/batch/job/api/ApiStepConfiguration.class] - apiSlaveStep: defined by method 'apiSlaveStep' in class path resource [io/springbatch/batch/job/api/ApiStepConfiguration.class] - jobStep: defined by method 'jobStep' in class path resource [io/springbatch/batch/job/api/SendChildJobConfiguration.class] - fileStep: defined by method 'fileStep' in class path resource [io/springbatch/batch/job/file/FileJobConfiguration.class]Action: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 consumedProcess finished with exit code 1이런 에러가 발생하는데 어케 해결해야 될까요? ㅠ
-
미해결스프링 배치
Partitioning 의 강의 중에 customer 입력 쿼리는 어디에 있나요?
partitioning 강의를 수강중인데요. Customer 데이터를 DB에 입력해야 테스트를 할 수 있을거 같은데요. 혹시 Customer 입력 쿼리는 어디에 있는지 알려주세요.
-
미해결스프링 배치
다수의 배치와 메타 테이블간 의존성 관련 질문드립니다
안녕하세요.실무에 Quartz + Batch를 조합한 스케줄링 적용을 위해 강의를 보며 고군분투 하는 와중에 질문이 있습니다.만약 배치 간격이 같다면 각각의 배치는 서로다른 비즈니스 로직을 수행하지만 배치 메타 데이터 저장을 위해 동시에 같은 메타 테이블에 접근을 해야되지 않나요 ?? 테스트를 해보니 중간에 batch_job_execution_context, batch_job_execution_param 같은 테이블에 insert 같은 작업을 하다 문제가 발생했다며 오류가 발생합니다. 어쩔수 없이 구조상 시간을 다르게 해야되는 건지 이미 수행중인 배치가 있는지 체크를 하고 작업을 잠시 미루도록 만들어야 하는지... 궁금합니다.(아직 학습이 미흡하여 부족한 질문.. 죄송합니다)
-
미해결스프링 배치
ItemStreamReader 중복실행관련 질문
저는 강의를 들으면서, 6번째에서 실패하면 6,7,8,9 이렇게 잡을 실행한다고 이해했는데 아래 코드와 같이 this.index == 7로 바꿨을때 6부터 시작하는게 아닌 5부터 시작하는데 의도한 설명이 맞을까요?? @Override public String read() { String item = null; if (this.index < this.items.size()) { System.out.println("read = " + index); item = this.items.get(index++); } if (this.index == 7 && !restart) { throw new RuntimeException("Restart is required!"); } return item; } // 1번째 실행 open update read = 0 read = 1 read = 2 read = 3 read = 4 update read = 5 read = 6 Exception : Restart is required! // 2번째 실행 open update read = 5 read = 6 read = 7 read = 8 read = 9 update update가장 최근에 실패한 지점부터 시작한다고 언급해주셨는데, 가장 최근에 실패한 Chunk부터 시작하는 것 같아서 원래 강사님께서 말씀하시려던 부분이 가장 최근에 실패한 Chunk부터 재실행 한다는게 맞을까요??맞다면, 중복실행이 될 수 있겠네요 read( ) 메서드에서는 ExecutionContext에 put을 하고 있는게 아니라서 클래스 내부변수 this.index가 변경되더라도 실제 DB에는 적용되지 않는 것 같네요.