본문 바로가기
프로젝트 개발 기록/[개발] java | spring

다시 돌아온 병아리 신입 주디 #1 Batch 처리에 대해 알아보자 🫧

by HelloJudy 2024. 3. 24.

 

휴.. 금융권에서 풀스택 하게 될걸 각오하고 왔는데 정말 운 좋게도
모바일 팀에 들어가게 되어서 서버 개발을 하고 있다..! 정말 자바 쓸 수 있는 것만으로도 행복🕺✨
 
/**
실제로 동기들은 자바 쓰는 팀이 거의 없다.
tmi로 금융it를 준비한다면 쿼리 짜는 거!! 진짜 중요!! 별표 다섯 개⭐️⭐️⭐️⭐️⭐️
 
🐰: SQLP도 따고 싶은데.. 아 너모 어려와여.. SQLD랑 난이도 격차가 너모 큰 거 아니오?
 🤖: 변명이야!!! 공부해!!!
🐰: 넵..
**/
 
그래도 혹시나 하는 마음으로 최근엔 프론트 코드도 보면서 공부하고 있었는데
완전 서버 개발로 직무를 주셔서(?) 안심하고 다시 서버 공부로 돌아왔당..!
아직 크게 업무가 많지는 않아서 이럴 때 많이 많이 공부해 두자!!
 
회사 내부 배치 시스템을 쓰고 있어서 블로그에는
스프링 배치로 공부한 내용을 기록해보려고 한다🕺 룰루
 


Batch 처리에 대하여 🫧

 

1. Batch 란?

배치 처리는 컴퓨터가 주기적으로 대량의 반복적인 데이터 작업을 완료하기 위해 사용하는 방식이다.
배치 처리가 중요한 이유는 조직에서는 사람의 개입을 최소화하고 반복 태스크를 보다 효율적으로 실행할 수 있기 때문이다.
 
또한 이러한 배치 처리를 하는 애플리케이션을 배치 애플리케이션이라고 한다.
 
배치 애플리케이션의 조건이 있는데 아래 5가지를 충족해야 한다.

(* 출처: https://jojoldu.tistory.com/324)

 

  • 대용량 데이터: 배치 애플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
  • 자동화: 배치 애플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
  • 견고성: 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
  • 신뢰성: 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
  • 성능: 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 애플리케이션을 방해하지 않도록 수행되어야 합니다.
  1.  

 
이러한 배치 애플리케이션이 우리가 알고 있는 일반 웹 애플리케이션이랑 다른 점은
웹은 요청과 응답의 인터랙션이 있지만 배치는 요청만 있다는 점이 다르다.
 
 

2. Why? Batch는 왜 필요할까 🤔

배치 애플리케이션은 1)일정 주기로 실행되어야 하고 2)실시간 처리가 어려운 대량이 데이터를 처리할 때 필요하다.
 

자동 크롤링

특정한 데이터를 매일 또는 매달 수집해야 하는 경우 API를 통해서 개발자가 직접 수집하는 것이 아닌 배치 작업을 통해서 크롤링할 수 있다.
 

수수료 정산

정산시스템에서 사용할 수 있다.
예를 들어 온라인 플랫폼이 있다고 하자. 해당 플랫폼을 통해 물건을 판매한 고객에게 일정 수수료를 청구해야 한다.
이때 배치를 통해서 각 거래에 대한 수수료를 계산하고 이를 기반으로 고객에게 정산을 요청할 수 있다.
 

데이터 집계

수억 개의 데이터에 대한 통계 데이터를 집계하는 데 사용할 수 있다.
 

대량 메일 전송

대규모의 이메일을 한 번에 보내는 경우, 실시간으로 메일을 전송하는 것은 비효율적일 수 있다.
대신 배치 처리를 통해 이메일을 일괄적으로 전송할 수 있다.
 
현재 내가 맡은 서비스에서도 수십 개의 배치 프로그램이 돌고 있다. 뱅글뱅글~
 
 

3. Spring Batch

자 그럼 익숙한 이름의 봄이! 아.. 아니지 스프링! 배치에 대해서 알아보자.
 
Spring Batch(스프링 배치)는 Java 기반의 배치 처리 프레임워크로, 대용량 데이터 처리를 위한 강력한 기능을 제공한다. 스프링 배치는 복잡한 배치 처리 작업을 간단하고 효율적으로 구현할 수 있도록 도와준다.
 
 

4. Batch와 Scheduler의 차이

그런데 문득 배치를 공부하고 있는데 과거의 '자린고비' 프로젝트에서 스케줄러를 사용했던 게 생각났다.
얼핏 보면 특정 시간마다 실행하는 게 꼭 스케줄러와 배치가 같은 것처럼 느껴진다.
 
하지만 위에서 정리했듯이 5가지 조건을 만족해야 배치 처리라고 할 수 있다.
 
🤖: 엥 그럼 뭐야? 스케줄러는?
🐰: 성격 급하네; 지금 말하려고 했어
 
배치 처리(Batch Processing)는 대량의 작업을 일괄적으로 처리하는 방식을 의미하고, 스케줄러(Scheduler)는 작업을 언제 실행할지 결정하고 관리하는 시스템 컴포넌트이다. 배치 처리는 스케줄러에 의해 실행될 수 있고, 스케줄러는 다양한 유형의 작업을 관리할 수 있다.
 
스케줄러에는 Spring Scheduler와 Quartz 등이 있다.
 

이미지 출처: https://yermi.tistory.com/entry/Spring-Batch%EC%99%80-Scheduler%EC%9D%98-%EC%B0%A8%EC%9D%B4-Spring-Scheduler-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

 
 

5. Spring Batch 기본 구조

 

 

[ 용어 ]

✔️ Job

Spring Batch에서 일괄 처리를 위한 일련의 프로세스를 추상화하는 단일 실행 단위이다. 쉽게 말하면 하나의 배치 작업이다.
 

✔️ JobLauncher

작업을 실행하기 위한 인터페이스이다. JobLauncher는 사용자가 직접 사용할 수도 있지만, java 명령어만으로 간단히 일괄 처리할 수도 있다.
 

✔️ Step

Job을 구성하는 처리 단위이다. 1개의 Job은 1~N개의 Step를 포함할 수 있다.
 
Step의 실행 단위는 크게 2가지로 나뉜다.

  • Tasket Model: 하나의 작업 기반으로 실행
  • Chunk Model: 하나의 큰 덩어리를 N개씩 나눠서 실행
    • ex) 처리 대상이 한 번에 실행해도 컴퓨터 자원에 문제가 없으면 Tasklet 사용
    • ex) 1000명의 회원을 100명씩 나눠서 처리한다면 Chunk 사용

 

✔️ JobRepository

Job 및 Step의 상태를 관리하는 시스템이다.
관리 정보는 Spring Batch에서 지정한 테이블 스키마를 기반으로 데이터베이스에 유지한다.
 

✔️ ItemReader, ItemProcessor, ItemWriter

 

이미지 출처: https://jojoldu.tistory.com/336

 
데이터의 입력/처리/출력의 세 가지 프로세스로 구분하기 위한 인터페이스이다.
Batch 애플리케이션은 이 3가지 패턴의 처리로 구성되며 Spring Batch에서는 이러한 인터페이스 구현이 주로 Chunk Model에서 활용한다. 이렇게 구성하여 대용량 데이터를 효율적으로 처리하는 데 사용된다.
 
스프링 배치는 이러한 컴포넌트들을 조합하여 간단한 설정으로 배치 작업을 구성할 수 있도록 편리한 인터페이스를 제공하고 있다.
 

  • ItemReader: ItemReader는 배치 작업에서 데이터를 읽는 역할을 담당한다.
    • 대부분의 경우, 데이터베이스나 파일, 메시지 큐 등 외부 소스로부터 데이터를 읽어온다.
    • 스프링 배치는 다양한 유형의 ItemReader를 제공하며, 필요에 따라 커스텀 ItemReader를 구현할 수도 있다.
    • 일반적으로 Chunk Model에서 사용되며, 한 번에 읽어올 데이터의 크기를 지정할 수 있습니다.
  • ItemProcessor: ItemProcessor는 ItemReader에서 읽어온 데이터를 가공하거나 변환하는 역할을 수행한다.
    • 데이터를 필터링하거나 변환하는 등의 작업을 수행하여 ItemWriter로 전달될 데이터를 준비한다.
    • ItemProcessor는 선택적으로 사용되며, 필요에 따라 작성할 수 있다.
    • 예를 들어, 입력 데이터를 가공하여 특정 필드를 변경하거나 데이터 유효성을 검사하는 등의 작업을 수행할 수 있다.
  • ItemWriter: ItemWriter는 ItemProcessor에서 가공된 데이터를 외부 소스에 기록하거나 저장하는 역할을 수행한다.
    • 주로 데이터베이스에 데이터를 저장하거나 파일에 데이터를 쓰는 등의 작업을 수행한다.
    • 스프링 배치는 다양한 유형의 ItemWriter를 제공하며, 필요에 따라 커스텀 ItemWriter를 구현할 수 있다.
    • ItemWriter는 Chunk Model에서 가장 마지막에 호출되어 처리된 데이터를 외부 소스에 쓰는 역할을 한다.

 

6. Spring Batch 실행 프로세스

 

이미지 출처: https://terasoluna-batch.github.io/guideline/5.0.0.RELEASE/en/Ch02_SpringBatchArchitecture.html#Ch02_SpringBatchArch_Overview_BasicStructure

 
 

✔️ 주요 처리 과정

  1. JobLauncher는 작업 스케줄러에서 시작
  2. JobLauncher에서 작업 실행
  3. Step은 Job에서 실행
  4. Step은 ItemReader를 사용하여 입력 데이터를 가져옴
  5. Step은 ItemProcessor를 사용하여 입력 데이터를 처리
  6. Step은 ItemWriter를 이용하여 처리된 데이터를 출력

 

✔️ 처리한 정보를 저장하기 위한 과정

  1. JobLauncher는 JobRepository를 통해 데이터베이스에 JobInstance를 등록
  2. JobLauncher는 JobRepository를 통해 Database에 Job 실행이 시작되었음을 등록
  3. JobStep은 JobRepository를 통해 데이터베이스의 I/O 레코드 수 및 상태와 같은 기타 정보를 업데이트
  4. JobLauncher는 JobRepository를 통해 Job 수행이 완료되었음을 Database에 등록

 
 
내일 좀 더 깊게 공부해야겠다~

 


📌 Reference

반응형

댓글