File(Delimited) TO DB

  • 배치 작업 Xml Sample

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:batch="http://www.springframework.org/schema/batch"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch-int="http://www.springframework.org/schema/batch-integration"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
                           http://www.springframework.org/schema/batch-integration http://www.springframework.org/schema/batch-integration/spring-batch-integration.xsd">

    <!--
        * 배치작업 : DELIMITED FILE TO DB 파일 샘플
        * 배치스텝
            - sample-delimited-to-db-001 : DELIMITED FILE TO DB 처리
     -->
    <job id="sample-delimited-to-db" xmlns="http://www.springframework.org/schema/batch">
        <step id="sample-delimited-to-db-001">
            <tasklet>
                <chunk reader="r-sample-delimited-to-db-001" processor="SmpDelimitedToDbChunk" writer="SmpDelimitedToDbChunk" />
            </tasklet>
        </step>
    </job>

    <!--
        * 샘플용직원정보 Delimited File을 Read 하기위한 bean 설정
    -->
    <bean id="r-sample-delimited-to-db-001" parent="RDelimit" scope="step">
        <property name="name" value="r-sample-delimited-to-db-001" />
        <property name="resource" value="file:///${prefixFilePath}/test-delimited-file-#{jobParameters['deptNo']}.txt" />
        <property name="targetType" value="sample.batch.service.dto.SmpDelimitedToDbChunkDto" />
        <property name="delimiter" value=";" />
    </bean>

</beans>
  • 배치 소스코드 Sample

package sample.batch.service;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import bxm.common.annotaion.BxmCategory;
import bxmc.core.ext.context.DefaultApplicationContext;
import sample.batch.dbio.DSmpEmpTmp001;
import sample.batch.dbio.dto.DSmpEmpTmp000Dto;
import sample.batch.service.dto.SmpDelimitedToDbChunkDto;

/**
 * 샘플 File(Delimited) TO DB 배치
 *
 * @author sysadmin
*/
@Scope("step")
@Service("SmpDelimitedToDbChunk")
@BxmCategory(logicalName="샘플 File(Delimited) TO DB 배치", description="샘플 File(Delimited) TO DB 배치")
public class SmpDelimitedToDbChunk implements ItemProcessor<SmpDelimitedToDbChunkDto, SmpDelimitedToDbChunkDto>, ItemWriter<SmpDelimitedToDbChunkDto>{

    private Logger logger= LoggerFactory.getLogger(getClass());

    private DSmpEmpTmp001 dSmpEmpTmp001;

    /**
     * process
     * - 처리 대상 데이터를 건 별로 업무요건에 따라 처리하는 역할을 수행한다.
     */
    @Override
    @BxmCategory(logicalName = "process : 샘플용 직원정보 처리", description = "process : 샘플용 직원정보를 1건씩 처리한다.")
    public SmpDelimitedToDbChunkDto process(SmpDelimitedToDbChunkDto in) throws Exception {
        SmpDelimitedToDbChunkDto out;

        /**
         *  관리자임직원번호가 없는 경우에는 null 를 return 하여 해당 Item에 대하여 Skip 처리한다.
         *  - 참고 : process에서 null을 return 하면 write로 item이 넘어가지 않는다.
         */
        if(in.getFeduMngrEmpNo() == 0)
        {
            logger.warn("임직원번호[{}]에 대한 관리자 번호가 0 입니다. Skip 처리합니다.", in.getFeduEmpNo());
            return null;
        }


        /**
         * 개별 업무로직 수행
         * ...
         * ...
         */
        out = in;

        return out;
    }

    /**
     * write
     * - 처리 대상 결과 데이터를 커밋 단위 별로 DB 또는 파일에 기록처리하는 역할을 수행한다.
     */
    @Override
    @BxmCategory(logicalName = "샘플 DB write", description = "샘플 DB write")
    public void write(List<? extends SmpDelimitedToDbChunkDto> in) throws Exception {

        // getBean
        dSmpEmpTmp001 = DefaultApplicationContext.getBean(dSmpEmpTmp001, DSmpEmpTmp001.class);

        /**
         * List로 전달된 Item를 Loop를 돌면서 DB에 Insert할 DTO를 List형태로 설정한다.
         */
        List<DSmpEmpTmp000Dto> dSmpEmpTmp000Dtos = new ArrayList<DSmpEmpTmp000Dto>();
        for(SmpDelimitedToDbChunkDto smpDelimitedToDbChunkDto : in)
        {
            DSmpEmpTmp000Dto smpEmpTmp001Dto = new DSmpEmpTmp000Dto();

            smpEmpTmp001Dto.setFeduEmpNo(smpDelimitedToDbChunkDto.getFeduEmpNo());          // set [FW샘플 임직원번호]
            smpEmpTmp001Dto.setFeduEmpNm(smpDelimitedToDbChunkDto.getFeduEmpNm());          // set [FW샘플 임직원명]
            smpEmpTmp001Dto.setFeduOccpNm(smpDelimitedToDbChunkDto.getFeduOccpNm());        // set [FW샘플 직업명]
            smpEmpTmp001Dto.setFeduMngrEmpNo(smpDelimitedToDbChunkDto.getFeduMngrEmpNo());  // set [FW샘플 관리자임직원번호]
            smpEmpTmp001Dto.setFeduHireDt(smpDelimitedToDbChunkDto.getFeduHireDt());        // set [FW샘플 입사일자]
            smpEmpTmp001Dto.setFeduPayAmt(smpDelimitedToDbChunkDto.getFeduPayAmt());        // set [FW샘플 급여금액]
            smpEmpTmp001Dto.setFeduDeptNo(smpDelimitedToDbChunkDto.getFeduDeptNo());        // set [FW샘플 부서번호]

            dSmpEmpTmp000Dtos.add(smpEmpTmp001Dto);
        }

        /**
         * insert 처리
         * - 참고 1 : CONNECTED_BATCH로 C/U/D 처리는 Commit 시점에 bulk로 쿼리가 수행이 된다.
         * - 참고 2 : CONNECTED_BATCH로 C/U/D 처리는 Commit 시점에 수행이 되기때문에 return 값은 임의의 음수 값이다.(의미없음)
         */
        dSmpEmpTmp001.insertList01(dSmpEmpTmp000Dtos);

    }

}
SWLab Bankware Global
  • 전체
  • BXM
  • BXCM
  • BXCP
  • BXI
제품 선택 시 더 정확한 매뉴얼 가이드를 제공해드립니다.

Copyright© Bankwareglobal All Rights Reserved.