• STS의 프로젝트 자동 생성 기능을 사용
  • Dynamic Web Project 생성
  • Dynamic Web module Version .. 3.1 로 생성 
필기
메이븐기반으로 Spring을 생성하거나 또는 Spring을 생성 후 Maven으로 생성 가능하다.
하지만 디렉토리구조가 달리지므로 메이븐->Spring 방법이 더 효율적
Spring Boot는 아예 처음 부터 Maven 기반이다.

 

프로젝트 생성

New -> New Project -> maven (SKD설정) -> GroupId, ArtifactId 설정

GroupId
당신의 프로젝트를 모든 프로젝트 사이에서 고유하게 식별하게 해 주는 것이다.
따라서, groupId에는 네이밍 스키마를 적용하도록 한다.
groupId는 package 명명 규칙을 따르도록 한다.
즉, 최소한 당신이 컨트롤하는 도메인 네임이어야한다.
하위 그룹은 얼마든지 추가가능하다.
ex ) org.apache.maven
org.apache.commons

ArtifactId
버전 정보를 생략한 jar파일의 이름이다.
이름은 원하는 것으로 아무거나 정해도 괜찮다.
단, 소문자로만 작성하도록한다.
단, 특수문자는 사용하지 않는다.
만약 써드 파티 jar 파일이라면, 할당된 이름을 사용해야한다.

 

의존성(Dependency) 추가

https://mvnrepository.com 

 

Maven Repository: Search/Browse/Explore

Kotlin Standard Library JDK 7 extension Last Release on Feb 3, 2021

mvnrepository.com

Spring Dependencies 추가

상위 경로에서 카피해서 복붙하면된다.  <dependencies> ... </dependencies>

 

 

Spring의 시작

Spring을 사용하기 위해 Maven Build가 필요함

 

Maven 

  • 자바 개발의 사실상 표준 빌드 툴 (이전에는 ANT를 많이 사용함)
  • XML 설정파일을 사용
    • groovy라는 언어로 설정하는 gradle이 등장

Maven 특징

Convention over Configuration(CoC)

기존의 모든 개발전에는 초기 설정을 중요하게 생각했는데 (=config) 그 설정을 미리(=모범사례) 초기 설정을 지정해준다. (=표준(Convention))

cf) Node.js의 웹 프레임워크 Express Configuration over Convention

 

Java 기반 Web Application 의 Best Practice를 따름

  • 개발 디렉토리구조
  • 빌드 단계

의존성 관리를 자동으로 수행

Maven 중앙 저장소 (Central Repository)를 제공하여 자바 라이브러리에 대한 생태계를 조성

의존성
라이브러리의 수가 엄청 많아진다. 라이브러리도 버전이 올라가면서 라이브러리끼리 충돌이 올라간다. 그런 것을 자동으로 관리해준다. (의존성=의존성 관리) 라이브러리를 하나의 중앙 저장소에 관리를 해준다. 즉 하나의 생태계를 구성한다.

POM.XML.. 메이븐의 메인 설정파일

프로젝트 루트에 위치

메이븐 프로젝트를 의미, IDE에서 불러오기가 쉬움

 

메이븐 프로젝트 설정 시 필수사항

프로젝트 명

artifact ID로 사용

보통 프로젝트명이랑 같은 이름을 사용한다.

그룹 아이디

  • 주로 프로젝트 생성 조직이나 기관의 도메인 명 역순으로 표기. ex) kr.co.company
  • Top-level package 명으로 사용됨

버전

  • 개발버전을 의미하는 SNAPSHOT 버전 사용
  • cf) 배포버전.. RELEASE 버전

Maven 3 버전 사용

  • 로컬에 설치 필요
  • IDE에 포함된 경우에는 별도 설치 필요업음
  • STS 3.8x, IntelliJ IDEA 2017 버전 이상 모두 메이븐 3.X 버전 포함되어 있음
  • maven.apach.org

 

STS로 스프링 프로젝트 생성

  • Dynamic Web Project 생성
  • Dynamic web Module version .. 3.1로 설정
  • Apache Tomcat 8.0 설치 후 설정

goni9071.tistory.com/456

 

window 10 + Spring Tools 4 for Eclipse :: STS 4 설치 ( 2020.01.13)

Spring Tools 4 설치 입니다. Version : 4.5.0.RELEASE Build id : 201912171052 STS 다운받으면 원래 zip 파일이었는데 이번에 다운 받을 땐 jar 파일이어서 당황했습니다. 덕분에 공유합니다. 다운로드 URL : h..

goni9071.tistory.com

  • Dynamic Web Project 생성

  • 기존 경로 삭제 이후 다음과 같이 입력

  • 경로 재설정 및 Descriptor check

 

  • Maven으로 변경 [프로젝트] -> [configure] -> [CovertToMaven]
    • pom.xml 생성 됨

 

 

 

 

 

 

Maven Repository: org.springframework » spring-context » 5.2.12.RELEASE

org.springframework spring-context 5.2.12.RELEASE // https://mvnrepository.com/artifact/org.springframework/spring-context compile group: 'org.springframework', name: 'spring-context', version: '5.2.12.RELEASE' // https://mvnrepository.com/artifact/org.spr

mvnrepository.com

  • Maven 으로 갱신하기 [프로젝트] -> [Maven] ->[upadate Project]
  • [RunAs] -> RunServer 구동

  • 초기화면이 없으므로 404 에러 

스프링 프레임워크란 ?

Java 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임 워크 

 

애플리케이션 프레임워크

특정 계층이나 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말한다.

경량급 프레임워크

단순한 웹 컨테이너에서도 엔터프라이즈 개발의 고급기술을 대부분 사용할 수 있음.

엔터프라이즈 개발 용이

개발자가 복잡하고 실수하기 쉬운 Low Level에 많이 신경 쓰지않으면서 Business Logic 개발에 전념할 수 있게 해준다.

오픈소스

spring은 OpenSource의 장점을 충분히 취하면서 동시에 OpenSource제품의 단점과 한계를 잘 극복함

 

Spring Framework 특징

컨테이너의 역할

Spring 컨테이너는 java객체의 Life Cycle을 관리하며, Spring 컨테이너로부터 필요한 객체를 가져와 사용할 수 있다.

 

DI(Dependency Injection) 지원 

Spring은 설정 파일이나 어노테이션을 통해서 객체 간의 의존관계를 설정할 수 있도록 하고 있다.

 

AOP(Aspect Oriented Programming) 지원

Spring은 트랜잭션이나 로깅, 보안과 같이 공통적으로 필요로 하는 모듈들을 실제 핵심 모듈에서 분리해서 적용할 수 있다.

 

POJO(Plain Old Java Object)지원

Spring 컨테이너에 저장되는 Java객체는 특정한 인터페이스르 구현하거나, 특정 클래스를 상속받지 않아도 된다.

 

트랜잭션  처리를 위한 일관된 방법을 지원

JDBC, JTA 등 어떤 트랜잭션을 사용하던 설정을 통해 정보를 관리하므로 트랜잭션 구현에 상관없이 동일한 코드르 사용 가능.

 

영속성(Persistence)과 관련된 다양한 API 지원

Spring은 MyBatis, Hibernate 등 데이터베이스 처

리를 위한 ORM(Object Relational Mapping) 프레임워크들과의 연동 지원

 

스프링의 주요 모듈 목록

Data Access/Integration

  • JDBC
  • ORM
  • OXM
  • JMS
  • Transactions

Web

  • Web Socket
  • Servlet
  • Web
  • Portlet

Core Container

하부를 지탱하는 주요한 객체(=Bean)를 관리해줌

  • Beans
  • Core
  • Context
  • SpEL

스프링 지원 IDE

  • STS (Spring Tool Suite)
  • IntelliJ IDEA, by JetBrains
    • 더욱 주목 받고 있음.(대기업 개발자들이 많이 쓴다.)
Spring을 잘 한다는 것은 Tool을 얼마나 잘 쓰는냐도 중요하다. (기능이 많기 때문)

 

Maven이란?

Maven은 자바 프로젝트의 빌드(build)를 자동화 해주는 빌드 툴(Build tool) 이다. 즉, 자바소스를 compile하고 package해서 deploy하는 일을 자동화 해주는 것이다. 

 

Maven이 참조하는 설정 파일

Maven 전체를 보기보다 프로그래밍에 직접적인 연관이 있는 두 개 의 설정 파일을 알아보면 된다.

  • settings.xml
    • settings.xml은 maven tool 자체에 관련된 설정을 담당한다. MAVEN_HOME\conf\ 아래에 있는 설정이다. ( MAVEN_HOEM은 환경변수에 설정한 경로) Maven 자체에 설정 값을 바꾸는 일은 일단 잘 없다.
  • pom.xml
    • 하나의 자바 프로젝트에 빌드 툴로 maven을 설정했다면, 프로젝트 최상위 디렉토리에 "pom.xml"이라는 파일이 생성되었을 것이다. 
    • pom.xml은 POM(Project Object Model)을 설정하는 부분으로 프로젝트 내 빌드 옵션을 설정하는 부분이다.
    • 꼭 pom.xml이라는 이름을 가진 파일이 아니라 다른 파일로 지정할 수도 있다. (mvn -f ooo.xml test)
    • 그러나 maven의 원칙으로 다른 개발자들이 헷갈릴 수 있으므로 그냥 pom.xml으로 쓰기를 권장한다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    /*maven의 pom.xml의 모델 버전이다. 형식이 4.0.0 버전이라고 생각하면 된다.*/
    <modelVersion>4.0.0</modelVersion>
    
 	/*groupId 프로젝트를 생성한 조직 또는 그룹명으로 보통, URL의 역순으로 지정한다.*/
    <groupId>com.example</groupId>
    
    /*프로젝트에서 생성되는 기본 아티팩트의 고유 이름이다.*/
    <artifactId>demo</artifactId>
    /*SNAPSHOT이 붙으면 아직 개발단계를 의미한다.*/
    <version>0.0.1-SNAPSHOT</version>
    /*jar, war, ear, pom등 패키지 유형을 나타낸다. */
    <packaging>jar</packaging>
 	/*프로젝트명*/
    <name>demo</name>
    /*프로젝트 설명*/
    <description>Demo project for Spring Boot</description>
  
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
 
 	/* 의존성 라이러리 정보 최소한 groupId, artifactId, version 정보가 필요하다 */
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            /*ompile, runtime, provided, test등이 올 수 있는데 
            해당 라이브러리가 언제 필요한지 언제 제외되는지를 나태는것으로 따로 검색 해보면 알 수 있다.*/
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
 	/* 빌드정보
    build tool : maven의 핵심인 빌드와 관련된 정보를 설정할 수 있는 곳이다.*/
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
 

 

메이븐의 모든 기능은 플러그인(plug-in)을 기반으로 동작한다.

플러그인에서 실행할 수 있는 각각의 작업을 골(goal)이라고 하나의 페이즈는 하나의 골과 연결되며, 하나의 플러그인에는 여러개의 골이 있을 수 있다.

 

* 라이프 사이클

mvn process-resources : resources:resources의 실행으로 resource 디렉토리에 있는 내용을 target/classes로 복사한다.
mvn compile : compiler:compile의 실행으로 src/java 밑의 모든 자바 소스를 컴파일해서 target/classes로 복사
mvn process-testResources, mvn test-compile : 이것은 위의 두 개가 src/java였다면 test/java의 내용을 target/test-classes로 복사. (참고로 test만 mvn test 명령을 내리면 라이프사이클상 원본 소스로 컴파일된다.)
mvn test : surefire:test의 실행으로 target/test-classes에 있는 테스트케이스의 단위테스트를 진행한다. 결과를 target/surefire-reports에 생성한다.
mvn package : target디렉토리 하위에 jar, war, ear등 패키지파일을 생성하고 이름은 <build>의 <finalName>의 값을 사용한다 지정되지 않았을 때는 아까 설명한 "artifactId-version.extention" 이름으로 생성
mvn install : 로컬 저장소로 배포
mvn deploy : 원격 저장소로 배포
mvn clean : 빌드 과정에서 생긴 target 디렉토리 내용 삭제
mvn site : target/site에 문서 사이트 생성
mvn site-deploy : 문서 사이트를 서버로 배포
위와 같은 진행 순서로 라이프 사이클이 진행된다. 

* build 설정 값

이제 <build>에서 설정할 수 있는 값을 확인해보자.
<finalName> : 빌드 결과물(ex .jar) 이름 설정
<resources> : 리소스(각종 설정 파일)의 위치를 지정할 수 있다.

- <resource> : 없으면 기본으로 "src/main/resources"

<testResources> : 테스트 리소스의 위치를 지정할 수 있다.

- <testResource> : 없으면 기본으로 "src/test/resources"

: 빌드할 때 접근할 저장소의 위치를 지정할 수 있다. 기본적으로 메이븐 중앙 저장소인 http://repo1.maven.org/maven2로 지정되어 있다.

<outputDirectory> : 컴파일한 결과물 위치 값 지정, 기본 "target/classes"

<testOutputDirectory> : 테스트 소스를 컴파일한 결과물 위치 값 지정, 기본 "target/test-classes"

<plugin> : 어떠한 액션 하나를 담당하는 것으로 가장 중요하지만 들어가는 옵션은 제 각각이다. 다행인 것은 플러그인 형식에 대한 것은 안내가 나와있으니 그것을 참고해서 작성하면 된다.

plugin이 작성되어 있다고 무조건 실행되는 것은 아니다. 명확한 것은 아니지만 따로 실행할 플러그인을 메이븐 명령어로 실행해야 하는 것으로 알고 있다.

- <executions> : 플러그인 goal과 관련된 실행에 대한 설정

- <configuration> : 플러그인에서 필요한 설정 값 지정

apache CXF를 이용한 code generate 플러그인은 아래에서 소개되고 사용한다.

ALT  + ENTER 

인텐션 액션 (=자동완성 기능)으로 사용한다, 또한 코드에서 오류가 발견된 경우 해당 오류 위에서 ALT+ENTER를 누르면 문제 수정제안 목록이 표시된다.

 

ALT + 1

해당 소으의 도구 창을 열어 해당 소스를 표시한다.

--> ESC 누르면 다시 돌아온다.

 

CTRL + E

최근 실행했던 파일들을 확인 가능하다.

 

CTRL + B 

선언으로 이동하는 단축키, 구현 부분으로 이동한다.

 

CTRL + SHIFT + F

전체 프로젝트에서 특정 키워드 검색

 

SHIFT + SHIFT

전체 프로젝트에서 소스코드 이름으로 검색 

'Java' 카테고리의 다른 글

[Java] Java 8 에서의 변경사항  (0) 2022.05.05
추상클래스 vs 인터페이스  (0) 2022.04.07
GC (Garbage Collector)  (0) 2022.04.06
Java & Spring 버전 특징 정리  (0) 2022.04.04
객체의 래퍼클래스(WrapperClass)  (0) 2021.09.16

배치 처리

퇴근 시간 이후 기계를 놀리면 이만저만 낭비가 아니므로 당일 처리할 업무를 모아놨다가 한꺼번에 처리하면 어떨까 고민하게 되었고 이것이 배치 처리의 발전으로 이어졌다.

배치 처리는 보통 대용량 데이터를 대상으로 실행되며 그 처리 시간이 아키텍처 및 구현상 결정적인 요소로 작용한다.

 

스프링 배치 등장 이유

스프링 배치 애플리케이션은 보통 대용량 데이터를 읽어 변환된 형식으로 다시 출력합니다. 드랜잭션 경계, 입력 크기, 동시성, 처리 단계의 차수 등 연계까지 생각하면 결정해야 할 요소가 많습니다. B2B거래, CSV파일을 로드해 DB레코드를 처리하는 일은 가장 흔한 배치 사례이다. DB레코드 자체를 수정하는 게 출력 결과인 경우도 있다.

 

스프링 배치가 하지 못하는 일

중요한 부분은 구현하는 개발자의 재량에 맡깁니다.  이미 있는 건 가급적 다시 안 만들겠다는 스프링 철학 토대

 

스프링 배치 저장소

JobRepository (메타 데이터 항목 저장 용도로 스프링 배치가 기본 제공하는 인터페이스)

.

런타임 메타데아터 모델

스프링 배치는 잡 단위로 모든 정보와 메티데이터를 총괄한 JobRepository를 중심으로 작동하며 각 잡은 하나 이상의 순차적인 스텝으로 구성됩니다.

스프링 배치 구조

스프링 배치는 백엔드의 배치처리 기능을 구현하는데 사용하는 프레임워크이다. 

배치의 일반적인 시나리오는 다음과 같은 3단계로 이루어집니다.

  1. 읽기(Read) : DB에서 특정 데이터 레코드를 읽는다.
  2. 처리(Processing) : 원하는 방식으로 데이터 가공/처리 합니다.
  3. 쓰기(Write) : 수정된 데이터를 다시 저장소(DB)에 저장합니다.

배치 처리 

 

  • job과 step은 1:M
  • Step과 itemReader, itemProcessor, itemWirter 1:1 관계이다.
  • Job이라는 하나의 큰 일감(Job)에 여러 단계 (Step)을 두고, 각 단계를 배치의 기본 흐름대로 구성합니다.

Job

  • Job은 배치 처리 과정을 하나의 단위로 만들어 표현한 객체입니다. 또한 전체 배치 처리에 있어 항상 최상단 계층에 있습니다.
  • 위에서 하나의 Job(일감) 안에는 여러 Step(단계)이 있다고 설명했던 바와 같이 스프링 배치에서 Job 객체는 여러 Step 인스턴스를 포함하는 컨테이너 입니다.
  • Job 객체를 만드는 빌더는 여러 개 있습니다. 여러 빌더를 통합하여 처리하는 공장인 JobBuilderFactory원하는 Job을 쉽게 만들수 있습니다.
public SimpleJobBuilder start(Step step){
	/* (1) Step을 추가해서 가장 기본이 되는 SimpleJobBuilder를 생성합니다. */
    return new SimpleJobBuilder(this).start(step); 
}

public JobFlowBuilder start(Flow flow){
	/* (2) Flow를 실행할 JobFlowBulder를 생성한다. */
	return new JobFlowBuilder(this).start(flow);
}

public JobFlowBuilder flow(Step step){
	/* (3) Step을 실행할 FlowJobBulder를 생성한다. */
    return new JobFlowBuilder(this).start(step);
}
  • JobBuilder는 직접적으로 Job을 생성하는 것이 아니라 별도의 구체적 빌더를 생성하여 변환하여서 경우에 따라 Job생성 방법이 모두 다를수 있는 점을 유연하게 처리할 수 있습니다.

JobInstance 

  • JobInstance는 배치 처리에서 Job이 실행 될 때 하나의 Job 실행 단위이다 만약 하루에 한 번 씩 배치의 Job이 실행된다면 어제와 오늘 실행 각각 Job을 JobInstance라고 부를 수  있습니다.
  • 각각의 JobInstance는 하나의 JobExecution을 갖는 것은 아니다. 오늘 Job이 실행 했는데 실패했다면 다음날 동일한 JobInstance를 가지고 또 실행됩니다.
  • Job 실행이 실패한다면 Jobinstance가 끝난것으로 간주하지 않기 때문입니다. 그렇다면 JobInstance는 어제 실패한 JobExecution과 오늘 성공한 JobExecution 두 개를 가지게 됩니다. 즉 JobExecution은 여러개 가질 수 있습니다.
요약
1. JobInstance
는 Job이 실행 된다는 실행 단위
2. JobInstance는 어제 실행 한것이랑 오늘 실행한것이 같을수 없다는 것
3, JobInstance는 하나의 jobexecutiion을  갖는게 아니라는 것 왜냐면 성공,실패에 따라서 두 개의 JobExecution을 가질 수 있기 때문에. 그러면 JobExecution이란?

 

JobExcution

  • JobExcution은 JobIstance에 대한 한 번의 실행을 나타내는 객체이다. 만약 오늘 Job이 실패해 내일 다시 동일한 Job을 실행하면 오늘/내일의 실행 모두 JobInstance 를 사용합니다.
  • 실제로 JobExcution 인터페이스르 보면 Job 실행에 대한 정보를 담고 있는 도메인 객체가 있습니다.
  • JobExcution은 JobInstace, 배치 실행 상태, 시작 시간, 끝난 시간, 실패했을 때 메시지 등의 정보를 담고 있습니다. JobExcution 객체 안에 어떤 실행 정보를 포함하고 있습니다. 
요약
1. JobExcution은 JobInstance의 한 번의 실행을 나타내는 객체이다. 
2. 오늘 Job이 실패하면 내일 동일한 Job이 실행된다. 그러면 오늘/내일 실행 모두 JobInstance를 사용한다.
3. JobExcution을 보면 Job에 대한 정보가 담겨있다.
4. JobExcution 에는 JobInstace, 배치 실행 상태, 시작 시간, 끝난 시간, 실패했을 때 메시지를 가지고 있다. 

JobParameters

  • JobParameters는 Job이 실행될 때 필요한 파라미터들은 Map 타입으로 지정하는 객체입니다.
  • JobParameters는 JobInstance를 구분하는 기준이 되기도 합니다.
  • JobParameters와 Jobinstance는 1:1 관계이다.

Step

  • Step은 실질적인 배치 처리를 정의하고 제어 하는데 필요한 모든 정보가 있는 도메인 객체, Job을 처리하는 실질적인 단위로 쓰인다.
  • 모든 Job에는 1개 이상의 Step이 있어야한다.
요약
1. Job을 처리하는 실질적인 단위

StepExecution

  • Job에 JobExecution Job 실행 정보가 있다면 Step에는 StepExecution이라는 Step 실행 정보를 담는 객체가 있다.

JobRepository

  • JobRepository는 배치 처리 정보를 담고 있는 매커니즘입니다. 어떤 Job이 실행되었으면 몇 번 실행되었고 언제 끝났는지 등 배치 처리에 대한 메타데이터를 저장합니다.
  • 예를들어 Job하나가 실행되면 JobRepository에서는 배치 실행에 관련된 정보를 담고 있는 도메인 JobExecution을 생성합니다.
  • JobRepository는 Step의 실행 정보를 담고 있는 StepExecution도 저장소에 저장하여 전체 메타데이터를 저장/관리하는 역할을 수행합니다.
요약
1. 배치 처리 정보를 담고 있는 저장소이다. 
2. Job이 실행되면 JobExecution을 생성합니다.

JobLauncher

  • JobLauncher는 Job, JobParameters와 함께 배치를 실행하는 인터페이스이다.

ItemReader

  • ItemReader는 Step의 대상이 되는 배치 데이터를 읽어오는 인터페이스입니다. File, XML Db등 여러 타입의 데이터를 읽어올 수 있다.

ItemProcessor

  • ItemProcessor는 ItemReader로 읽어 온 배치 데이터를 변환하는 역할을 수행합니다. 이것을 분리하는 이유는
  • 비즈니스 로직의 분리 : ItemWriter는 저장을 수행하고, ItemProcessor는 로직 처리만 수행해 역할을 명확하게 분리합니다.
  • 읽어온 배치 데이터와 씌여질 데이터의 타입이 다를 경우에 대응할 수 있기 때문입니다.
요약
1. 읽어온 배치 데이터를 변환하는 역할을 한다.
2. 읽어온 배치 데이터와 씌여질 데이터의 타입이 다를 경우에 대응가능.

ItemWriter

  • ItemWriter는 배치 데이터를 저장합니다. 일반적으로 DB나 파일에 저정합니다.
  • ItemWriter도 ItemReader와 비슷한 방식으로 구현합니다. 제네릭으로 원하는 타입을 받고 write() 메서드는 List를 사용해서 저장한 타입의 리스트를 매개변수로 받습니다.
잡은 보통 실행 시점에 JobParameter와 엮어 Job 자신의 런타임 로직매개변수화합니다.
(예를 들면 특정 날짜에 해당되는 레코드만 처리하는 잡이 그런 경우이다.)
그리고 잡 실행을 식별하기 위해 JobInstance를 생성합니다. 
JobParameter가 연관 되어 있으니 JobInstance는 하나밖에 없겠죠.
같은 JobInstance(즉, 같은 Job+ JobParameter 세트가 실행되는 것을 jobExecution이라고 부릅니다.)
JobExecution은 잡 버번에 대한 런타임 컨텍스트로, 이상적으로는 JobInstance당 하나의 jobExecution은 잡 (제일 처음 JobInstance가 실행될 때 만들어진 JobExecution)이 존재합니다. 
그러나 도중 에러가 나면 JobInstance는 다시 시작해야하고 그러다 보면 jobExecution이 하나 더 만들어지겠죠.
초기 잡에 속한 각 스템의 JobExecution에는 SteExecution이 있습니다.
개념 설명
Job  
JobInstance  
JobExecution  
JobRepository 스프링 배치의 첫 단추, 핵심 중의 핵심. 
JobRepository 인스턴스는 DB를 전제로 작동하므로 스프링 배치용 스키마는 미리 구성되어 있어야 한다. 
DataSourceInitializer를 사용하는 것이 db를 초기화하는 가장 간단한 방법이다. 
   

 

배치 애플리케이션

배치를 적용한 애플리케이션

  • 매출 데이터를 이용한 일매출 집계
  • 매우 큰 데이터를 활용한 보험급여 결정
  • 트랜잭션 방식으로 포맷, 유효성 확인 및 처리가 필요한 내부 및 외부 시스템에서 수신한 정보를 기록 시스템으로 통합

 

 

배치(Batch)란 일괄처리 란 뜻을 가지고 있다.

시사점
웹 어플리케이션 = Tomcat + Spring MVC 라고 떠올리면 큰 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 CPU, I/O, 등을 다 써버려서 Request처리를 하지 못하게 됩니다.집계기능은 하루에 1번 수행하게 됩니다. 이를 위해 API를 구성하는 것은 너무 낭비이다. 여기서 추가로 데이터가 너무 많아서 처리가 실패하면 비효율적이게 된다.(끝판왕)또한, 누군가 집계 함수를 실행시켰는데 다른 누군가 또 실행시켜 집계 데이터가 2배로 뻥튀기 될 수도 있다. 

따라서 같은 파라미터로 같은 함수를 실행할 경우 이미 실행한 적이 있어 실패하는 기능을 지원하면 좋을 것 같음.

바로 이런 단발성으로 대용량의 데이터를 처리하는 어플리케이션을 배치 어플리케이션이라고 합니다.

Spring MVC를 사용하기 때문에 비즈니스 로직에 최대한 집중 할 수 있다.

Spring 진영에선 Spring Batch가 있다.

대용량 데이터 - 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리

자동화 - 심각한 문제 해결을 제외하고는 사용자의 개입 없이 실행
견고성 - 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야한다.

신뢰성 - ?

성능 - 지정한 시간 안에 처리를 완료하거나 동시에 실행하는 다른 App을 방해하지 않도록 수행

 

Spring의 3대요소 : 1) DI, 2)AOP, 3)서비스추상화

현재 Spring Batch 4.0 (Spring Boot 2.0) 에서 지원하는 Reader & Writer 

DataSource 기술 설명
DB JDBC 페이징, 커서 ,일괄 업데이트 등 사용
DB Hibernate 페이징, 커서
DB JPA 페이징 사용 가능
File Flat file 지정한 구분자로 파싱 지원
File XML XML파싱 지원

 

 

일매출 집계

많은 거래가 이루어지는 커머스 사이트의 경우 하루 거래건이 50만~100만까지 나옵니다. 이럴 경우 이와 관련된 데이터는 최소 100만~200만 row 이상입니다. 한달이면 5000만 ~1억까지 될수도 있습니다. 이를 실시간으로 집계 쿼리로 해결하기엔 조회시간이나 서버 부하가 심합니다. 그래서 매일 새벽에 전날 매출 집계 데이터를 만들어서 외부 요청이 올 경우 미리 만들어준 집계 데이터를 바로 전달하면 성능과 부하를 모두 잡을 수 잇습니다. 

Spring Batch 프로젝트 개발 환경

  • IntelliJ IDEA
  • Spring Boot
  • Java 8
  • Gradle

lombok 기능을 많이 사용한다. lombok 플러그인을 본인의 IDE에 맞게 설치하면 좋다.

 

배치의 도메인 용어

JobLaucncher <-> jobRepository

Job <-> jobRepository

Stop <-> jobRepository

  • ItemReader
  • ItemProcessor
  • ItemWirter

+ Recent posts