2022년 2월 7일 월요일

Apache Camel 애플리케이션 만들기

Apache Camel 애플리케이션 만들기

들어가며

일반적으로 애플리케이션에서 프레임워크를 이용하려면, 개발 소스 프로젝트에 프레임워크가 요구하는 의존, 설정, 코드 등을 입력해야 합니다. 그러므로 새로운 프레임워크를 이용하려는 개발자는 반드시, 이 내용을 프레임워크 관련 자료나 책 등을 학습해 애플리케이션 프로젝트에 적용해야 합니다. Java 애플리케이션 프레임워크로 가장 장 알려진 Spring 프레임워크나 Spring Boot 프레임워크도 오류 없이 기대하는 동작을 실행시키려면, Java 메인 클래스, 설정, 클래스, 메서드, 애노테이션, application.properties 나 application.yaml 등 애플리케이션 개발에 필요한 여러 가지 “관례(convention)” 와 “설정(configuration)”을 이해하고 올바르게 입력해야 합니다.

이런 과정은 Apache Camel 프레임워크를 사용할 때도 동일하게 적용됩니다. 그런데 Apache Camel 프레임워크를 처음 접한 개발자들이 올바른 Apache Camel 애플리케이션을 만들기는 그렇게 간단하지 않습니다. 그 이유는Apache Camel 프레임워크도 “관례(convention)”와 “설정(configuration)”을 정확하게 사용해야 하는데, 이런 “관례(convention)”와 “설정(configuration)” 은 해당 기술을 깊은 이해해야 체득되는 것이기 때문입니다.

Apache Camel 프레임워크를 접한 개발자들이 “관례(convention)”와 “설정(configuration)” 이 잘 구성된 애플리케이션 프로젝트부터 개발을 시작하는 것은 굉장히 중요한 출발점입니다. 그럼에도 책이나 문서들은 이 출발점에 대해 다양하게 설명하지만 선택할 수 없는 차림표처럼 제시할 뿐, 어떤 것이 최선의 “관례(convention)”와 “설정(configuration)” 인지는 잘 설명하고 있지 않습니다.

이런 점에서 이 글 Apache Camel 프레임워크 개발자들에게 유용한 Apache Camel 애플리케이션 프로젝트의 출발점을 제공합니다. 이를 위해 이 글은 Apache Camel 애플리케이션 개발을 시작하는 다양한 방법 중 주요 방법을 설명하고, 그 중 일관된 “관례(convention)”와 “설정(configuration)” 를 포함한 Apache Camel 애플리케이션 프로젝트를 생성하게 해주는 필자의 Spring Boot Apache Camel XML Archetype 을 설명합니다.

Apache Camel 이란?

  Apache Camel 은 잘 정립된 기업 통합 패턴(Enterprise Integraion Patterns) 개념을 이용해, 쉽고 표준적인 방법으로 애플리케이션을 통합할 수 있게 하는 Java로 작성된 프레임워크입니다. Apache Camel 의 컴포넌트는 데이터베이스, 메시지 브로커, HTTP 애플리케이션, 파일 시스템 등 다양한 기술의 엔드포인트를 통합(접속)시킬 수 있습니다. 이미 이런 컴포넌트가 300 개 이상 구현되어 있습니다. 예를 들어, Twitter, AWS, Azure, Kafka, Google, File, FTP, SOAP, Rest API, DBMS, No Sql 등등 대부분의 주요 플랫폼과 기술들의 컴포넌트를 포함합니다. 이런 점에서 Apache Camel 은 기업 통합(Enterprise Integration)을 위한 완벽한 스위스 칼(Swiss knife)입니다.

Apache Camel 프로젝트 만들기

Apache Camel 은 독립적으로 실행될 수도 있으나, 다양한 애플리케이션 프레임워크와 결합해 실행하는 내장형 통합 프레임워크 입니다. 그 중 가장 현대화된 방식으로 Spring Boot 나 Quarkus 애플리케이션에 Apache Camel 을 내장해 애플리케이션을 실행하는 것입니다. 그 외 더 다양한 방식으로 실행할 수 있으나, 실무적으로 이 두 방식이 가장 유용성이 높을 것으로 보입니다. 이 글은 Spring Boot 나 Quarkus 와 결합한 Apache Camel 애플리케이션 프로젝트를 만드는 법을 소개합니다. Apache Camel 애플리케이션 소스 생성하는 방법으로 웹 기반 생성과 Maven Archetype 을 이용한 방법을 소개합니다. 다른 방법에 관심있는 독자는 독자 자신의 탐구 과제로 남기겠습니다.

실행 환경

Apache Camel 애플리케이션 생성 환경은 다음과 같습니다. 사전에 설치돼 있어야 합니다.

  • Linux 또는 macOS 권장
  • JDK 8+
  • Maven 3.5+

Spring initaializr 를 이용한 프로젝트 만들기

Apache Camel 애플리케이션 프로젝트는 Spring initaializr(https://start.spring.io/) 사이트를 이용해 만들 수 있습니다. 이 사이트를 이용하면, 생성한 애플리케이션 프로젝트에서 아마치 카멜과 Spring Boot 프레임워크를 함께 이용할 수 있습다. Apache Camel 은 Spring 프레임워크와 잘 결합되고, Spring 프레임워크에서도 Apache Camel 을 이니셜라이져 사이트에서 내장할 수 있게 지원합니다. Spring 이니셜라이저 사이트에서 다음 정보를 입력해 Apache Camel 의존을 포함하면 Apache Camel 애플리케이션을 만들 수 있습니다.

이 글에서는 Spring Initializr 에서 생성하는 프로젝트 형식은 Java Maven 프로젝트로 지정했습니다. Gradle 프로젝트로도 생성할 수 있으나, Apache Camel 프로젝트는 Maven 프로젝트를 선호하기 때문입니다. 그 이유는 “Simple is Better” 원칙을 따르기 때문일 것입니다.

  • Project : Maven Project

  • Spring Boot: 2.6.3

  • Project Metadata

    • Group: org.example
    • Artifact: camel-sprig-hello
    • Name: camel-spring-hello
    • Description: Demo project for Spring Boot
    • Package name: org.example.camel-spring-hello
    • Packaging: Jar
    • Java: 11
  • Dependencies: Spring Web, Apache Camel

    camel-spring-hello

위 값들을 입력 후, “GENERATE” 버튼을 클릭하면 camel-hello.zip 파일로 Apache Camel 애플리케이션 프로젝트 소스를 다운로드 합니다.

생성된 camel-spring-hello 프로젝트 구조는 다음과 같습니다.

camel-spring-hello  
├── HELP.md  
├── mvnw  
├── mvnw.cmd  
├── pom.xml  
└── src  
 ├── main 
 │   ├── java 
 │   │   └── org 
 │   │       └── example 
 │   │           └── camelspringhello 
 │   │               └── CamelSpringHelloApplication.java 
 │   └── resources 
 │       └── application.properties 
 └── test 
     └── java 
         └── org 
             └── example 
                 └── camelspringhello 
                     └── CamelSpringHelloApplicationTests.java

Spring Initializr 가 생성한 Apache Camel 프로젝트의 Apache Camel 프레임워크 버전은 Spring Boot 버전에 따라 결정됩니다. 그러므로 원하는 Apache Camel 프레임워크 버전을 맞추려면 Spring Boot 버전을 조정할 필요가 있습니다.

생성된 Apache Camel 프로젝트는 Spring Boot Maven 프로젝트로 생성됐으므로, 다음 명령으로 실행할 수 있습니다.

mvn spring-boot:run

그러나 생성된 프로젝트는 필요한 의존 라이브러리만 포함되었을 뿐, 로직이 구현되어 있지 않았으므로 실행 결과를 기대할 수 없습니다.

Code with Quarkus 를 이용한 프로젝트 만들기

Apache Camel 애플리케이션 프로젝트는 Code with Quarkus(https://code.quarkus.io) 사이트를 이용해 만들 수 있습니다. 이 사이트를 이용하면, 생성한 애플리케이션 프로젝트는 Apache Camel 프레임워크와 Quarkus 프레임워크를 함께 사용할 수 있습니다. Quarkus 프레임워크가 커뮤니티에 소개된 기간을 길지 않으나, Red Hat 이 Red Hat 제품에서 Spring Framework 을 대체하고, Apache Camel 을 사용하게 하는 방향으로 발전하고 있습니다.

  • CONFIGURE YOUR APPLICATION
    • Group: org.example
    • Artifact: camel-quarkus-hello
    • Build Tool: Maven
    • Extentions: Camel Core

camel-quarkus-hello

생성된 camel-quarkus-hello 프로젝트 구조는 다음과 같습니다.

camel-quarkus-hello  
├── README.md  
├── mvnw  
├── mvnw.cmd  
├── pom.xml  
└── src  
    ├── main 
    │   ├── docker 
    │   │   ├── Dockerfile.jvm 
    │   │   ├── Dockerfile.legacy-jar 
    │   │   ├── Dockerfile.native 
    │   │   └── Dockerfile.native-distroless 
    │   ├── java 
    │   │   └── org 
    │   │       └── example 
    │   │           └── GreetingResource.java 
    │   └── resources 
    │       ├── META-INF 
    │       │   └── resources 
    │       │       └── index.html 
    │       └── application.properties 
    └── test 
        └── java 
            └── org 
                └── example 
                    ├── GreetingResourceTest.java 
                    └── NativeGreetingResourceIT.java

생성된 소스 구조는 Spring Boot 와 유사합니다. 추가로 Docker 이미지 생성 관련 설정도 포함됩니다. 그런데 생성된 애플리케이션 소스는 Apache Camel 관련 의존만 포함하므로, Apache Camel 소스를 어떻게 구현할 것인가 에 대해서는 개발자가 결정해야 합니다. Quarkus 프레임워크는 개발자들에게 생소하므로, 사용하기 위한 사전 학습 또는 Red Hat 컨설팅의 도움이 필요합니다. 좀더 자세한 소개는 아래 참고 사이트를 방문해 주십시오.

생성된 Apache Camel 프로젝트는 Maven 프로젝트로 생성됐으므로, 다음 명령으로 실행할 수 있습니다.

./mvnw compile quarkus:dev

그런데 필자가 Code with Quarkus 2.7 에서 다운로드한 camel-quarkus-hello 는 컴파일이 잘 되지 않았습니다. 어떤 이유가 있을 텐데… 이런 문제는 오픈 소스를 사용하는 경우 빈번히 발생하는 문제입니다. 이 글은 Apache Camel 프로젝트를 만드는 방법을 소개하는 글이므로, 관심있는 독자께서는 직접 컴파일을 시도해 보시고, 문제가 있을 경우 문제 원인을 찾아 해결할 수 있을 것입니다.

Apache Camel Archetype 을 이용한 프로젝트 만들기

Apache Camel 은 Maven Archetype 을 이용해 Apache Camel 애플리케이션 프로젝트를 생성하는 방식도 지원합니다. 이 방식의 장점은 웹 환경이 없어도 간단히 Maven 명령을 이용해 Camel 애플리케이션 프로젝트를 생성할 수 있다는 점입니다. 다음은 명령은 Apache Camel 3.14.1 버전과 Spring Boot 프레임워크가 결합된 Apache Camel 애플리케이션 프로젝트를 생성합니다.

mvn archetype:generate \
 -B \
 -DarchetypeGroupId=org.apache.camel.archetypes \
 -DarchetypeArtifactId=camel-archetype-spring-boot \
 -DarchetypeVersion=3.14.1 \
 -DgroupId=org.example \
 -DartifactId=camel-spring-archetype-hello

Spring Boot 외 다양한 프레임워크나 기술 기반의 프로젝트를 생성할 수 있습니다. 아래 참고 사이트를 참조해 주십시오.

생성된 camel-spring-archetype-hello 프로젝트 구조는 다음과 같습니다.

camel-spring-archetype-hello  
├── pom.xml  
└── src  
 ├── main 
 │   ├── java 
 │   │   └── org 
 │   │       └── example 
 │   │           ├── MySpringBean.java 
 │   │           ├── MySpringBootApplication.java 
 │   │           └── MySpringBootRouter.java 
 │   └── resources 
 │       ├── META-INF 
 │       │   ├── LICENSE.txt 
 │       │   └── NOTICE.txt 
 │       └── application.properties 
 └── test 
     ├── java 
     │   └── org 
     │       └── example 
     │           └── MySpringBootApplicationTest.java 
     └── resources

생성된 소스는 Apache Camel Java DSL 라우트 정의는 포함되어 있으나, XML DSL 은 포함되어 있지 않습니다. XML DSL 을 포함한 애플리케이션 생성은 Red Hat Fuse 에서 만 제공하기 있습니다. 최근들어 커뮤니티에서는 Java DSL 을 선호하는 측면이 있으나, XML DSL 이 갖는 장점도 분명하므로, Apache Camel 애플리케이션은 XML DSL 과 Java DSL 을 함께 사용하는 것을 권장 드립니다. 그리고 생성된 파일 이름에 MySpring 이 붙고, 라이선스 파일이 META-INF 디렉토리 아래 위치하는데… 이런 것들을 애플리케이션 생성 후, 수정이 필요한 부분 들입니다.

Red Hat Fuse Maven Archetype 을 이용한 프로젝트 만들기

Apache Camel 프로젝트는 Red Hat 이 주도하는 오픈 소스 프로젝트입니다. 그러므로 Red Hat 은 Apache Camel 을 포함한 상용 오픈 소스 통합 제품으로 Red Hat Fuse 를 판매합니다. Red Hat Fuse 는 커뮤니티 오픈 소스인 Apache Camel 에 확장된 개발 도구, 개발 문서, 라이브러리, 레지스트리, 컨설팅 서비스, 기술 지원 서비스 등을 추가적으로 제공합니다. 그 중 Red Hat Fuse Maven Archetype 를 이용해 Apache Camel 애플리케이션 프로젝트를 만드는 방법을 제공합니다. 이 방법을 이용해 만들어진 프로젝트 소스는 커뮤니티 Apache Camel 기반이 아닌 Red Hat Camel 프로젝트가 만들어지나, 온전히 동작되는 소스 구조를 갖고 있으므로, Red Hat Fuse 를 구매한 고객의 개발자는 이 기능을 유용하게 이용할 수 있습니다. 다음은 Red Hat Fuse spring-boot-camel-xml-archetype 을 이용해 Red Hat Camel 애플리케이션을 생성한 예입니다.

wget https://gitlab.com/hinunbi/spring-boot-camel-xml-archetype/-/raw/main/configuration/settings.xml   

mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
 -B \
 -s settings.xml \
 -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-sb2-780040-redhat-00002/archetypes-catalog-2.2.0.fuse-sb2-780040-redhat-00002-archetype-catalog.xml \
 -DarchetypeGroupId=org.jboss.fuse.fis.archetypes \
 -DarchetypeArtifactId=spring-boot-camel-xml-archetype \
 -DarchetypeVersion=2.2.0.fuse-sb2-780040-redhat-00002 \
 -DgroupId=org.example \ -DartifactId=fuse-hello

위 명령 실행에 settings.xml 파일 필요한 이유는, Red Hat Fuse 애플리케이션을 생성하기 위한 Archetype 이 Apache Maven Central 저장소에는 등록되어 있지 않고, 상용 제품이다 보니, Red Hat Maven 저장소에만 등록되어 있기 때문입니다.

생성된 fuse-hello 프로젝트 구조는 다음과 같습니다.

fuse-hello/  
├── LICENSE.md  
├── configuration  
│   └── settings.xml  
├── pom.xml  
└── src  
 ├── data 
 ├── main 
 │   ├── fabric8 
 │   │   └── deployment.yml 
 │   ├── java 
 │   │   └── org 
 │   │       └── example 
 │   │           ├── Application.java 
 │   │           └── MyTransformer.java 
 │   └── resources 
 │       ├── application.properties 
 │       ├── logback.xml 
 │       └── spring 
 │           └── camel-context.xml 
 └── test 
     └── java 
         └── org 
             └── example

Red Hat Fuse Camel 애플리케이션은 개발자가 애플리케이션을 개발할 때 필요한 Spring Boot Undertow WAS 와 Camel Java DSL, XML DSL 과 최근 보안 취약점이 발견된 log4j 가 아닌 logback.xml 을 포함하고, Red Hat OpenShift 플랫폼에 컨테이너 이미지로 배포하기 위한 파일과 설정 들도 포함되어 있습니다. 단위 테스트 소스가 포함되어 있지 않은 점을 제외하면 개발자들이 개발을 시작할 때 가장 좋은 Camel 애플리케이션 소스 구조를 갖고 있습니다. 그러나 Red Hat Fuse 를 구매하지 않은 경우, 생성된 소스와 라이브러리 사용 시, 저작권 문제가 걸릴 수 있습니다.

Apache Camel 애플리케이션 만들기

Apache Camel 애플리케이션은 위와 같은 방식으로 최초 프로젝트 소스를 생성한 후, 프로젝트에 300 개 이상의 통합 컴포넌트 의존을 추가함으로, 현대 애플리케이션의 통합에 필요한 대부분의 기능을 지원할 수 있습니다. 그러나 위 생성 방법들을 이용해 생성된 Apache Camel 애플리케이션은 오픈 소스 결과물의 불완전성, 생성된 소스의 불합리한 구조, 상용 오픈 소스가 갖는 저작권 등을 때문에, 개발자는 생성된 소스를 다시 정비해 사용해야 합니다. 그리고 이렇게 정비한 소스로 Apache Camel 애플리케이션 개발 출발점을 삼아야 합니다. 그런데 이 과정은 반복되나 사람이 하는 일이라 일관되지 않는 경우가 빈번합니다. 그렇다고 계속 정비해 이용 하자니, 불편함이 따릅니다.

이런 문제점을 해결하기 위해, 필자는 위 방법을 종합한 Apache Camel 애플리케이션 Archetype 을 새로 개발했습니다. 필자가 개발한 Apache Camel Archetype 은 커뮤니티 오픈 소스에 기반한 Apache Camel 애플리케이션을 생성함에도, 소스 구조는 Red Hat Fuse 구조로 생성되고 Camel Java DSL과 XML DSL 을 모두 사용하고, Red Hat OpenShift(Kubernetes) 플랫폼에 배포될 수 있는 설정과 Maven 플러그인 등을 자동으로 포함합니다. 사용 방법은 위에서 설명한 Maven Archetype 을 이용한 Apache Camel 애플리케이션 생성과 유사합니다. 필자의 Archetype 을 사용해 Apache Camel 애플리케이션을 생성하는 명령은 다음과 같습니다. 좀더 자세한 설명은 필자의 spring-boot-camel-xml-archetype Git 저장소 를 참고해 주십시오.

git clone https://gitlab.com/hinunbi/spring-boot-camel-xml-archetype.git  
cd spring-boot-camel-xml-archetype  
git checkout tags/0.0.1
mvn install archetype:update-local-catalog  
  
mvn org.apache.maven.plugins:maven-archetype-plugin:3.2.1:generate \  
 -B \
 -DarchetypeGroupId=hinunbi.camel.archetypes \
 -DarchetypeArtifactId=spring-boot-camel-xml-archetype \
 -DarchetypeVersion=0.0.1 \
 -Dspring-boot-version=2.5.4 \
 -Dcamel-version=3.14.1 \
 -Dfabric8-version=5.12.0 \
 -Djkube-version=1.5.1 \
 -DgroupId=org.example \
 -DartifactId=camel-hinunbi-hello  

필자가 테스트한 Apache Camel 애플리케이션 생성에 사용한 Apache Camel 버전과 Spring Boot 버전 등, 이 글을 쓰는 시점에서 유효합니다.
오픈 소스들은 역동적으로 발전함으로, 이 글을 읽는 독자가 실행하는 시점에 프레임워크들의 버전이 업그레이드 된 경우, 업그레이드 버전으로 테스트 할 수 있을 것입니다. 다만 Apache Camel 이 의존하는 Spring Boot 버전에 따라 위 명령에 -Dspring-boot-version=* 값을 정확히 입력해야 점은 유의해야 합니다.

생성된 camel-hinunbi-hello 프로젝트 구조는 다음과 같습니다.

camel-hinunbi-hello/  
├── LICENSE.txt  
├── NOTICE.txt  
├── ReadMe.adoc  
├── pom.xml  
└── src  
    ├── main 
    │   ├── java 
    │   │   └── org 
    │   │       └── example 
    │   │           ├── Application.java 
    │   │           ├── MySpringBean.java 
    │   │           └── MySpringBootRouter.java 
    │   └── resources 
    │       ├── application.properties 
    │       ├── logback.xml 
    │       └── spring 
    │           └── camel-context.xml 
    └── test 
        ├── java 
        │   └── org 
        │       └── example 
        │           └── ApplicationTest.java 
        └── resources

필자가 개발한 Apache Camel Maven Archetype 을 이용해 생성한 Apache Camel 프로젝트 소스는 Red Hat Fuse Camel 애플리케이션 소스와 같은 구조이면서 순수하게 Apache Camel, Spring Boot 오픈소스로만 구성된 소스가 생성된 것을 볼 수 있습니다.

생성된 Apache Camel 프로젝트는 Spring Boot maven 프로젝트로 생성됐으므로, 다음 명령으로 실행할 수 있습니다.

mvn spring-boot:run

맺음말

일련의 애플리케이션들은 협업을 하기 위해, 좋은 아키텍처가(모노리스/마이크로서비스) 필요하듯이,
좋은 애플리케이션은 소스 구조가 좋아야 합니다.
소스 구조가 좋으려면, 소스는 사용하는 프레임워크들의 관례를 일관되게 지켜야 합니다.
그래야 개발자들은 소스 구조에 대한 공통의 이해를 갖고 개발자들 사이 의사 소통(communication)이 원할해 질 수 있습니다.
Apache Camel 애플리케이션도 이런 소스 구조 관례를 잘 지켜야 개발 생산성이 올라갈 수 있습니다.

이 글에서는 여러 프레임워크에서 Apache Camel 을 포함한 소스를 생성하는 방법과 생성된 소스 구조를 설명했습니다.
그리고 필자가 생각하는 최선의 관례를 포함한 필자의 Archetype 을 소개했습니다.
Apache Camel 에 관심을 갖고 통합 업무에 Apache Camel 프레임워크를 적용해 보려는 개발자들이 이 글을 읽고, 따라 실행해 Apache Camel 애플리케이션을 만들어 본다면,
Apache Camel 애플리케이션 개발을 시작할 때 그 출발점을 어떻게 해야할 지 결정하는데, 도움이 될 것입니다.

참고 자료

  1. Enterprise Integration Patterns
  2. 기업 통합 패턴
  3. Spring Boot Camel XML Archetype
  4. Spring Boot Initializr
  5. Code with Quarkus
  6. Apache Camel Archetype
  7. Apache Maven Archetype
  8. Quarkus + Apache Camel 소개