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의 롤링 업데이트 시 메시지 유실을 방지합니다.