소프트웨어 개발이라는 분야는 오래했다고 잘한다는 것이 보장되는 곳이 아닙니다.

끊임없이 Why 와 How 에 대해서 스스로 질문하고 공부해야 성장하는 분야인 것 같습니다.

 

1. 아키텍트 vs 개발자

 

요즘 들어서 "개발자"라는 직업이 아주 핫합니다.

그런데 IT시장에서 오래 일하신분들이 "개발자" 라는 호칭을 들었을 때 반응이 좀 다릅니다.

 

"언제까지 개발만 할거냐?" 라는 질문을 던지며 전체적인 그림을 그리는 아키텍트가 되어야 한다는 사람들이 많이 있습니다.

이런분들은 개발=코딩의 의미로 바라보는 것 같습니다.

 

그러나 "우리는 아키텍트라는 표현을 사용하지 않아. 전부 다 개발자이지" 라고 이야기하는 분들도 상당히 많습니다.

보통 이런회사의 개발자분들은 아키텍처, 설계, 개발, 테스트를 모두 합쳐서 개발로 인식하여 수행합니다.

 

비율을 정확히 따져보지는 않았지만 두 부류 모두 부르는 명칭만 다를 뿐이지 사실 해야하는 일은 비슷합니다.

 

고객과 시장의 요구사항을 만났을 때, 기술적 관점으로 그것을 재해석하여 소프트웨어로 구현해야 하는 것이 궁극적인 목표입니다.

 

 

- 아키텍처 그림만 PPT로 열심히 그리는 사람은 아키텍트가 아닙니다. 그림은 아무나 그릴 수 있습니다.

- 자기가 만드는 프로그램 하나의 개발에만 집중하는 사람은 좋은 개발자가 아닙니다.

   전체적인 구성요소와 관계를 파악하여 기능적/비기능적 요구사항을 파악하고 이에 따른 제약사항과 구현방안을 설계/개발 할 수있는 사람이 좋은 개발자입니다.

 

2. 기술 vs 기본

 

시장의 많은 개발자들끼리 만났을때 심심치 않게 벌어지는 논쟁입니다.

 

"Spring 3.0에서는 어떠했고, 4.0에와서는 어떤 것이 바뀌었으며 ..."

"그럴때는 Spring 의 PostProcessor를 사용해서 구현하고"

등등 시장에서 사용되는 최신기술들에 관심이 많은 분들입니다.

 

이런 분들의 특징은 여러가지 기술등을 효과적으로 활용하여 원하는 바를 빠르게 만들어냅니다.

이른바 "손이 빠릅니다".

 

"이렇게 하면 시간복잡도, 공간복잡도가 이렇게 되고.."
"O(N^2)을 O(NlogN)으로 줄일 수 있고..

"건별 Data가 몇 byte이니, 초당 건수를 고려하면 메모리를 bytes만큼 사용하고"

 

이런 분들은 뭔가 하나에 꽂히면 파고들어서 최적의 구현을 하는 것이 목표입니다.

계속 들여다보고 최적화 / 효율화를 반복합니다. 

그리고 "흐뭇해 하십니다"

 

결론부터 말씀드리면 둘 다 중요합니다!

 

오픈 소스의 홍수 속에서 너무나도 많은 "바퀴"들이 존재합니다. 바퀴를 다시 만들필요는 없습니다.

망치가 있는데 돌멩이로 못질을 할필요는 없죠.

그런데 핵심이 되는 원리는 비슷합니다.

 

- 내가 사용하는 모듈의 시간복잡도, 공간복잡도가 어떠한지

- 내부에서 어느부분이 동기/비동기 처리가 일어나는지 

- Input 이 100건일때와 100만건일때 속도차이는 어떠한지

 

이러한 내용을 파악하지 않고 바퀴를 가져다 만드는데만 집중하면 밸런스가 안맞습니다.

시스템이 작을때는 문제가 없지만 데이터가 늘어나고 사용자가 늘어날 수록 버티기가 힘들어집니다.

 

이름있는 Tech기업들이 개발자(소프트웨어 인력)을 채용할때 알고리즘 테스트를 하는 것은 다 이유가 있습니다.

새로운 기술이 나왔을때 빨리 습득하고, 논리적 문제해결을 바탕으로 접근하여 그 기술을 사용할줄 아는 사람이 필요합니다.

 

 

현장에서 오래 일하다보면 고객의 요구사항을 만족시키는게 급급하여 기본을 무시하는 사람들을 많이 봅니다.

"알고리즘 같은건 그냥 시간있을때나 공부하는거지"

"그게 뭐가 중요해. 내가 하고 있는 업무랑 연관 없는데"

시스템이 커지고 복잡해지면 반드시 문제가 생깁니다.

 

한편으로는 기술을 무시하는 사람도 많습니다.

"남에 만든거 가져다 쓰는게 뭐 대단하다고"

"내가 만들면 그거보다 잘 만드는데"

바퀴를 만드는 것도 중요하지만 자동차를 만드는 것도 중요합니다. 사용자가 없는 소프트웨어는 죽은 겁니다.

 

이번 카테고리에서는 이 두가지를 섞어서 글을 정리해보려고 합니다.

개발과 알고리즘은 떼려야 뗄 수 없는 관계임을 우리는 이미 알고 있습니다.

이러한 주제를 아키텍처 레벨로 확장시켜서 살펴보려고 합니다.

 

우리가 알고있는 자료구조와 알고리즘들이 아키텍처에서는 어떻게 적용되고 있는지를 자세히 공부한다면

위와 같은 논쟁도 많이 없어지지 않을까 하는 생각입니다.

 

 

ps)

3. Design Pattern & Refactoring

위의 주제와는 약간 다른 주제입니다.

급변하는 요구사항을 어떻게 하면 최소한의 비용으로 빠르고 정확하게 만족시킬 수 있을지에 대한 해결방안으로 보면됩니다.

 

 수년간 오픈소스 기반으로 시스템을 개발하다가 이번에 Public Cloud를 사용하면서 경험했던 부분을 간단히 공유하겠습니다.

기존에 사용하던 OpenSource

기존에 처리하던 방식입니다. 대부분의 Client로부터의 요청은 Kafka로 전달됩니다. 전달받는 데이터 소스위치에 따라서 Kafka 앞에 하나의 Layer를 더 두는 것이 일반적입니다.

이렇게 개발하다보면 로직자체의 개발보다 때로는 오픈소스의 사용법, 버그패치, 운영시 발생하는 설정상 문제에 더 많은 시간을 사용하고는 합니다. 지금 개발하는 곳에서는 예전보다 개발 리소스가 더 부족한 상황이어서 과감하게 Azure PaaS 를 사용하도록 결정했습니다.

지금 개발중인 시스템은 데이터 입력채널이 대부분 IoT Device, Sensor의 영역인 것을 제외하고는 기존에 개발하던 시스템들과 구조가 90%이상 동일합니다. 

각 Layer에 해당하는 Public Cloud 및 오픈소스 현황

기존에는 Nifi -> SparkStreaming -> Druid, NoSQL, HDFS -> Grafana 를 사용하던 구조였으며 이와 매칭되는 구성요소들을 Azure 에서 찾기 시작했습니다.

 

MS Azure에 있는 다양한 PaaS 요소를 사용하여 IoT Device Data를 수집하는 간단한 예제를 만들어 보았습니다.

(소요시간은 과거 오픈소스를 사용할때와는 비교할 수 없을만큼 단축되었습니다!)

https://docs.microsoft.com/ko-kr/azure/architecture/reference-architectures/iot/

 

Azure IoT 참조 아키텍처 - Azure Reference Architectures

PaaS(platform-as-a-service) 구성 요소를 사용하는 Azure에서 IoT 애플리케이션에 대한 권장 아키텍처

docs.microsoft.com

 여기에 나오는 아키텍처와 크게 다르지 않으나 실시간 분석처리등은 간소화를 위해서 일단 제외하고 진행했습니다.

아키텍처를 그대로 진행하더라도 각 구성요소의 설정 및 구성에 따라서 동작방식이 달라지기 때문에 살펴봐야 하는 부분에 대해서 간단히 정리해봤습니다.

1. Azure IoT Hub

- 각 계정별로 무료 Hub는 1개 생성가능하고 그 외 유료 Hub의 경우 가격정책에 따라 메시지량이 정해진다. (S1 월 28000원)

- 각 Tier별로 Scale Out이 가능하지만 수작업이 필요하며, 높은 Tier를 한 개 쓸것인지 낮은 Tier에서 x times로 늘릴 것인지는 선택필요

- 자체적으로 event hub가 내장되어 있어서 별도 event hub 생성 없이 간단히 사용가능하다.

  그러나 바로 사용하는 것은 권장하지 않고 event hub로 endpoint를 연결하는 것을 권장한다.

  IoT Hub는 디바이스와의 연결을 담당하며 장애가 발생할 경우 변경할 수 도 있다. 그런데 기타 로직을 구성하는 Application이 IoTHub에 바로 연결되어 있다면 변경사항에 영향을 받기 쉽다(설계5대원칙의 OCP를 생각해보세요) 

 또한 실환경에서는 하나의 메시지큐에 여러 개의 Application 으로 확장되는 것이 일반적이며, 이 때 Consumer Group을 여러 개 두고 병렬처리를 각각 하고 파티션을 조정하는 등의 행위가 필요한데, IoT Hub는 이러한 부분에 제약사항이 있다.

- 메시지의 속성값, 내용에 따라서 Routing기능을 활용할 수 있으나 UTF-8 인코딩에 JSON String 을 사용해야만 한다.

- 개별 Device를 등록하는 방법에는 대칭키, 인증서 등의 방식이 있다.

- D2C, C2D 메시지 전송이 가능하며, 디바이스 제어를 위해서는 Device Twin 이나 Method Invoke를 사용하는 것으로 가이드한다.

 

2. Azure Event Hub

 - Apache Kafka와 유사한 구조로 만들어진 Message Queue이다.

 - IoT Hub의 경우 위치가 변경될 수 있으며 Fail over가 필요한 경우도 있다. 또한 직접적으로 Device와 연결되는 부분이기 때문에 Layer Architecture구성을 위해서 실제 메시지 소비는 Event Hub에서 이루어 지는 것을 권장한다.

 - Namespace를 생성 후 각 필요에 따라서 실제 Event Hub 를 생성하는 방식이다.

 - 보관주기를 정할 수 있으며 옵션으로 스냅샷을 Storage Account에 저장할 수 있다. (Cold Storage)

 - 필요에 따라서 파티션 수와 보관주기를 설정할 수 있다.

 - Kafka Enabled를 활성하면 기존 Kafka Consumer Application을 그대로 사용할 수 있다!

 

3. Azure App Services - Functions

 - AWS의 Lambda와 같은 Serverless이다. 지원하는 방식이나 언어가 Lambda보다는 제한적이지만 크게 사용에 어려움은 없다.

 - Azure의 PaaS 구성요소에 대해서 Trigger, Input, Output 연결이 가능해서 보다 빠르게 Application을 구성할 수 있다.

 - Azure DevOps나 Github등의 소스를 연결하여 자동배포가 가능하도록 구성할 수 있으나 현재 Trigger, Input, Output등을 사용할 경우 Extension Plugin설치가 필요한데 이러한 부분의 자동화는 아직 지원하고 있지 않다.

 - 실행 횟수에 따라 요금이 부과되지만 크게 부담되는 수준은 아니며 주요 과금은 묶여있는 App Service Plan의 사양에 따라서 결정된다.

 

4. Azure App Services - Web App

 - Web을 위한 Tomcat등의 WAS를 Managed 형태로 제공한다.

 - WAR, JAR배포를 지원하며 Spring Boot를 올리는 것도 가능하다.

 - 외부로 나타나는 EndPoint로만 접근하면 되고, 내부적으로 구성한 App Service Plan에 따라서 서버자원의 자유로운 확장이 가능하다.

 

5. Azure App Service Plan

 - Azure App Service를 이용하기 위해서 반드시 생성해야 한다.

 - Azure App Service를 위한 서버자원을 묶음형태로 정의한다고 보면 이해가 쉽다.

 - OS, CPU, Storage등의 옵션과 Tier를 설정하고 사용할 실제 App Service (Functions, Web app)를 연결하면 해당 어플리케이션들이 수행될때 지정된 만큼의 자원을 자유롭게 사용한다.

 - Linux/Windows선택에 따라서 사용하는 App Service형태에 일부 제약이 있을수도 있으니 확인이 필요하다.

 

6. Azure Database for MySQL

 - 일반적으로 사용하는 MySQL과 크게 다르지 않다.

 - AWS RDS와 유사하다.

 

7. Azure Cosmos DB

 - Azure에서 제공하는 NoSQL 이다. (AWS의 DynamoDB유사)

 - 사용할 수 있는 SQL API를 4가지 중에 선택가능하며 이론상 기존 API와 버전만 맞다면 호환이 된다.

 - 생각보다 비용이 비싸서 몇가지 고려해야 하는점이 있다.

 a. RU 및 Storage사용량에 따라서 과금이 늘어난다. https://docs.microsoft.com/en-us/azure/cosmos-db/understand-your-bill

 

Understanding your Azure Cosmos DB bill

This article explains how to understand your Azure Cosmos DB bill with some examples.

docs.microsoft.com

 b. Partition관련 Hotspot이 생기지 않도록 Key를 잡는 것이 중요하다. 선택을 잘못한다면 RU를 설정한 것보다 성능이 나오지 않는다.

    일반적인 NoSQL의 특성과 크게 다르지 않은 부분이다. 인덱스는 Collection별로 세팅이 가능하다.

 c. Multi Region 선택시 비용도 Multi로... 들어갑니다..;

 

추가로 현재 Cosmos에 Spring JPA를 사용하여 개발시 고려해야하는 부분이 몇 가지 있는데

 ㄱ. Top keyword, Custom Query

https://github.com/Microsoft/spring-data-cosmosdb/issues/144

 

Query method creation with keyword · Issue #144 · microsoft/spring-data-cosmosdb

New feature on Query Method Creation with Keyword. List the keyword and example in below. AND List findByFirstNameAndLastName(String firstName, String lastName) OR List ...

github.com

 ㄴ. page처리시 next page에 관련된 이슈 -> 이부분은 제가 지금 테스트했을때는 발생하지 않고 있습니다.(2019.08.05)

https://github.com/Microsoft/spring-data-cosmosdb/issues/225

 

Issue Spring Data Rest · Issue #225 · microsoft/spring-data-cosmosdb

Hi, Using Spring Boot 2.0.5, Spring Data Rest 2.0.5 and Spring Data CosmosDB 2.0.5 When exposing paged resources and accessing them via RestAPI, paging does not work. The first page is returned cor...

github.com

https://github.com/Microsoft/spring-data-cosmosdb/issues/363

 

Pagination and Sorting · Issue #363 · microsoft/spring-data-cosmosdb

When using Pagination with Sorting, only the first page is sorted. The rest of the pages are unsorted. For example, a list with 5 elements, starting from page1 Page page = rep...

github.com

오픈소스에 비해서 커스터마이징할 수 있는 영역이 부족하고 몇몇 기능의 부재가 있지만 개발시간은 체감상 20%도 되지 않는듯 합니다.

특히 사용량에 따른 자세한 설정이나 모니터링을 위한 다양한 도구들이 더욱 사용을 편리하게 해주고 있습니다.

 

물론 전체적인 아키텍처와 원리를 잘 이해하고 있어야 최적의 설계를 통해서 성능을 최대화하고 비용을 최소화하는 것이 가능합니다.

<참고사이트>

https://intellipaat.com/blog/tutorial/hadoop-tutorial/introduction-hadoop/

https://www.xenonstack.com/blog/iot-analytics-platform/

Batch Architecture 고려사항

아래 언급되는 내용들은 배치뿐 아니라 일반적인 Enterprise Application Architecture에서 공통적으로 해당되는 내용이다.

Language

 최근 금융권 시스템에도 Java가 많이 도입되면서 배치에서도 Java를 사용하는 경우가 늘어나고 있다. 하지만 Java의 경우 가상머신(VM)을 통해서 수행되기 때문에 C나 COBOL에 비해서 속도에 약점을 보일 수 있어서 배치에는 적합하지 않다는 인식도 많이 있다.

 실제로 프로젝트에서 가장 많이 나오는 불만이 "로직 변경없이 똑같이 작성하면 기존보다 느리다"는 것이다. 하지만 장점도 있다. 일반적으로 온라인과 동일한 Language를 사용하기 때문에 아키텍처 통일성이 확보되고 프로그램 재사용이 가능하다. 또한 다양한 Opensource의 활용이 용이하고 멀티쓰레드 처리에 쉽게 접근할 수 있다.

따라서 다양한 관점의 분석과 이해당사자들의 협의를 통하여 Language선택이 이루어져야 한다. 실제로 프로젝트를 수행할 때 성능 최적화에 가장 큰 요소는 Language가 아니라 업무에 관련된 부분이다.

불필요한 작업단계를 제거하거나 통합하고, CriticalPath작업의 위치를 조정하고 작업간 선/후행관계를 재조정하는 등 업무의 최적화에서 더 큰 효과를 볼 수 있다.

Resource Management

현재 시스템에서 수행되어야 할 작업의 상세한 내용을 5w1h원칙으로 정확하게 파악해야 한다.

  • who : 작업명은 무엇인가? 작업의 주체는 누구인가?
  • when : 언제 수행되는가? 일단위인가? 월단위인가?
  • what : 무엇을 수행하는 작업인가? File처리인가? 그렇다면 어느파일에 접근하는가? DB처리인가? 그렇다면 어느 테이블에 접근하는가?
  • why : 작업의 목적은 무엇인가? 어떤한 작업의 선행인가? 후행인가?
  • where : 어느서버에서 수행되는가? 어느계정으로 수행되는가?
  • how : 스케쥴링에 의해서 수행되는가? 원격호출로 수행되는가?

    또한 배치 시스템의 특성상 많은 데이터가 생성되고 참조되는데 이에 대한 관리도 필요하다. 예를 들면 다음과 같다.

  • 파일명명규칙 : 생성되는 파일에 대해서 명명규칙이 필요하다. 업무구분/보관주기/생성모듈등 정보관리가 필요하다. 특히 장기간 불필요파일들이 남아있을 경우 저장공간 부족을 야기시킬수 있기때문에 보관주기에 따라 주기적으로 정리하는 것이 좋다.
  • 테이블레이아웃 : 배치에서 LOAD/UNLOAD작업을 하기 위한 테이블 정보도 관리 되어야 한다.
  • FTP목록 : 작업결과를 FTP로 전송할 경우가 있다. 이 때 사용되는 서버/계정정보/권한 등도 관리 되어야 한다.

    이외에도 실제로 현장에서는 정보 관리주체가 각각 다르다 보니 한눈에 영향도를 파악하기 어려운 경우가 많이 있다.

Capacity

 총 작업의 개수, 각 작업이 소모하는 자원, 작업의 처리대상/주기, Peak Time등을 알고 있어야 한다. 예를 들어서 평상시에는 정상적으로 동작하던 작업이 특정요일만 되면 지연현상이 발생하는 경우가 있다. 상황을 분석해보니 특정요일 같은시간대에 수행되는 다른작업이 같은 처리대상에 접근하고 있어서 Table Lock발생하는 경우였다. 또 월초/월말에 처리해야하는 데이터의 양이 큰 폭으로 증가하여 작업시간이 지연되거나 시스템에 부하를 발생하는 경우도 있을 수 있다. RuleEngine을 사용하는 배치작업의 경우 메모리를 많이 소모하여 동시에 다수의 작업이 수행될 경우 자원부족현상이 발생할 수도 있다.

 이러한 상황을 예방하기 위해서 작업Dependency Diagram작성, 배치작업관리 메타시스템 구축등을 통해서 작업 패턴을 사전에 분석하는 등의 노력이 필요하다.

Deployment & FailOver

 시스템 장애가 발생하여 부득이하게 다른 서버를 사용할 경우를 대비하여 사전에 준비가 되어 있어야 한다. 예를 들어서 배치프로그램은 물론이고 배치프로그램들이 생성하는 File들도 동일한 버전으로 배포가 되어 있어야 하며 스케쥴러와 같은 기타 솔루션들도 유지가 되어야 한다. 또한 설정정보들 역시 신속하게 변경/적용할 수 있어야 한다. 최근에는 파일공유 솔루션이나 NAS를 통해서 어플리케이션 및 파일을 공유하여 사용하고 있다.

개발표준

 전체 개발표준 뿐만 아니라 대표적인 케이스를 선정하여 유형별 Sample코드를 제공하는 것도 하나의 방법이 될 수 있다. 배치의 경우 예를 들면 입력되는 데이터에 따라서 후행배치를 분기시키는 데몬배치도 있고 Resource를 읽어서 처리하는 비지니스 배치도 있다. 비지니스 배치도 처리하는 Resource유형에 따라서 File to File, DB to File등이 존재할텐데 이에 따른 처리패턴을 확보하여 Sample코드로 제공하면 개발뿐 아니라 성능테스트에도 많은 도움이 된다.

 

Enterprise Batch

 과거에 배치는 단순히 main()함수에 의해서 순차적으로 실행되도록 작성되는 프로그램이었고 그 수도 많지 않았으며 요건도 단순했다.

 하지만 대용량의 데이터, 매일 수백,수천만 건의 데이터 처리작업이 매일 끊임없이 발생하는 엔터프라이즈 환경에서 필수적인 배치작업을 개발/실행/운영하기 위한 아키텍처의 필요성이 대두되고 있다.

 현장에서 업무를 수행하면서 느꼈던 특히 대용량 배치시스템을 구성하기 위해서 어떠한 요소를 살펴야할지 정리해본다.

배치는 꼭 필요한 것인가

 은행업무를 예로 들어본다면 다음과 같다.

 고객이 창구에 방문하여 돈을 입금하면 직원은 돈을 받아서 금고에 넣고 원장에 금액을 기록한다. 이러한 업무는 최대한 빨리 처리해서 고객에게 결과를 주어야 한다. 빠른응답이 생명인 온라인 업무이다.

 영업시간이 종료되면 그날 있었던 거래들을 집계하고, 타 은행과 정산이 필요할 경우 돈을 주고 받기도 한다. 즉시 처리할 필요는 없지만 비지니스를 위해서는 반드시 해야하는 업무이다. 이러한 것이 배치 업무이다.

 가장 이상적인 시스템은 배치가 없이 모두 실시간으로 처리하는 것이다.

 하지만 자원은 한정되어 있으며 해야할 일은 많다. 일의 우선순위를 나눌수 밖에 없다.

배치 어플리케이션 특징

  1. 수행방식

    • 온라인 : 사용자의 요청을 항상 대기하고 있다가 요청이 들어오면 실시간으로 처리하여 결과를 돌려준다 일반적으로 다양한 채널(대외계, UI등)을 통해서 데이터를 입력받고, 해당내용이 Request로 Server에 전달되어 비지니스 처리 후 다시 Response를 통해서 응답하게 된다.
    • 배치 : 사전에 약속된 Resource로부터 데이터를 입력받고, 데이터를 처리하여 결과를 다시 Resource에 반영한다. 대부분이 정해진 일정에 따라서 자동으로 수행한다.
    • 최근에는 수천건 이내의 데이터의 경우 온라인 호출(sync or Async)을 통하여 배치를 구동하는 경우도 있다. 편의상 온라인 배치라고 부른다.
  2. 수행시간 및 자원소모

    • 온라인 : 대부분 1건단위 요청으로 비지니스처리가 이루어지며 요청에서 응답까지 3초이내로 끝나는 것이 일반적이다.
    • 배치 : 수백~수천만건단위 비지니스 처리이며 짧게는 수 분, 길게는 수 시간이 소요된다. 정해진 시간내에 수행이 완료되어야 한다.(후행작업을 위해서)
    • 따라서 배치는 한정된 자원(CPU, Memory등)을 효율적으로 사용해야 하며, 과도한 자원사용으로 시스템이 down되는 것을 방지해야 한다. 그 예로 온라인의 경우 하나의 서비스 메소드 호출시 Connection,Statement등의 자원을 사용하고 즉시 반환하여 다른 호출에 자원을 양보하지만 배치의 경우 최초 점유한 자원을 끝까지 사용하는 것이 효율적이다.
  3. 처리 패턴의 다양성

    • 배치업무의 처리패턴은 다양하다. 또한 많은 기술적요소와 업무적요소가 혼재되어 이를 구분하기 쉽지 않다. 파일전송, EAI연계, DB Load/Unload등 연계요소는 분리하여 공통화하도록 하고 업무적요소는 처리하는 Resource의 유형에 따라 분류하는 등 다양한 처리패턴에 대해서 정리하고 공통화할 필요가 있다.
  4. 논리적 계층

    • Batch Program : 일반적으로 개발자가 작업하는 하나의 단위이다. 모듈이라고 부르기도 한다. 일반적으로 데이터를 읽고 처리하여 다시 저장하는 형태이며 일부 처리결과를 타 시스템에 전달하는 경우도 있다.
    • Batch Job : 비지니스 관점에서 하나의 목표를 달성하기 위해서 구성되는 단위이다. 1개 이상의 Program을 순차적으로, 혹은 조건적으로 실행한다.
    • Batch Job Group : 각 Batch Job들의 실행조건, 선/후행관계, 실행시간 및 연관성 있는 Batch Job의 그룹이다.
    • Batch System : Batch Job Group이 모여서 기업을 서포트하기 위한 하나의 시스템이 구현된다.

 아직까지는 단일 프로그램으로 배치작업을 구성하고, 스케쥴링 대신에 Jenkins나 crontab을 활용하는 곳도 많이 있다. 또한 Stored Procedure를 활용하여 대부분의 로직을 DB에 구성하고 DB Server내에서 모든 작업을 끝내는 경우도 있다. 배치작업의 개수가 수십개정도인 소규모시스템에서는 그러한 방향이 효율적일 수 있다.

 하지만 일정규모이상의 데이터와 프로세스를 다루는 시스템을 구축하기 위해서는 배치 어플리케이션의 특징을 이해하고 이를 위한 아키텍처 구축에 많은 고민이 필요함을 알 수 있다.

 

+ Recent posts