2013년 7월 16일 화요일

Camel, Spring 기반 이메일 전송 라이브러리


1. 들어가며

전에 블로그에 올린 "Apache Camel 기반 이메일 전송 라이브러리"에서는 Apache Camel 프레임워크와 메일, Velocoty 컴포넌트를 이용하여 이메일 전송 라이브러리를 개발해 보았다. 이번 글에서는 동일한 라이브러리 개발에 Apache Camel 프레임워크를 Spring 프레임워크와 결합하여 개발하는 방법을 보이고자 한다.


2. Spring XML

Apache Camel은 메시지 라우팅을 다양한 DSL(Domain Specific Language, 도메인 특화 언어)로 기술할 수 있게 해준다. Camel이 Spring 프레임워크와 결합되는 경우, Camel은 Spring의 XML Schema Extension을 이용하여 Spring의 Bean 정의 XML 파일에 XML DSL로 메시지 라우팅을 설정할 수 있게 해준다. 이 XML 기반 DSL은 Java DSL의 거의 모든 기능을 그대로 지원하므로, Spring XML DSL을 이용하면, 메시지 라우팅을 설정하는 Java 클래스를 컴파일이 필요 없는 Spring XML 설정으로 옮겨 놓을 수 있다.


3. 메시지 라우팅

"Apache Camel 기반 이메일 전송 라이브러리"에서는 메시지 라우팅을 RouteBuilder 인터페이스를 구현한 Java 클래스로 설정했었다. 이번에는 Spring XML을 이용하여 메시지 라우팅을 설정할 것이다. Spring Bean 정의 XML인 MailSender.xml에 다음과 같이 Camel Context와 메시지 라우팅을 정의한다. 이 설정 파일은 "Apache Camel 기반 이메일 전송 라이브러리"의 MailSenderBuilder 클래스의 메시지 라우팅을 설정을 대체한다.

메시지 엔드포인트인 MailSender 객체는 component-scan 태그를 사용하여 자동 주입했다. 참고로 MailSender 클래스는 이미 이전 글에서 @Service 어노테이션을 이용하여 Bean으로 정의했다. 그리고 MailSenderBuilder 클래스의 설정자(setter) 메소드들은 XML에서 속성으로 참조하게 구조를 변경했다. 이를 위해 Spring이 제공하는 PropertiesFactoryBean을 이용하여 Bean XML 정의 파일에 속성을 직접 정의했다. (이 기법은 Spring 프레임워크의 숨겨진 기능 중 하나이다.) 이 속성 Bean은 camelContext의 propertyPlaceholder에서 참조하게 한다. (Camel 프레임워크 웹 사이트 문서는 이 참조 방법을 잘 설명하지 않는다.) 일단 이렇게 Bean 정의와 참조를 설정하고 나면, Camel의 설정에서는 속성 정보들을 {{}}를 이용하여 참조할 수 있게 된다. MailSenderBuilder 클래스의 configure 메소드에 설정된 메시지 라우팅은 Spring XML의 route 태그에 XML로 정의한다. 이렇게 함으로 MailSenderBuilder 클래스는 모두 Spring XML로 대체된다. 이제 Camel Context는 MailSenderBuilder 클래스가 없더라도 메시지를 라우팅할 수 있게 된다.


4. 메시지 엔드포인트

메시지 엔드포인트는 "Apache Camel 기반 이메일 전송 라이브러리"에서 구현한 클래스인 MailSender.java를 재사용한다..

이전 글을 올릴 때, 이미 Spring 프레임워크와의 결합을 고려했었다. 이때 이미 Spring의 @Service 어노테이션을 포함했다. 또 Camel의 @Produce 어노테이션은 Camel의 ProducerTemplate 객체를 자동으로 주입한다.


5. 테스트

테스트 실행에 필요한 라이브러리는 Maven의 pom.xml로 포함시켰다. 다음은 Camel과 Spring 프레임워크를 결합시킬 때 필요한 Maven의 라이브러리 의존 설정이다. 의존 라이브러리 전체는 "프로그램 소스"의 pom.xml 파일을 참조한다.

Spring 프레임워크를 사용하므로 Spring Test 어노테이션을 이용하는 JUnit 테스트 클래스를 작성한다. 다음은 Spring Test 어노테이션을 사용한 MailSenderSpringTest.java 클래스이다.

Spring Bean 정의 XML 파일인 MailSender.xml은 Spring이 제공하는 @ContextConfiguration 어노테이션을 사용하여 소스에 바로 지정한다. MailSender 객체는 Spring의 @Autowired 어노테이션으로 자동 주입된다. Test 메소드는 이전에 Java와 Camel 기반 이메일전송 라이브러리의 메소드와 거의 동일하다. 단지 설정자(setter) 메소드들이 XML 설정에서 속성으로 변경되었으므로 설정자를 호출하는 부분이 테스트 소스에서 사라졌다. 주입된 MailSender 객체에 메일 발신에 필요한 정보와 메일 본문 템플릿 입력 개체를 설정하고 발신하면 테스트는 완료된다.


6. 이전 라이브러리와 비교

Spring 프레임워크를 사용함으로 "Apache Camel 기반 이메일 전송 라이브러리"에서 사용된 메시지 라우팅 클래스는 제거되었고, 대신 컴파일이 필요 없는 Spring Bean 정의 XML 파일에 메시지 라우팅이 설정되었다. 컴파일이라는 단단한 결합을 설정 파일이라는 느슨한 결합으로 전환한 것이다. 이메일 전송 엔드포인트 클래스는 재활용되었다.

동일하게 이메일 전송을 처리하는 라이브러리로 이번 버전은 Java 소스는 줄었고, XML 설정은 추가 되었다. DSL이 Java 소스에서 XML로 바뀐 것이다. 그러나 Spring 프레임워크의 장점을 Camel에서 활용할 수 있는 구조가 되었다. Camel은 Spring의 Context는 컴포넌트 레지스트리로, Bean 객체는 메시지 엔드포인트로 활용한다.

Spring 프레임워크는 J2EE 기반 솔루션을 대체할 수 있는 강력한 엔터프라이즈 프레임워크이다. 그리고 대부분의 프레임워크들은 Spring 프레임워크와의 인터페이스를 지원한다. (모든 프레임워크는 Spring 프레임워크로 통한다!) Camel도 역시 Spring 프레임워크와 잘 결합된다.


7. 맺음말

Camel과 Spring을 이용하여 메시지 라우팅을 XML 설정으로 변경했고, Spring 어노테이션과 자동 주입을 이용하여 객체들의 초기화 과정을 생략하여 애플리케이측 소스를 좀더 간결하게 만들었다. 이렇게 Camel과 Spring 프레임워크는 서로 잘 결합되고 각 프레임워크의 장점을 서로 융합한다. 그러므로 Camel과 Spring 프레임워크를 결합하는 방식으로 애플리케이션에서 사용할 것을 권장한다.

기업 통합 패턴이 처음 패턴 언어로서 정리됐을 때, 우리들은 아직 통합 프레임워크를 갖지 못했었다. 그 결과 패턴을 이용한 통합의 구현은 애플리케이션을 개발하는 개발자가 직접 개발하거나 EAI 솔루션이 제공하는 방법에 따라 개발해야 했다. 그러나 모듈과 모듈, 애플리케이션과 애플리케이션, 시스템과 시스템, 애플리케이션과 미들웨어 등 기능과 기능을 중재(mediation)하는 기업 통합 패턴의 사상이 녹아 든 Apache Camel이나 Spring Integration과 같은 통합 프레임워크(Integration Framework)가 등장하면서 애플리케이션의 통합에 위의 이메일 전송 라이브러리처럼 극적인 단순함과 생산성, 유연성을 제공할 수 있게 되었다. 그리고 또다시 이 통합 프레임워크는 애플리케이션 프레임워크인 Spring 프레임워크와 결합함으로 장점이 더 극대화된다.

Camel, Spring의 또 다른 예로 바른모 사이트의 "기상청 사이트 서울 날씨 주간 예보 조회 - Spring Framework"를 참조하기 바란다.

이 라이브러리를 실제 업무에 사용하려면 예외 처리나 특정 환경에 맞게 로직들을 추가해야 할 것이다. 이 라이브러리는 기본적인 기능만 제공하기 때문이다. 그럼에도 불구하고 이보다 더 간결하고 확장 및 수정이 가능한 이메일 전송 라이브러리를 만들 수 있는 다른 프레임워크가 있을 수 있을까? 이렇게 Camel과 Spring은 애플리케이션 라이브러리 개발에 아주 유용한 도구이다.


참고 사이트

댓글 없음:

댓글 쓰기