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을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

ace-t의 Spring Boot 따라잡기(기본 - freeMarker 연동)

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

오랜만에 강좌를 쓰네요^0^ 

오늘은 freeMarker라는 템플릿을 이용하여  view를 만들어보겠습니다. ㅎㅎ

왜 freemarker냐?! 라고 하시면..회사에서 현재 사용하고 있어서라고..후훗


우선 지난번의 강좌를 통해 새롭게 검토하는 겸 따라서 해보겠습니다.

2016/03/22 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(셋팅편)

2016/03/22 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 헬로우월드찍어보기!)

2016/03/23 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - SourceTree에 연결 및 Repository에 올리기)

2016/03/23 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 외부톰캣 연동하기!)

2016/03/24 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - CouchBase 연동하기)

2016/03/24 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - logging)

2016/03/24 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 예외처리)


셋팅편을 참고하여 2분만에 샤샤샤~(JPA는 우선 셀렉 하지 마세용~)



압축 되어진 친구를 원하는 디렉토리에 압축을 풀어보면 아래와 같이 되어있습니다.



STS던지 인텔리J던지 원하는 에디터에 연결하여 줍니다. 저는 회사에서 제공해주는 인텔리J에 연결을 해보겠슴돠~

 

그리고나서 헬로우월드 한번 찍어주시고~(위의 링크 참조!)

그리고나서 우리가 원하는 freemarker를 설정해보겠습니다.


1. 위에서 freemarker를 선택하지 않았을 경우!  build.gradle에 아래의 디펜던시를 추가!


compile('org.springframework.boot:spring-boot-starter-freemarker')


2. 우리가 접근하고 싶은 view 를 하나 만들어 봅니다. templates dir에 index.ftl 하나를 만들어 줍니다.

    확장자는 ftl 입니다.


index.ftl의 내용은 아래와 같습니다.

<html>
<h1> hello~ ${message}</h1>
</html>

 




3. 그리고 이 view를 컨트롤할 Controller를 하나 만들어줍니다.


   


    import org.slf4j.Logger;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@Controller
@RequestMapping(value = "/")
public class FreeMarkerController {
public static final Logger log = LoggerFactory.getLogger(FreeMarkerController.class);

@RequestMapping(method = RequestMethod.GET)
public String showIndex(Map<String,Object> model){
String msg = "terry~";
model.put("message", msg);
return "index";
}

}


 


서버를 띄운 뒤에 아래와 같이 나오면 성공!


http://localhost:8080/





test 관련

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html


요렇게 간단하게 웹을 구현할 수 가 있었습니다.

앞으로는 더 멋있는 녀석을 구현해보도록 하겠습니다.



 - 다음 이시간에.. -



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

설정

트랙백

댓글

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

ace-t의 Spring Boot 따라잡기(셋팅편)

OpenSource/Spring Boot 2016.03.22 13:18
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

1. 목표

현재 개발중인 프로젝트에서 필요한 api를 Spring Boot로 구현하고자 함.

정리를 해두면 다른사람도 좋고 나도 좋고~도랑치고 가재잡고~

CouchBase storege - SpringBoot api



2. 환경

Mac OS X

JDK 8

Tomcat 8

Gradle 1.3.3

Spring Boot

CouchBase 4.x

인텔리J IDE 12

git


3. Spring Boot 간단 셋팅!

  • http://start.spring.io/  에 접속!
  • 아래의 그림처럼 필요한 것들을 찾아서 Dependencies 선택! 나중에 찾아서 넣어도 되니 신중하게 생각하지 않아도 됨.


위에서 Group는 패키지라고 생각하시면 됩니다. 

또한 Gradle Project Artifact를 설정, 디펜던시 설정 후에 Generaate Project!!

아래와 같이 zip파일로 프로젝트 소스가 똭!





압축을 해제한 뒤 원하는 위치에 복사!




그런 다음 인텔리J에서 프로젝트를 가져옵니다.




Gradle 기반이므로 Gradle을 선택하여 줍니다.



다음x2 을 해주면 아래와 같이 프로젝트가 import 되어집니다.

단, gradle이 로컬에 없으면 다음다음이 안될수가 있겠네요~ 고렇다면 gradle 다운 받은다음에 아래와 같이 연결 시켜주면 됩니다.





이제 소스코딩을 하거나 원하는 셋팅을 하시어 사용하시면 됩니다. 참 쉽죠잉? 

셋팅편 끝~


다음편은..항상 우리가 하던 헬로우월드찍기! 를 해보겠습니다.


2016/03/22 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 헬로우월드찍어보기!)







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

설정

트랙백

댓글

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

티스토리 툴바