목차

    DNS란

    • www.example.com과 같이 사람이 읽을 수 있는 이름을 192.0.2.1과 같은 숫자 IP 주소로 변환하여 컴퓨터가 서로 통신할 수 있도록 한다.
    • 인터넷의 DNS시스템은 이름과 숫자 간의 매핑을 관리하여 마치 전화번호부와 같은 기능
    • DNS 서버는 이름에 대한 요청을 IP주소로 변환하여 최종 사용자가 도메인 이름을 웹 브라우저에 입력할 때 해당 사용자를 어떤 서버에 연결할 것인지를 제어한다. (=쿼리)

    Domain 구조

    • 인터넷상에서 사용되는 도메인은 전 세계적으로 고유하게 존재
    • 인터넷상의 모든 도메인은 ".(dot)' 또는 루트(root)라 불리는 도메인 아래에 그림과 같이 나무를 거꾸로 위치시킨 역트리(Inverted tree) 구조로 계층적으로 구성되어 있음


    DNS 동작 원리

    1. 웹 브라우저에 www.naver.com을 입력 먼저 Local DNS에게 "www.naver.com"이라는 hostname에 대한 IP주소를 질의하여 Local DNS에 없으면 DNS name 서버 정보를 받음(Root DNS 정보 전달 받음)
    2. Root DNS 서버에 "www.naver.com" 질의
    3. Root DNS 서버로 부터 "com 도메인'을 관리하는 TLD(Top-Level Domain) 이름 서버 정보 전달 받음
    4. TLD에 "www.naver.com" 질의
    5. TLD에서 "name.com" 관리하는 DNS 정보 전달
    6. "naver.com" 도메인을 관리하는 DNS서버에 "www.naver.com" 호스트 네임에 대한 IP주소 질의
    7. Local DNS 서버에게 "응!www.naver.com"에 대한 ip주소는 222.122.195.6 응답
    8. Local DNS는 www.naver.com에 대한 IP주소를 캐싱을 하고 IP주소 정보 전달

    CS Hosts 셋팅

    $sodo vi /etc/hosts

    127.0.0.1       callcms-local.tmon.co.kr csadmin-local.tmon.co.kr csapi-local.tmon.co.kr fncms-local.tmon.co.kr chatcms-local.tmon.co.kr ptncms-local.tmon.co.kr  csinavtiveapi-local.tmon.co.kr
    127.0.0.1       spc-cs-local.tmon.co.kr ps-cs-local.tmon.co.kr
    127.0.0.1       help-local.tmon.co.kr m-help-local.tmon.co.kr
    127.0.0.1       cschatnode-local.tmon.co.kr
    127.0.0.1       csserviceapi-local.tmon.co.kr
    127.0.0.1       my.local.tmon.co.kr

     

    'TMON > CS' 카테고리의 다른 글

    [Tomcat] 포트와 Connector  (0) 2021.11.16

    형 변환 정리

    Before After java c++
    int string int From =123;
    String to  = Integer.toString(from)
    string str = to_string(num);
    string int String From = "123";
    int to = Intger.parseInt(From);
    int num = stoi(str);
    char string ex1) char c = 'a';
    String str = String.valueOf(c);
    *속도 가장 빠름

    ex2) char[] arrCh = {'a','b','c'};
    String str = String.valueOf(arrCh);

    ex3) char c = 'a';
    String str = Character.toString(c);
    *arrCh 배열은 불가

    ex4) char c = 'a';
    String str = ch +"" ;
    string str(char);
    string char String str = "안녕하세요";
    char c = input.charAt(인덱스);
    str[0] = char
    long string 1. String str = String.valueOf(n);
    2. String str = "" + n ; 
    문자열 = 문자열 + 숫자;
    string str = to_string(num);
    string long ex) String temp = String.join("",arr);
    long answer = Long.parseLong(temp); 
    string str = stol(num);

     

    더보기
      세션 수강여부 기한
    1강 스프링 개요 O -
    2강 개발 환경 구축 O -
    3강 스프링 프로젝트 생성 O -
    4강 처음해 보는 스프링 프로젝트 O -
    5강 또 다른 프로젝트 생성 방법 O -
    6강 DI(Dependency injection) O -
    7강 다양한 의존 객체 주입 O -
    8강 스프링 설정 파일 분리 O 12/23
    9강 의존 객체 자동 주입 O 12/23
    10강 의존객체 선택 O 12/24
    11강 생명주기 Life Cycle O 12/24
    12강 어노테이션을 이용한 스프링 설정 -1 O 12/27
    13강 어노테이션을 이용한 스프링 설정 -2 O 12/27
    14강 ***웹 프로그래밍 설계 모델*** O 12/28
    15강 스프링 MVC 웹서비스 O 12/28
    16강 STS를 이용하지 않은 웹 프로젝트 O 12/29
    17강 Service & Dao 객체 구현 O 12/29
    18강 Controller 객체 구현 O 12/30
    19강 Controller 객체 구현 O 12/30
    20강 세션, 쿠키 O 12/31
    21강 리다이렉트, 인터셉트 O 12/31
    22강 Database O 1/2
    23강 JDBC O 1/2
    24강 JdbcTemplate O 1/3
    25강 커넥션풀   1/3

    1-1 스프링 프레임워크

    스프링 프레임워크의 주요기능은 DI, AOP, MVC, JDBC 등을 제공한다.

    1-2 스프링 프레임워크 모듈

    스프링 모듈 기능
    spring-core 스프링의 핵심인 DI(Depnedency Injection)와 IoC(Inversion of Control)를 제공한다.
    spring-aop AOP구현 기능 제공
    spring-jdbc 데이터베이스를 쉽게(적은 양의 코드)다룰 수 있는 기능 제공
    spring-tx 스프링에서 제공하는 트랜잭션 관련 기능 제공
    spring-webmvc 스프링에서 제공하는 컨트롤러(Controller)와 뷰(view)를 이용한 스프링MVC 구현 기능 제공

    스프링 프레임워크에서 제공하는 모듈을 사용하려면, 모듈에 대한 의존설정을 개발 프로젝트에 XML 파일등을 이용해 개발자가 직접 하면된다. 

     

    1-3 스프링 컨테이너(IoC)

    스프링에서 객체를 생성하고 조립하는 컨테이너(container)로, 컨테이너를 통해 생선된 객체를 빈(Bean)이라고 부른다.

    1) 객체생성 및 속성 데이터 작성

    2) 스프링 컨테이너에서 객체 생성 및 조립

    3) 애플리케이션 구현

    필요할 때마다 스프링컨테이너에서 기능을 빼서 쓰는 개념이다.sprin 


    (2강 개발환경설정)

    3-1 프로젝트 생성

    groupId와 artifactId

    groupId 큰 프로젝트 단위 지하철(1~9호선)
    artifactId 세부 프로젝트 단위 1호선, 2호선, 3호선...

    3-2 pom.xml 작성

    pom.xml

    필요한 모듈을 가져오는 기능

    3-3 폴더 및 pom.xml 파일의 이해(기본 폴더 디렉토리)

    • src/main
      • src/main/java
        • 특별한 것은 없고, 앞으로 만들어지는 자바 파일들이 관리되는 곳이다. 
      • src/main/resource
        • 자원을 관리하는 폴더로 스프링 설정파일(XML) 또는 프로퍼티 파일 등이 관리된다.
    • src/test

    4-1 처음해보는 스프링 프로젝트

    java 객체생성 및 Bean 생성

    기존 java 객체 생성

    //기존 자바 객체생성 (main)
    TranspotationWalk transpotationWalk = new TranspotationWalk();
    transpotationWalk.move();
    
    //TranspotationWalk
    public void move(){
            System.out.println("도로로 이동 합니다.");
        }

    Spring Bean이용 IoC생성

    //XML Bean 추가
    <bean id="tWalk" class ="testPjt.TranspotationWalk"/>
    
    //main
    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");
    TranspotationWalk transpotationWalk = ctx.getBean("tWalk",TranspotationWalk.class);
    transpotationWalk.move();
    
    ctx.close();

    6-1 DI(Dependency Injection) 의존성 주입

    배터리 일체형 : 의존성 없음 / 배터리가 떨어지면 새로 구입해야한다.(비효율)

    public class ElectronicCarToy{
    	private Battery battery;
        public ElectoincCarToy(){
        	battery=new NormalBattery();//객체 생성될때 new해준다.
        }
    }

    배터리 분리형1 : 초기에는 배터리X, 사용자가 넣어줘야함(의존성 주입)

    public class ElectronicCarToy{
    	private Battery battery;
        public ElectoincCarToy(){
        	
        }
        //setter
        public void setBattery(Battery battery){
        	this.battery = battert;
        }
    }

    배터리 분리형2 : 초기에 배터리O, 사용자가 배터리 교체(의존성 주입)

    public class ElectronicCarToy{
    	private Battery battery;
        //생성자
        public ElectoincCarToy(){
        	this.batter=battery;
        }
        //setter
        public void setBattery(Battery battery){
        	this.battery = battert;
        }
    }

    같은 DB 사용하기(DAO 의존성 주입)

    public StudentAssbler(){
    	studentDAO = new StudentDAO(); //DAO 생성=DB
        registerService = new registerService(studentDAO);
        modifyService = new ModifyService(studentDAO);
        deleteService = new DeleteService(studentDAO);
        selectService = new SelectService(studentDAO);
        allSelectService = new AllSelectService(studentDAO);
     }

    studentDAO를 각각의 객체에 주입함으로써 같은 DB를 공유한다. 만약 각각의 객체에서 studentDAO를 생성했다면 각각 다른 DB를 사용하는 것이다.

    상기 코드를 Spring ApplicationContext화 하겠다. IoC(제어의 역전) 사용하기

    //applcationContext.xml
    
    //studentDao Bean 생성
    <bean id ="studentDao" class="ems.member.dao.StudentDao"> </bean>
    
    //의존성 주입
    <bean id ="registerService" class="ems.member.service.StudentRegisterService">
    	<constructor-arg ref="studentDao"> </constructor-arg>
    </bean>
    .
    .
    .

    7강 다양한 의존 객체 주입

    스프링의 의존 객체를 주입하는 다양한 방법

      java spring 비고
    7-1 생성자를 이용한 의존 객체 주입
    1) 네이밍이 중요하다 첫 글자는 무조건 소문자이다.
    7-2 setter를 이용한 의존 객체 주입
    1) 첫 글자는 소문자
    2) setter의 set을 제외시킨다.
    3) 보통 db연동에서 많이 쓰인다.(초기화)
    7-3 List타입 의존 객체 주입
    객체를 리스트로 받는 경우도 있다. 그런 경우 사용한다.
    7-4 Map타입 객체 주입
    객체를 map(key,value)형식으로 받는 경우도 있다. 그런 경우 사용한다.

     


     

    'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

    어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27
    생명주기(Life Cycle)  (0) 2021.12.24
    의존객체 선택  (0) 2021.12.24
    의존객체 자동 주입  (0) 2021.12.23
    스프링 설정 파일 분리  (0) 2021.12.23
    자바의 자료형
    자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있다.
    래퍼클래스
    프로그래밍을 하다보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있습니다. 이럴 때 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다. 
    자바는 모든 기본타입은 값을 갖는 객체로 생성할 수 있습니다. 이런 객체를 포장 객체라고 하는데 그 이유는 기본 타입의 값을 내부로 두고 포장하기 때문입니다. 래퍼 클래스로 감싸고 있는 기본 타입의 값은 외부에서 변경할수 없습니다.
    기본타입(primitive type) 래퍼 클래스(wrapper class)
    byte Byte
    char Character
    int Integer
    float Float
    double Double
    log Long
    public class Wrapper_Ex
    	public static void main(String[] args){
        	Integer num = new Integer(17); //박싱
            int n = num.IntValue(); //언박싱
            System.out.println(n);
        }
    }
    
    //자동 박싱(AutoBoxing), 자동 언박싱(AutoUnBoxing)
    public class Wrapper_Ex
    	public static void main(String[] args){
        	Integer num = 17;
            int n = num;
        }
    }
    
    //래퍼클래스 사용 예제
    public class Wrapper_Ex {
        public static void main(String[] args)  {
            String str = "10";
            String str2 = "10.5";
            String str3 = "true";
            
            byte b = Byte.parseByte(str);
            int i = Integer.parseInt(str);
            short s = Short.parseShort(str);
            long l = Long.parseLong(str);
            float f = Float.parseFloat(str2);
            double d = Double.parseDouble(str2);
            boolean bool = Boolean.parseBoolean(str3);
    		
            System.out.println("문자열 byte값 변환 : "+b);
            System.out.println("문자열 int값 변환 : "+i);
            System.out.println("문자열 short값 변환 : "+s);
            System.out.println("문자열 long값 변환 : "+l);
            System.out.println("문자열 float값 변환 : "+f);
            System.out.println("문자열 double값 변환 : "+d);
            System.out.println("문자열 boolean값 변환 : "+bool);
        }
    }

    값 비교

    public class Wrapper_Ex {
        public static void main(String[] args)  {
            Integer num = new Integer(10); //래퍼 클래스1
            Integer num2 = new Integer(10); //래퍼 클래스2
            int i = 10; //기본타입
    		 
            System.out.println("래퍼클래스 == 기본타입 : "+(num == i)); //true
            System.out.println("래퍼클래스.equals(기본타입) : "+num.equals(i)); //true
            System.out.println("래퍼클래스 == 래퍼클래스 : "+(num == num2)); //false
            System.out.println("래퍼클래스.equals(래퍼클래스) : "+num.equals(num2)); //true
        }
    }
    • 래퍼클래스 == 기본타입 : true
    • 래퍼클래스.equals(기본타입) : true
    • 래퍼클래스 == 래퍼클래스 : false
    • 래퍼클래스.equals(래퍼클래스) : true

    래퍼클래스 끼리 비교할때는 equals를 써야한다.

    '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
    IntelliJ IDEA 단축키  (0) 2021.01.28

    거래명세서 생성

    Step1 Step2 Step3 Step4
    고객 데이터 가져오기 거래 정보 데이터 가져오기 현재 잔액 계산하기 월별 고객 거래명세서 생성

    고객 데이터 가져오기

    • 스프링 배치는 스텝 내에서 사용 하는 여러 레코드 형식을 처리할 수 있는 기능을 제공한다.
    • 데이터를 읽을 수 있다면, 쓰기 처라할 때 오류를 최소하도록 ItemProcessor를 사용해 데이터 유효성을 검증한다.
    • 다음 적절한 ItemWriter 구현체를 사용해 레코드 유형에 따라 적절하게 데이터를 갱신한다.

    거래 정보 데이터 가져오기

    고객 데이터를 가져온 후 거래 데이터를 가져온다. 스프링 배치는 강력한 ItemReader 및 ItemWriter 구현체를 제공하므로, 이 스텝에서는 XML을 읽은 뒤 데이터베이스에 기록하는 구현체를 사용할 수 있다. 

    다음은 거래 XML 파일의 입력 예다.

    <?xml version="1.0" encoding="UTF-8" ?>
    <transaction>
    	<transaction>
        	<transactionId>1</transactionId/>
            <accoutId>15</accoutId>
            <credit>5.62</credit>
            <debit>1.95</debit>
            <timestamp>2017-07-12 12:05:21 </timestamp>
         </transaction>
         <transaction>
         	<transactionId>2</transactionId/>
            <accoutId>68</accoutId>
            <credit>5.27</credit>
            <debit>6.26</debit>
            <timestamp>2017-07-12 16:28:37 </timestamp>
         </transaction>
      .
      .
      .

    현재 잔액 계산하기

    거래 데이터를 가져온 뒤 계좌 테이블의 잔액도 갱신해야한다.

     

    월별 고객 거래명세서 생성

    • 먼저 ItemReader를 사용해 데이터베이스에서 고객 데이터를 읽어 온다.
    • 그 뒤 각 거래명세서 작성에 필요한 모든 데이터를 추가하는 일을 담당하는 ItemProcessor에게 해당 고객 데이터를 보낸다.
    • 그리고 최종적으로 필요한 모든 데이터의 추가가 완료된 아이템을 파일 기반 ItemWriter에게 전달한다.

     

     

    웹 프레임워크에는 MVC 패턴이라는 것이 있고 특정 MVC 프레임워크를 이해하고 나면 다른 MVC 프레임워크를 사용하더라도 서로 다른 문법적 차이만 이해하면 된다. 그러나 배치 프레임워크는 종류가 많지 않다. 그래서 배치 프레임워크는 분야가 조금 생소할 수 있다. 
    job(잡)이나 Step(스텝)이 무엇인지?
    ItemReader와 ItemWriter가 어떻게 연관돼 있는지
    Tasklet이 무엇인지?
    2장에서는 위의 질문에 대한 답을 할 것이다.


    잡과 스텝

    배치 잡

    ex) 은행업무
    Step1 : 다른 시스템에서 수신한 거래 정보 파일을 읽어와 데이터베이스에 저장한다.
    Step2 : 모든 입금 정보를 계좌에 반영한다.
    Step3 : 모든 출금정보를 계좌에 반영한다.

     

    각 스텝은 잡을 구성하는 독립된 작업의 단위라는 것을 알 수 있다.

    스탭

    • 테스크릿(tasklet) 기반 스텝
    • 청크(chunk) 기반 스텝

    테스크릿(tasklet) 기반 스텝

    스텝이 중지될 때까지 execute 메서드가 반속해서(execute 메서드를 호출할 때마다 독립적인 트랜잭션이 얻어짐) 수행 된다. 

    • 초기화
    • 저장 프로시저 실행 
    • 알람 전송

    청크(chunk) 기반 스텝

    약간 스텝의 구조가 복잡하며, 아이템 기반의 처리가 사용된다. 

    • ItemReader(필수)
    • ItemProcessor(선택)
    • ItemWriter(필수)

    ItemReader와 ItemWrier만으로 구성해 스텝을 진행 할 수도 있다.(이러한 스텝은 데이터 마이그레이션 잡에 일반적으로 사용된다.)

     

    배치 잡을 구성하는 인터페이스

    인터페이스 설명
    org.springframework.batch.core.Job ApplicationContext 내에 구성되는 잡 객체
    org.springframework.batch.core.Step ApplicationContext 내에 구성되는 스텝을 나타내는 객체
    org.springframework.batch.core.step.tasklet.Tasklet 트랜잭션 내에서 로직이 실행 될 수 있는 기능을 제공하는 전략(Strategy) 인터페이스
    org.springframework.batch.item.itemReader<T> 스텝 내에서 입력을 제공하는 전략 인터페이스
    org.springframework.batch.item.itemProccesor<T> 스텝 내에서 제공받은 개별 아이템(item)에 업무 로직, 검증 등을 적용하는 역할을 하는 인터페이스
    org.springframework.batch.item.itemWriter<T> 스텝 내에서 아이템을 저장하는 전략 인터페이스

     

    잡 실행

    JobRepository

    JobLauncher

    개발자가 구현하기에 따라 역할이 달라진다.

    • Job.execute메서드를 호출하는 역할 
    • 잡의 재실행 가능 여부 검증(모든 잡을 재시작할 수 있는 것은 아님)
    • 잡의 실행 방법(현재 스레드에서 수행할지 스레드 풀을 통해 실행할지 등)
    • 파라미터 유효성 검증

    잡을 실행하면, 해당 잡은 각 스텝을 실행한다. 각 스텝이 실행되면 JobRepository는 현재 상태로 갱신된다. 즉, 실행된 스텝, 현재 상태, 읽은 아이템 및 처리된 아이템 수 등이 모두 JobRepository에 저장된다.

     

    병렬화

    가장 단순한 방법은 배치 처리 아키텍처는 잡 내의 스텝을 처읍부터 끝까지 순서대로 단일 스레드에서 진행하는 것이다. 하지만 스프링 배치는 실 사례에 필요한 벙렬화 방버을 제공한다. 

    • 다중 스레드 스텝을 통한 작업 분할
    • 전체 스텝의 병렬 실행
    • 비동기 ItemProcessor/ItemWriter 구성
    • 원격 청킹
    • 파티셔닝

    package io.spring.batch.helloworld;
    
    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.Step;
    import org.springframework.batch.core.StepContribution;
    import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
    import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
    import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
    import org.springframework.batch.core.scope.context.ChunkContext;
    import org.springframework.batch.core.step.tasklet.Tasklet;
    import org.springframework.batch.repeat.RepeatStatus;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    //새롭게 추가1
    @EnableBatchProcessing
    @SpringBootApplication
    public class HelloWorldApplication {
    //새롭게 추가2
    	@Autowired
    	private JobBuilderFactory jobBuilderFactory;
    //새롭게 추가3
    	@Autowired
    	private StepBuilderFactory stepBuilderFactory;
    
    	@Bean
    	public Step step() {
    		return this.stepBuilderFactory.get("step1")
    				.tasklet(new Tasklet() {
    					@Override
    					public RepeatStatus execute(StepContribution contribution,
    							ChunkContext chunkContext) {
    						System.out.println("Hello, World!");
    						return RepeatStatus.FINISHED;
    					}
    				}).build();
    	}
    
    	@Bean
    	public Job job() {
    		return this.jobBuilderFactory.get("job")
    				.start(step())
    				.build();
    	}
    
    	public static void main(String[] args) {
    		SpringApplication.run(HelloWorldApplication.class, args);
    	}
    }

     

    @EnableBatchProcessing 에너테이션의 역할

    이 에너테이션은 배치 인프라스트럭처를 위한 대부분의 스프링 빈 정의를 제공하므로 다음과 같은 컴포넌트를 직접 포함시킬 필요는 없다

    컴포넌트 설명
    JobRepository 실행 중인 잡의 상태를 기록하는 데 사용됨
    JobLauncher 잡을 구동하는 데 사용됨
    JobExplorer JobRepository를 사용해 읽기 전용 작업을 수행하는 데 사용
    JobRegistry 특정한 런처 구현체를 사용할 때 잡을 찾는 용도로 사용됨
    PlatformTransactionManager 잡 진행 과정에서 트랜잭션을 다루는 데 사용됨
    JobBuilderFactory 잡을 생성하는 빌더
    StepBuilderFactory 스텝을 생성하는 빌더

     

    @SpringBootApplication 에너테이션의 역할

    @componenetScan과 @EnableAutoConfiguration을 결합한 메타 에너테이션이다. 이 에너텡션은 데이터 소스뿐만 아니라 스프링 부트 기반의 적절한 자동 구성을 만들어 준다. 

     

    public Step step()

    이 잡은 단일 스텝으로 구성되므로 간단하게 스텝이름만 지정한다. 스텝은 스프링 빈으로 구성됐으며, 이 간단한 예제에서는 두가지 요인인 이름 및 테스크릿만 필요하다.  System.out.println("Hello, World")을 호출한 다음에 RepeatStatus.FINISHED를 반환한다.

    RepeatStatus  
    RepeatStatus.FINISHED 테스크릿(Tasklet)이 완료됐음을 뜻함.
    RepeatStatus.CONTINUEBLE 테스크릿(Tasklet)을 다시 호출

    JobBuilderFactory

    잡 이름과 해당 잡에서 시작할 스텝을 구성한다.

     


    잡 실행하기

    잡은 첫 번째 스텝을 실행했다. 이때 트랜잭션이 시작하며, Tasklet이 실행됐고, 결과가 JobRepository에 갱신됐다. 

     

    배치처리 예시

    • 쇼핑몰에서 쿠폰이 포함된 이메일
    • 아마존과 같은 사이트에서 연관 상품을 추천하느 데이터 고하ㅏㄱ 모델 
    • 빅데이터 작업을 조정하는 일
    • 은행에서 생성되는 거래명세서와 퇴직연금명세서

    배치처리하면 좋은 이유

    필요한 모든 정보를 원하는 즉시 받아 볼 수는 없다.

    • 고객의 마음을 바꿔 주문을 취소할 때, 아직 배송하기 전이라면 훨씬 더 저렴한 비용으로 취소할 수 있다. 고객에게 몇 시간을 더 주면서 배치로 배송을 처러하면 소매업자는 많은 돈을 절약할 수 있다.(주문/거래/배송->정산)

    왜 자바로 배치를 처리하는 가?

    배치 처리 개발에 자바 및 오픈소를 사용해야 하는 이유 6가지

    1. 유지 보수성
    2. 유연성
    3. 확장성
    4. 개발 리소스
    5. 지원
    6. 비용

    스프링 배치 프레임워크 구조

    스프링 배치는 레이어(Layer) 구조로 조립된 세 개의 티어(Tier)로 이뤄져 있다. 

    어플리케이션 레이어
    [ 코어 / 인프라스트럭처 레이어 ]

    어플리케이션 레이어

    가장 바깥쪽에 위치하며, 배치 처리 구축에 사용되는 '모든 사용자 코드' 및 '구성'이 포함된다. '업무 로직 서비스' 등은 물론 '잡 구조'와 관련된 구성도 포함한다.

    가장 최상위에 있는 것이 아니라 코어/인프라스트럭처를 감싸고 있음에 주목하자. (그 이유는 개발자가 개발하는 대부분의 코드가 '코어 레이어'와 함께 동작하는 어플리케이션레어 레이어 이지만 때로는 커스텀 리더(Reader)나 커스텀 라이터(Writer)와 같이 인프라스트럭처의 일부를 만들기도 하기 때문이다.)

    이해가 안가지만 대충 어플리케이션 레이어는 코어 레이어랑 많이 노는데 가끔 인프라스트럭처랑도 논다. 이런 느낌

     

    무중단 처리 또는 상시 데이터 처리

    스프링 프레임 워크를 사용하면 큐(queue)에서 메시지를 읽은 뒤, 청크 단위로 배치 처리를 수행하는 과정을 끝없이 반복할 수 있다. 따라서 이러한 솔루션을 처음부터 개발하는 복잡한 상황을 이해할 필요 없이(Queue가 알아서해주기 때문에) 대량 데이터 처리량을 늘릴수 있다.

     

    Chunk(청크) 처리란?
    Spring Batch에서의 Chunk란 데이터를 덩어리로 작업 할 때 각 커밋 사이에 처리되는 row의 수 이다.
    즉, Chunk 지향 처리란 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리르 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것을 의미한다.

    - Reader에서 데이터를 하나 읽어옴
    - 읽어온 데이터를 Processor에서 가공
    - 가공된 데이터를 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장
    즉, Reader와 Processor에서는 1건씩 다뤄지고 Writer에서는 Chunk 단위로 처리된다.

    스프링으로 잡 정의하기

    1. 잡은 중단이나 상호작용 없이 처음부터 끝까지 실행되는 처리이다.
    2. 잡은 여러 개의 스텝이 모여 이뤄질 수 있다.
    3. 스텝이 실패했을 때 반복 실행할 수도 있고 못할 수도 있다.
    4. 잡의 플로우(flow)는 조건부일 수 있다. (예를들어 수익을 계산하는 스텝이 $1,000,000 이상의 수익을 반환할 때만 보너스 계산 스텝을 실행하는 경우)
    //AccountTasklet : 커스텀 컨포넌트
    @Bean
    public AccountTasklet accountTasklet(){
    	return new AccountTasklet();
    }
    
    @Bean
    public Job accountJob(){
    //AccountTasklet을 감싸는 스텝하나를 생성
    	Step accountStep =
        	this.stepBuilderFactory
            	.get("accountStep")
                .task(accountTasklet());
                .build();
    //스텝을 감싸는 잡을 생성
         return this.jobBuilderFactory
         			.get("accountJob")
                    .start("accountStep")
                    .build();
    }

     

    AccountTasklet

    • 첫 번째 Bean은 AccountTasklet이다. 커스텀 컴포넌트이다. 스텝이 동작하는 동안에 비즈니스 로직을 수행한다. 스프링배치는 AccountTasklet이 완료될 때까지 단일 메서드(execute 메서드)를 반복해서 호출하는데, 이때 각각은 새 트렌잭션으로 호출된다.
    • 두 번째 Bean은 스프링 배치 잡이다. 이 Bean 정의 내에서는 팩토리가 제공하는 빌더를 사용해, 조금 전 정의했던 AccountTasklet을 감싸는 스텝하나를 생성한다. 그런  다음에 잡 빌더를 사용해 스텝을 감싸는 잡을 생성한다. 스프링 부트(Spring Boot는 애플리케이션 기동 시에 이 잡을 찾아내 자동으로 실행시킨다.

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

    스프링배치_완벽가이드_3장_거래명세서 생성  (0) 2021.07.15
    스프링배치_완벽가이드_2장 스프링 배치  (0) 2021.07.14
    Spring Batch - 0 개념  (0) 2021.01.27
    Spring Batch - 2 구조  (0) 2021.01.25
    Spring Batch - 1  (0) 2021.01.19
    • maven 빌드 하기

    atoz-develop.tistory.com/entry/IntelliJ%EC%97%90%EC%84%9C-Maven-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Package-Build-%ED%95%98%EA%B8%B0

     

    IntelliJ에서 Maven 프로젝트 Package Build 하기

    IntelliJ에서 Maven 프로젝트 Package Build 하기 Maven 뷰에서 build를 실행하는 방법과 terminal을 열어 maven 명령어를 입력하는 방법이 있다. 1. Maven 뷰에서 Build 실행 우측의 Maven을 클릭하여 mave..

    atoz-develop.tistory.com

     

    maven 환경 변수 설정하기. setting

    allonsyit.tistory.com/12

     

    [Windows10] maven 설치 및 환경변수 설정

    1. maven binary 파일 다운로드 https://maven.apache.org/download.cgi Maven – Download Apache Maven Downloading Apache Maven 3.6.3 Apache Maven 3.6.3 is the latest release and recommended version for..

    allonsyit.tistory.com

     

    + Recent posts