[Camel in Action] 14-1. Camel 운영 배포 – Spring Boot와 Docker 컨테이너화

Camel Spring Boot 프로젝트 시작하기

현재 가장 많이 사용하는 Camel 실행 방식은 Spring Boot입니다. Spring Boot의 자동 설정과 Camel의 강력한 통합 기능이 조합되면 최소한의 설정으로 프로덕션급 애플리케이션을 만들 수 있습니다.

Maven 의존성 설정

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>3.2.0</version>
</parent>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.camel.springboot</groupId>
      <artifactId>camel-spring-boot-bom</artifactId>
      <version>4.3.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-activemq-starter</artifactId>
  </dependency>
</dependencies>

Spring Boot 자동 설정 활용

Spring Boot를 사용하면 RouteBuilder 빈을 만들기만 하면 자동으로 Camel 컨텍스트에 등록됩니다.

@Component
public class MyRoutes extends RouteBuilder {
  @Override
  public void configure() throws Exception {
    from("timer:hello?period=5000")
      .log("안녕하세요, ${date:now:HH:mm:ss}");
  }
}

// 메인 클래스 - 별도 설정 없이 Camel이 자동 시작
@SpringBootApplication
public class CamelApp {
  public static void main(String[] args) {
    SpringApplication.run(CamelApp.class, args);
  }
}

Dockerfile 작성

# 멀티 스테이지 빌드로 이미지 크기 최소화
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package -DskipTests

FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/camel-app.jar app.jar

# 보안: 루트가 아닌 사용자로 실행
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

환경변수로 설정 주입

Docker 컨테이너에서는 환경변수로 설정을 주입합니다.

# application.properties
spring.activemq.broker-url=${BROKER_URL:tcp://localhost:61616}
spring.datasource.url=${DB_URL:jdbc:h2:mem:testdb}
camel.springboot.main-run-controller=true

# docker run 시 환경변수 전달
docker run -e BROKER_URL=tcp://mq.prod.com:61616            -e DB_URL=jdbc:postgresql://db.prod.com/enterprise            my-camel-app:latest

헬스체크와 Graceful Shutdown

# application.properties
# Spring Boot Actuator 헬스체크 활성화
management.endpoints.web.exposure.include=health,info,camel
management.endpoint.health.show-details=always

# Graceful Shutdown 설정
server.shutdown=graceful
spring.lifecycle.timeout-per-shutdown-phase=30s

Graceful Shutdown을 설정하면 종료 신호를 받았을 때 현재 처리 중인 메시지를 완료한 후 종료합니다. Kubernetes의 롤링 업데이트 시 메시지 유실을 방지합니다.

Leave a Comment