반응형

목차

    Chunk ? 

    Spring Batch에서의 Chunk란 데이터 덩어리로 작업 할 때 각 커밋 사이에 처리되는 row 수를 얘기합니다. 즉, Chunk 지향 처리란 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것을 의미합니다. 여기서 트랜잭션이라는게 중요한데요. Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 된다는 것입니다. Chunk 지향 처리가 결국 Chunk 단위로 데이터를 처리한다는 의미이기 때문에 그림으로 표현하면 아래와 같습니다.

    Chunk 지향 프로세싱은 1000개의 데이터에 대해 배치 로직을 실행한다고 가정하면, Chunk 단위로 나누지 않았을 경우에는 한개만 실패해도 성공한 999개의 데이터가 롤백된다. Chunk 단위를 10으로 한다면, 작업 중에 다른 Chunk는 영향을 받지 않는다.
    • Reader에서 데이터 하나를 읽어 온다.(item 단위)
    • 읽어온 데이터를 Processor에서 가공한다.(item 단위)\
    • 가공된 데이터들을 별도의 공간에 모은 뒤 Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장한다. (Chunk = items)

    Reader와 Processor에서는 1건씩 다뤄지고, Writer에선 Chunk 단위로 처리된다는 것만 기억하시면 됩니다.

    Chunk 지향 처리를 Java 코드로 표현하면 아래처럼 될 것 같습니다.

    여기선 Reader, Processor에서는 1건씩 다뤄지고, Writer에서는 Chunk 단위로 처리된다는 것을 기억하면 된다.

    Chunk-oriented processing의 장점

    위에서 알아본 청크지향 프로세싱을 사용하지 않는다 하더라도 개발자가 충분히 비슷한 로직으로 구현을 할 수도 있습니다. 하지만 청크지향 프로세싱은 단순히 청크단위의 트랜잭션만 제공해주는것은 아닙니다.

    Spring batch 청크지향 프로세싱의 가장 큰 장점이라고 하면, 내결함성 (Falut tolernat)를 위한 다양한 기능들을 제공하고 있다는 것 입니다.

    멀티 스레드 환경에서 chunk 지향 불가

    각 Reader와 Writer의 Javadoc에 항상 저 thread-safe 문구가 있는지 확인해보셔야 합니다.
    만약 없는 경우엔 thread-safe가 지원되는 Reader 와 Writer를 선택해주셔야하며, 꼭 그 Reader를 써야한다면 SynchronizedItemStreamReader 등을 이용해 thread-safe로 변환해서 사용해볼 수 있습니다.

    그리고 또 하나 주의할 것은 멀티 쓰레드로 각 Chunk들이 개별로 진행되다보니 Spring Batch의 큰 장점중 하나인 실패 지점에서 재시작하는 것은 불가능 합니다. 이유는 간단합니다. 단일 쓰레드로 순차적으로 실행할때는 10번째 Chunk가 실패한다면 9번째까지의 Chunk가 성공했음이 보장되지만, 멀티쓰레드의 경우 1~10개의 Chunk가 동시에 실행되다보니 10번째 Chunk가 실패했다고 해서 1~9개까지의Chunk가 다 성공된 상태임이 보장되지 않습니다. 그래서 일반적으로는 ItemReader의 saveState 옵션을 false 로 설정하고 사용합니다.

    반응형
    반응형

    다수의 빈(Bean)객체의존 객체의 대상이 되는 객체를 선택하는 방법에 대해서 학습한다.

    • 다수의 빈(Bean)이라서 모호한 것을 "어떤 것"을 @Autowired 할지를 명확하게 해주는 것을 의미한다.
    10-1 의존객체 선택
    Exception 상황 이유
    동일한 객체가 2개 이상인 경우 스프링 컨테이너는 자동 주입 대상 객체를 판단하지 못해서 Exception을 발생시킨다.
    해결방법
    - @Qualifier : 우선자 어노테이션
    10-2 의존객체 자동 주입 체크
    의존객체가 없는 경우 Exception을 발생하지 않게 하는 방법
    상황 solution
    @Autowired(requried = false)
    bean이 등록되어 있지 않아도 Exception을 발생시키지 않는다. 거의 이런 경우는 없을 것이다.
    10-3 @Injection
    Autowired 속성과 아예 똑같지만 requried를 제공하지 않는다. 왜 Autowired가 많이 쓰이는지 모르겠으나 아무튼 그렇다...

     

    반응형

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

    어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27
    생명주기(Life Cycle)  (0) 2021.12.24
    의존객체 자동 주입  (0) 2021.12.23
    스프링 설정 파일 분리  (0) 2021.12.23
    스프링 강의노트  (0) 2021.10.22
    반응형

    의존객체를 자동으로 주입하는 방법에 대해서 학습합니다.

    9-1 의존객체 자동 주입이란?
    스프링 설정 파일에서 의존 객체를 주입할 때 <constructor-org> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능이다. 구현 방법은 @Autowired와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.
    스프링 컨테이너 방법
    @Autowired
    @Resource

     

    9-2 @Autowired
    주입하려는 객체의 타이비 일치하는 객체를 자동으로 주입한다.
    @Autowired사용시 주의할 점
    생성자에는 Autowired 주는 것은 상관없는데 프로퍼티 또는 메서드에 @Autowired를 줄 때에는 반드시 기본 생성자(디폴트 생성자)를 명시해주고 사용한다. 이유는 간단하다. 다음과 같이 WordDao를 필요로하는 메서드인데 해당 객체가 없으면 의존성 주입이 어렵다. 
    9-3 @Resource
    주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입한다.
    • @Autowired랑 비슷하다.
    • 생성자에 쓰지 못한다.
    • 프로퍼티, 메서드에 쓸 수있다.
    • 기본생성자 필수이다.
    반응형

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

    어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27
    생명주기(Life Cycle)  (0) 2021.12.24
    의존객체 선택  (0) 2021.12.24
    스프링 설정 파일 분리  (0) 2021.12.23
    스프링 강의노트  (0) 2021.10.22

    + Recent posts