Spring Integration과 통합했을 때의 Batch Job 관리

Spring Batch를 기반으로 Batch Job과 Batch 관리툴을 어떻게 만들고 배포하느냐에 관심을 가지다 보니 상당히 다방면에 관심을 가져야겠다는 생각이 든다. 최근에 Spring과 자바 진영의 변화가 얼마나 빠르게 진행되고 있는지 느끼기도 했지만 한편으로는 Spring의 복잡도가 너무 높아져서 쉽게 접근하기 힘들겠구나라는 생각이 들었다. 자바를 처음 접하는 개발자가 힘들어 하듯이 Spring도 그런 상태에 도달했구나라는 생각이다. 물론 내부까지 속속들이 이해하지 않은 상태에서 단지 사용만 한다면 더 쉽고, 편하게 생각하는 개발자들도 있을 듯 하지만 문제가 발생했거나 프레임워크가 제공하지 않는 새로운 형태의 기능을 추가하기 위해서는 내부 구조까지 이해할 필요가 있다. 지금까지는 Spring Batch를 분석하면서 최근에 느낀 점이다. 지금부터 본론으로 들어가보자.

Spring Batch를 분석하다보니 Spring BatchSpring Integration을 통합해서 사용하면 좋겠다는 생각이 들었다. 특히 얼마 전에 올라온 Practical Use of Spring Batch and Spring Integration 문서를 보면 Spring Batch와 Spring Integration을 어떻게 접목해서 사용할 수 있는지 아이디어를 얻을 수 있다. 2009년 SpringOne에서 발표한 Automating Operations with Spring Batch and Spring Integration 동영상을 보면 Spring Batch와 Spring Integration에 대한 내용을 볼 수 있는데 Spring Integration에 대하여 처음 접해서인지 바로 이해가 되지는 않는다. 관심이 있는 사람들은 한번 살펴보면 많은 도움이 될 듯하다.

Spring Batch와 Spring Integration을 통합해서 사용하는 가장 좋은 예제는 현재 개발 진행 중인 Spring Batch Admin 소스를 분석하면 많은 도움이 될 듯하다. Spring Batch와 Spring Integration을 통합하고 있어서 Spring Batch와 Spring Integration에 대한 기본 지식이 없는 상태에서 Spring Batch Admin 소스를 보면 다소 어렵게 느껴질 수 있다. 따라서 먼저 Spring Batch와 Spring Integration에 대한 기본적인 개념과 구조를 이해하고 Spring Batch Admin 소스를 보는 것이 더 빠른 접근 방법일 듯하다.

몇 일간 Spring Batch, Spring Integration, Spring Batch Admin과 관련한 문서와 소스를 보면서 Spring Batch Job을 개발해서 운영할 때 다음과 같은 구조로 운영할 수 있겠다는 생각이 들어 간단하게 정리해 본다.

먼저 Spring Batch 운영에 대한 구조를 이해하기 위하여 Spring Integration의 Service Activator와 Channel Adapter에 대하여 이해해야 한다. 물론 Spring Integration의 다른 개념도 이해할 필요가 있지만 이 글에서는 다루지 않겠다. 더 자세한 내용은 Spring Integration Reference 문서를 참고하기 바란다.

Service Activator
Service Activator는 Input Channel을 통하여 전달된 메시지를 이용하여 Service Instance(우리들은 흔히 이야기하는 비지니스 로직을 담당하는 Object)를 실행하는 역할을 한다.

위 그림에서 보는 바와 같이 Input Channel에 전달된 메시지를 있는지를 확인하고 메시지가 있다면 이 메시지를 이용하여 비지니스 로직을 수행하는 역할을 한다. 만약 Service Instance 영역에서 Return 값이 있다면 Output Channel을 통하여 다른 영역에 전달하는 것이 가능하다.

Channel Adapter
Channel Adapter는 Spring Integration 내에서 사용하는 Message Chnnel과 다른 시스템을 연결하는 역할을 한다. File, HTTP Request, JMS Message에서 전달되는 메시지를 Spring Integration의 Channel Message 형태로 바꾸거나, Spring Integration의 Channel Message를 File, HTTP Request, JMS Message 형태로 변환하는 역할을 한다.

Spring Integration의 위 두가지 개념을 접한 후 Spring Batch Job을 다음과 같은 구조로 운영하는 것이 가능하겠다는 생각이 들었다.

먼저 Batch Job 앞단에 Job-requests라는 Input Channel을 만든다. Job-requests에 메시지가 전달되면 ServiceActivator가 JobLaunchingMessageHandler를 실행하여 각각의 BatchJob을 실행하는 구조이다. 이와 같은 구조로 가져갈 경우 Job-requests Input Channel에 실행하고자하는 Job 이름을 전달하면 각각의 Job을 실행할 수 있는 방식이다.

이와 같이 Job-requests Input Channel을 열어주면 다음과 같이 다양한 방식으로 Batch Job을 실행 및 관리하는 것이 가능하다.

위 그림에서 각각의 상황에 따른 시나리오를 살펴보면 다음과 같다.

1. 특정 디렉토리에 파일이 추가되는 경우 Batch Job이 실행되어 해당 File을 읽어 Batch 작업을 실행해야 한다. 이 같은 요구사항의 경우 주기적으로 특정 디렉토리에 파일이 추가되었는지 모니터링하고 있다가 파일이 추가되면 FileToJobRequestAdapter를 통하여 Spring Integration의 Message 형태로 변화하여 Job-requests Input Channel에 Batch Job 실행을 요청한다.
2. Batch 관리툴에서 관리자가 특정 Batch Job에 대한 실행을 요청한다. Batch 관리툴과 Batch Job이 같은 JVM에서 동작하고 있다면 StringToJobRequestAdapter을 실행한다.
3. Batch 관리툴에서 관리자가 특정 Batch Job에 대한 실행을 요청한다. Batch 관리툴과 Batch Job이 다른 JVM에서 동작하고 있다면 JMS, RMI, Http Adapter를 통하여 실행한다.
4. Quartz, Crontab과 같은 Scheduler에 의하여 특정 Batch Job을 주기적으로 실행한다. Scheduler와 Batch Job이 같은 JVM에서 동작하고 있다면 StringToJobRequestAdapter을 실행한다.
5. Quartz, Crontab과 같은 Scheduler에 의하여 특정 Batch Job을 주기적으로 실행한다. Scheduler와 Batch Job이 다른 JVM에서 동작하고 있다면 JMS, RMI, Http Adapter를 통하여 실행한다.

위 그림은 이해를 돕기 위하여 각 영역의 동작을 최대한 단순하게 그렸다. Batch 관리툴, Scheduler, Batch Job이 서로 다른 영역에서 동작하고 있다면 위 구조보다 훨씬 더 복잡한 구조가 될 가능성이 높다. 위 두개의 그림을 통합하여 하나로 만들어 보면 전체 흐름을 좀 더 명확하게 이해할 수 있을 듯 하다.

위에서 살펴본 바와 같이 Spring Integration의 Channel을 통하여 Batch Job을 Launch, Restart, Stop을 할 수 있도록 한다면 다른 시스템과의 통합을 더 쉽게 가져갈 수 있다. 물론 위와 같은 구조로 운영하는 것은 복잡도를 증가시키는 결과를 가져올 수 있다. 따라서 반드시 위와 같은 구조로 가져갈 필요는 없다. 단지 다른 시스템과 연계하거나 하나의 Batch Job을 다양한 방식으로 운영할 필요가 있는 경우에는 위와 같은 구조로 개발해 유연성을 확보할 수도 있다.

아직 Spring Integration에 대한 이해도 높지 않은 상태라 Spring Batch와의 통합할 경우 이 정도의 통합이 가능하지 않을까 생각해봤다. 앞으로 이해도가 높아지고 실무에 적용사례가 있다면 더 다양한 구조로 개발, 운영하는 것이 가능하리라 생각된다.

Labels

spring spring Delete
batch batch Delete
integration integration Delete
channel channel Delete
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.
  1. 3월 13, 2010

    Anonymous says:

    원격 실행을 할 때 Job단위의 메시지를 넘겨서 Spring-integratin을 활용하는 것도 가능하고, 각각의 Item별로 분산처리하기 위해...

    원격 실행을 할 때 Job단위의 메시지를 넘겨서 Spring-integratin을 활용하는 것도 가능하고, 각각의 Item별로 분산처리하기 위해서 Spring-integration을 활용하는 것도 가능하다고 들었어요. 배치와 분산처리가 각각의 영역만으로도 굉장히 공부할께 많은 분야인데 2가지를 합치니까 더 하네요 ^^; -benelog