Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

Spring Boot + Spring Batch 분석_02

OpenSource/Spring Batch 2018.10.23 19:14
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

2018/10/12 - [OpenSource/Spring Batch] - Spring Boot + Spring Batch 분석_01

 저번 분석에서는 Job에 대해서 알아보았습니다. 

이제 Step에 대해 알아보도록 하겠습니다.

설명하고 있는 소스는 https://spring.io/guides/gs/batch-processing/ 를 참고!

// tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    }
    // end::jobstep[]
  • Step의 메소드명은 step1
  • 파라미터는 JdbcBatchItemWriter<Person> writer 
  • return은 stepBuilder
  • 내용을 파악하기 전에 SpringBatch의 Flow를 파악해보면 좋을것 같다.
    왜? 나는 chunk, reader, processor, writer를 알아야하는가?에 대한 답변이 될꺼라 생각한다.
  • SpringBatch Flow
  • 이제 하나하나씩 알아가보자.
  • chunk를 보자.
    • 우선 chunk(청크)란 배치선 덩어리 데이터들을 단위별로 묶어서 처리되어지는 수!
      즉, 위에 10이라는 뜻은 
      10개를 모아서 Chuck단위(10)로 트랜잭션을 이루고 있다고 보면 된다.
      트랜잭션 수행이기 때문에 실패 시 
      Chunk단위로 롤백이되고, 이전에 커밋된 트랜잭션까지는 반영이 된다는 뜻이다.
    • <Person, Person> chunk(10)에서 <Person, Person>은 제네릭 타입으로
      각 청크의 input과 output type을 나타낸다. 
    • ItemReader<Person>과 ItemWriter<Person>로 생각하면 된다.
  • reader(reader())를 보자.
    • reader? 뜻 그대로 읽어들이는 것이다. 무엇을? 데이터를~(txt, api, db 등등등)
       @Bean
          public FlatFileItemReader<Person> reader() {
              return new FlatFileItemReaderBuilder<Person>()
                  .name("personItemReader")
                  .resource(new ClassPathResource("sample-data.csv"))
                  .delimited()
                  .names(new String[]{"firstName", "lastName"})
                  .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                      setTargetType(Person.class);
                  }})
                  .build();
          }
      
    • 위의 FlatFileItemReader는 SpringBatch에서 제공해주는 녀석이다.
      json, xml 형태가 아닌 말그대로 flat file을 읽어들인다.
      import org.springframework.batch.item.file.FlatFileItemReader;
      import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
    • FlatFileItemReaderBuilder! 이녀석 또한 Builder Pattern. 
      • name : reader instance명 
      • resource : 근원지 즉, read할 flat file.
      • delimited() : 명시적이지 않을 때 사용!
        DelimitedLineTokenizer를 작성하기위한 FlatFileItemReaderBuilder.DelimitedBuilder의 인스턴스를 리턴합니다. 이 빌더에 의해 구성된 DelimitedLineTokenizer는 lineTokenizer를 통해 명시적으로 구성되지 않은 경우에만 사용됩니다.
      • names : sample-data.csv의 내용과 names에서 선언한 포맷에 맞게 들어오게 되며 이 데이터는
      • fieldSetMapper()를 통해 DTO에 매핑 되어진다.
      • 예를 들어 아래의 데이터 중 Jane, Doe라고 한다면  String[]{"firstName", "lastName"}에 담긴다는 것이고 이것은 fieldSetMapper를 통해 객체에 담기게 된다. 

                  


    • processor(processor)
      • PersonItemProcessor는 ItemProcessor의 구현체이다.
        • Person객체를 input으로 하여 가공한 뒤에 output으로 Person을 리턴한다. 
          @Bean
              public PersonItemProcessor processor() {
                  return new PersonItemProcessor();
              }
          package hello;
          
          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;
          
          import org.springframework.batch.item.ItemProcessor;
          
          public class PersonItemProcessor implements ItemProcessor<Person, Person> {
          
              private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);
          
              @Override
              public Person process(final Person person) throws Exception {
                  final String firstName = person.getFirstName().toUpperCase();
                  final String lastName = person.getLastName().toUpperCase();
          
                  final Person transformedPerson = new Person(firstName, lastName);
          
                  log.info("Converting (" + person + ") into (" + transformedPerson + ")");
          
                  return transformedPerson;
              }
          
          }
        • 정리하면 processor의 역할은 read한 것을 가공하여 write에 주는 것이다.


  • writer(writer)
    • 이제 마지막으로 writer입니다.
      여기에서는 데이터베이스 관련 writer중 JdbcBatchItemWriter가 사용되어집니다.
@Bean
    public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Person>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
            .dataSource(dataSource)
            .build();
    }
    • JdbcBatchItemWriterBuilder가 사용.
      • itemSqlParameterSourceProvider()
        • 작성자가 사용할 ItemSqlParameterSourceProvider를 구성합니다.
          beanMapped ()가 호출되지 않은 경우에만 사용해야합니다.
        • BeanPropertyItemSqlParmeterSourceProvider
          • SQL구문에서 파라미터에 사용되어지는 명명 중 JavaBean(Person)에 속성에 해당되면 
            공하여준다.
      • sql : sql구문
      • dataSource : @EnableBatchProcessing에 의해 생성.



'OpenSource > Spring Batch' 카테고리의 다른 글

Spring Boot + Spring Batch 분석_02  (0) 2018.10.23
Spring Boot + Spring Batch 분석_01  (0) 2018.10.12
SpringBatch 예제  (0) 2018.09.12
MyBatisPagingItemReader를 사용할 때 유의점  (0) 2015.10.02
Spring Batch 환경 셋팅  (0) 2012.09.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring Boot + Spring Batch 분석_01

OpenSource/Spring Batch 2018.10.12 15:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


주저리 

   spring boot를 사용하여 
   spring batch를 해보려는데 막상 spring batch를 잘모르면 제대로 못할것 같은 생각이 들었다.
   springframework를 spring boot기반으로 해볼때도 마찬가지였다.


구성

  • Job과 Step으로 구성.
    • Job
      • 여러개의 Step으로 구성.
        • Step은 ItemReader, ItemProcessor, ItemWriter의 구조이거나 
          이런 전형적인 구조가 아닐 경우 Tasklet 구조.

분석

    2018/09/12 - [OpenSource/Spring Batch] - SpringBatch 예제

    에서 처럼 https://spring.io/guides/gs/batch-processing/
   공식 사이트를 살펴보도록 하자.


org.springframework.boot:spring-boot-starter-batch 디펜던시는 요녀석!

Batch Job을 구성할 때 
Spring Batch는 따로 작성할 필요없이 비즈니스 로직에 집중할 수 있도록 많은 유틸리티를 제공한다.


BatchConfiguration! 이부분은 옛날 Spring Batch에서 xml로 구성되던 녀석이다.

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {


하나하나씩 보도록 하자. 우선 Factory를 DI 하는 것을 볼수 있다.

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

Factory는 Job과 Step에서 사용!
// tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    }
    // end::jobstep[]


그리고 Step에서 사용되어지는 reader, processor, writer도 함께 구성.

    // tag::readerwriterprocessor[]
    @Bean
    public FlatFileItemReader<Person> reader() {
        return new FlatFileItemReaderBuilder<Person>()
            .name("personItemReader")
            .resource(new ClassPathResource("sample-data.csv"))
            .delimited()
            .names(new String[]{"firstName", "lastName"})
            .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }})
            .build();
    }

    @Bean
    public PersonItemProcessor processor() {
        return new PersonItemProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Person>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
            .dataSource(dataSource)
            .build();
    }
    // end::readerwriterprocessor[]


구조는 이러하고..이제 조금 더 자세하게 보도록 하자.

More and More


BatchConfiguration.java

  1. @Configuration : 설정 파일임을 알려준다. @MVC에서 @service @controller와 같다고 보면 된다.
  2. @EnableBatchProcessing : Batch 관련 유용한 유틸을 제공가능케 한다. 영어 고대로 Enable하겠다는 뜻.
  3. 위에서 언급한 내용처럼 Factory를 DI 하여 Job과 Step을 구성한다.
    1. Job은 Step으로 구성하여 만들어지고 Step은 reader, processor, writer를 구성할 수 있다.
  • 어노테이션 @Autowired로 DI 해주는 부분.
    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;
  • Job과 Step을 설정 해주는 부분.
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    } 
    • Job은 아래와 같이 importUserJob이라는 함수명을 가지며, 파라미터로는 listener, step
    • return으로는 JobBuilderFactory를 이용하여 Job을 리턴하는 구조이다.
      • jobBuilderFactory.get은 job builder를 생성하고 JobRepository를 초기화 시킨다.

[ Spring Batch 흐름도]

         

      • 아래를 좀 더 심화있게 이해하려면 builder pattern을 이해해야한다. 
      • 하지만 우선적으로 Spring Batch에 대해서 파악하는게 우선이다. 
      • 이제 돌아와서 incremeter를 보자.
        • JobBuilderHelper Class에 속해있는 method이다. 
        • JobBuilderHelper는 JobBuilder의 부모 클래스이다.
        • 포맷은 아래와 같다.
          • public B incrementer(JobParametersIncrementer jobParametersIncrementer)
          • 파라미터로 JobPrametersIncrementer를 가지는데 이것은 Interface 형태이다.
          • 이 Interface를 구현한 녀석이 위에 사용되어진 RunIdIncrementer Class 이다.
        • 그리고 incrementer 이녀석이 하는 역할은 JobParametersIncrementer 인터페이스의 
          역할을 보면 알수 있다. JobParameters를 취득하기 위한 인터페이스이기 때문이다.
        • JobParameters..! 이녀석을 이해하려면 아래의 그림을 이해해야한다.
        • 동시 다발적으로 돌아가는 Job들의 차이는 어떻게 알수가 있나? Job들 간의 구별? 그 해답은 JobParameters에 있다. 그래서 batch job을 시작할 때 이처럼 JobParameters를 취득한다.
          더욱 더 자세한 내용은 해당 링크를 참조. 

           

        • 그 다음으로 listener.
          • JobBuilderHelper Class에 속해 있는 Method이며, format은 아래와 같다.
            public B listener(JobExecutionListener listener)
          • JobExecutionListener도 Interface이며 지금 설명하는 소스에서는 
            JobCompletionNotificationListener Class에서 extends하고 있다.
          • JobCompletionNotificationListener.java
            package hello;
            
            import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;
            import org.springframework.batch.core.BatchStatus;
            import org.springframework.batch.core.JobExecution;
            import org.springframework.batch.core.listener.JobExecutionListenerSupport;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.jdbc.core.JdbcTemplate;
            import org.springframework.stereotype.Component;
            
            @Component
            public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
            
            	private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
            
            	private final JdbcTemplate jdbcTemplate;
            
            	@Autowired
            	public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
            		this.jdbcTemplate = jdbcTemplate;
            	}
            
            	@Override
            	public void afterJob(JobExecution jobExecution) {
            		if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
            			log.info("!!! JOB FINISHED! Time to verify the results");
            
            			jdbcTemplate.query("SELECT first_name, last_name FROM people",
            				(rs, row) -> new Person(
            					rs.getString(1),
            					rs.getString(2))
            			).forEach(person -> log.info("Found <" + person + "> in the database."));
            		}
            	}
            }
          • 위의 소스는 job이 BatchStatus.COMPLETED인가에 대해서 listen하고 있다. 그리고나서 JdbcTemplate를 사용한다.
        • 다음으로 flow.
          • JobBuilder Class에 속해 있는 Method이며, format은 아래와 같다.
            public JobFlowBuilder flow(Step step)
            딱 봐도 job과 step의 연결 & 수행. return으로는 a SimpleJobBuilder.
        • 다음으로 end. 즉, builder를 종료.
        • 다음으로 build() : 호출하여 최종적으로 a job builder를 리턴. 

지금까지 Job 관련 내용들을 살펴 보았습니다.

다음 포스팅에서는 비즈니스 로직을 당담하고 있는 Step에 대해서 알아보도록 하겠습니다.

2018/10/23 - [OpenSource/Spring Batch] - Spring Boot + Spring Batch 분석_02




'OpenSource > Spring Batch' 카테고리의 다른 글

Spring Boot + Spring Batch 분석_02  (0) 2018.10.23
Spring Boot + Spring Batch 분석_01  (0) 2018.10.12
SpringBatch 예제  (0) 2018.09.12
MyBatisPagingItemReader를 사용할 때 유의점  (0) 2015.10.02
Spring Batch 환경 셋팅  (0) 2012.09.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

SpringBatch 예제

OpenSource/Spring Batch 2018.09.12 17:32
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

스프링배치 버전이 낮아서 이참에 스프링부트+스프링배치로 변경해보려고 한다.

"라스트 제다이"가 아닌 "라스트 스프링" ㅋㅋ 

설명에 앞서 주저리를 하자면..요즘 스프링 관련 업무가 없어서..너무 뒤쳐진거 같다..ㅜ.ㅜ..마지막 남은 스프링인가? ㅋㅋ 


예제는 아래 사이트를 참고
  - https://spring.io/guides/gs/batch-processing/ 


결과는 아래와 같다.


위 사이트 내용을 요약해서 보면

간단한 배치 서비스를 만들껀데
이 서비스는 csv파일의 데이터를 가져와서 입맛에 맞게 변경 한 뒤 데이터베이스에 저장하는게 목표이다.

정형적인 배치서비스를 축약한 내용의 소스인것 같아서 선택했다.

데이터를 수집해서 변경 후에 데이터베이스에 저장(insert) or 변경(update)하는 style이 되겠다.

위 소스를 위해서 필요한것은


src/main/java/hello/Person.java  : 데이터를 저장&전달하는 DTO.

src/main/java/hello/PersonItemProcessor.java : 데이터 가공 하는 부분.

src/main/java/hello/BatchConfiguration.java : input / prossessor / output ,  job과 step을 설정 

src/main/java/hello/JobCompletionNotificationListener.java : 배치 완료 후 노티 




'OpenSource > Spring Batch' 카테고리의 다른 글

Spring Boot + Spring Batch 분석_02  (0) 2018.10.23
Spring Boot + Spring Batch 분석_01  (0) 2018.10.12
SpringBatch 예제  (0) 2018.09.12
MyBatisPagingItemReader를 사용할 때 유의점  (0) 2015.10.02
Spring Batch 환경 셋팅  (0) 2012.09.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

MyBatisPagingItemReader를 사용할 때 유의점

OpenSource/Spring Batch 2015.10.02 09:59
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


Caused by: java.sql.BatchUpdateException: Duplicate entry '123212' for key 'PRIMARY'
	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2055) ~[neositebatch.jar:na]
	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1467) ~[neositebatch.jar:na]


위의 오류가 났다.



해결방안으로 아래처럼 MyBatisPagingItemReader를 사용할 때 유의하여 사용하면 된다.

<batch:reader>
<bean class="org.mybatis.spring.batch.MyBatisPagingItemReader">
<property name="sqlSessionFactory" ref="sqlSessionFactoryForMysql"/>
<property name="pageSize" value="100"/>
<property name="queryId"
value="xxx.xxx.xxx.xxxRepository.get블라블라"/>
</bean>
</batch:reader>


SELECT Query에서 MySQL이라면 LIMIT #{_skiprows}, #{_pagesize} 를 걸어줘야 한다.

읽어와서 페이징 단위로 자동으로 데이터를 가져오지 못한다는 점이다.

  • _page: 읽을 페이지 수(0부터 시작)
  • _pagesize: 페이지의 크기, 이를테면 리턴하는 로우 수
  • _skiprows_page 와 _pagesize의 결과

참고 : https://mybatis.github.io/spring/ko/batch.html


  끝~


'OpenSource > Spring Batch' 카테고리의 다른 글

Spring Boot + Spring Batch 분석_02  (0) 2018.10.23
Spring Boot + Spring Batch 분석_01  (0) 2018.10.12
SpringBatch 예제  (0) 2018.09.12
MyBatisPagingItemReader를 사용할 때 유의점  (0) 2015.10.02
Spring Batch 환경 셋팅  (0) 2012.09.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring Batch 환경 셋팅

OpenSource/Spring Batch 2012.09.03 10:09
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
Batch processing is execution of a series of programs ("jobs") on a computer without manual intervention. Jobs are set up so they can be run to completion without manual intervention, so all input data is preselected through scripts or command-line parameters.
This is in contrast to "online" or interactive programs which prompt the user for such input.
A program takes a set of data files as input, processes the data, and produces a set of output data files. This operating environment is termed as "batch processing" because the input data are collected into batches of files and are processed in batches by the program.
출처 : http://en.wikipedia.org/wiki/Batch_processing

대충 보면..Job단위로 수행한다는 거라고 볼 수 있다.

Spring Batch 대충 이렇다.
1) Job
2) Step - Chunk-Oriented Processing
3) 스프링 배치는 스케줄러가 아니다!
    처음에 저 또한 스프링 배치???? 스케줄러처럼 배치Job들을 관리해주는건가? 라고 생각했었지만..
    그게 아니였다.
    스케줄러는  Jenkins, Crontab, Quartz, Jdk timer 등으로 관리를 한다.  
    스프링 배치는 단지 Job을 만들고 실행시킨다고 볼수 있다. 
    이러한 Job들과 스케줄러와 연결을 시킨다는것!
 
참고 사이트는 http://javajigi.tistory.com/93 설명이 잘 나와있는 자바지기님의 사이트를 참조 하였다.
정말 멋지신 분 같다.(__* 다시 한번 감사합니다^-^good~

스프링 배치 svn 주소(소스 있는곳 주소) :
http://springframework.svn.sourceforge.net/svnroot/springframework/spring-batch (해놨는데 안된다..ㅠㅠ)

그래서 찾았다!

https://github.com/SpringSource/spring-batch 아래의 주소로 가면  zip파일로 받거나 url로 svn으로 소스를 끌어 올 수 있다.

SVN 주소 : https://github.com/SpringSource/spring-batch.git  로 하면 될 줄 알았는데...안된다..ㅠㅠ read only 인듯......
그래서! zip으로 받아서...프로젝트 생성 후 import  시켜줬다^-^good~



자! 이제 환경 셋팅을 해보자^-^ 야호~씐나~^0^~~
3 단계로 나뉜다.
1] 이클립스를 다운로드 하자!
     http://www.eclipse.org/downloads/
     대충 아무거나 받자 ㅋㅋ
    


2번, 3번은...무용지물이 되었다..svn 주소에서 소스를 읽어올수가 없었다..
2], 3] PASS~



2] SVN을 연결하자! plug-in이 없으면 plug-in을 받고, 이미 있으면 svn을 연동하자!
    svn이 없었다..
    http://marketplace.eclipse.org/content/subversive-svn-team-provider#.UEQSP8EaMbk
   이 사이트에서 svn 플러그인을 받을 수 있는 주소를 알아 냄.
   플러그인 주소 ->   http://download.eclipse.org/technology/subversive/1.0/update-site/
  


 
3] 소스 check out~!!!



그래서  위에서 말한것과 같이..ZIP으로 받아서 프로젝트 생성 후 소스를 import 시켰다!

결과는 다음과 같다! (단, 소스를 보니...spring-batch-core, spring-batch-infrastructure등이..각각의
pom.xml을 가지고 있는걸 보니..개별적인 프로젝트인 것 같다. 각각 프로젝트를 만들어서 가져와야 할지도..
우선은 이렇게...셋팅을 끝내야겠다..cm쪽 다시보자..ㅜ.ㅜ...



....이럴수가.....AA 스프링 배치쪽 하는 걸로 되어있었는데..선투입과제로..
다시 CM쪽으로 가게 되었다..ㅜ.ㅜ...OTL....

Oh my god~~~~~~~~~~~~~~~~~~~ㅠ.ㅠ...스프링은 스터디로 열심히 해야하나..
프로젝트는 언제 해보나~~~~~ㅠ.ㅠ...大 충격!!

스프링 배치여..잠시만 안녕...넌 스케줄러가 아닌것을 알았다..나중에..Job과 Step등록해주마...잠시만 안녕!



'OpenSource > Spring Batch' 카테고리의 다른 글

Spring Boot + Spring Batch 분석_02  (0) 2018.10.23
Spring Boot + Spring Batch 분석_01  (0) 2018.10.12
SpringBatch 예제  (0) 2018.09.12
MyBatisPagingItemReader를 사용할 때 유의점  (0) 2015.10.02
Spring Batch 환경 셋팅  (0) 2012.09.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바