콘텐츠로 이동

Bluetape4k AWS Part 4: Spring Cloud AWS와 비교하기

초록색 Spring 작업대와 파란색 Kotlin 작업대 사이에서 작은 로봇 작업자들이 AWS 서비스 블록을 저울에 올려 비교하는 3D 일러스트
비교의 목적은 승부를 내는 것이 아니라, 반복되는 AWS 작업을 어디에 맡길지 정하는 것입니다.

이 글은 bluetape4k-aws 시리즈의 4편입니다. Part 1에서는 프로젝트 개요와 개념 모델을 살펴봤고, Part 2에서는 핵심 모듈과 AWS 서비스 지원 현황을 정리했습니다. Part 3에서는 Spring Boot와 Ktor 통합을 살펴봤습니다. 이번 글에서는 Spring Cloud AWS와 bluetape4k-aws의 적용 범위와 책임 경계를 비교합니다.

현재 두 라이브러리의 출발점은 다릅니다. Spring Cloud AWS는 Spring Boot 애플리케이션에서 AWS 관리형 서비스를 Spring 관례로 사용하도록 자동 구성, 템플릿, 리스너를 제공합니다. bluetape4k-aws는 AWS Java SDK v2와 AWS Kotlin SDK를 사용하는 Kotlin/JVM 서비스의 반복 작업을 핵심 도우미로 묶고, 이를 Spring Boot 4와 Ktor 3에 연결합니다. 따라서 단순한 기능 수보다 어느 계층이 클라이언트 생성, 메시지 소비, 전송 방식, 의존성 선택을 책임지는지 비교해야 합니다.

Spring 중심 통합, Kotlin/JVM 공통 기능, AWS 운영 책임을 기준으로 Spring Cloud AWS와 bluetape4k-aws를 비교한 구성도
두 라이브러리는 같은 AWS SDK 계열 위에 서 있지만, 반복 작업을 맡기는 위치가 다릅니다.

Spring Boot 애플리케이션만 운영하고 팀이 Spring Cloud 방식에 익숙하며, Spring Cloud AWS가 제공하는 템플릿, 리스너, 외부 설정 기능으로 요구사항을 충족할 수 있다면 Spring Cloud AWS를 먼저 검토할 수 있습니다. AWS 통합을 Spring Boot 자동 구성과 빈 생명주기로 설명하기 쉽기 때문입니다.

bluetape4k-aws는 Kotlin/JVM 공통 도우미를 먼저 제공하고 그 위에 Spring Boot 4 또는 Ktor 3 어댑터를 둡니다. Java SDK v2 모듈에서는 CRT 기반 HTTP 클라이언트와 S3 TransferManager를 선택할 수 있습니다. AWS Kotlin SDK 모듈은 공유 엔진을 명시적으로 선택할 때 CRT를 기본값으로 제공하며, 필요한 경우 다른 HttpClientEngine을 주입할 수 있습니다.

Ktor 서비스, 코루틴 중심 도우미, CRT 기반 대용량 S3 전송, Exposed 데이터베이스 레지스트리, 로컬 에뮬레이터 검증이 필요하면 bluetape4k-aws의 적용 경계가 분명해집니다. 반대로 Spring Boot 안에서 AWS 통합 전체를 Spring 구성 방식으로 관리한다면 Spring Cloud AWS가 더 자연스러운 출발점입니다.

두 라이브러리는 모두 AWS SDK를 애플리케이션 코드에서 직접 반복해서 다루는 일을 줄입니다. 하지만 무엇을 프레임워크가 맡고, 무엇을 애플리케이션이 명시적으로 고르는지에서 차이가 납니다.

비교 기준Spring Cloud AWSbluetape4k-aws
기본 관점Spring Boot와 Spring Cloud 생태계에서 AWS 관리형 서비스를 Spring 관례로 사용한다.Kotlin/JVM 서비스가 AWS SDK 위에서 반복해서 구현하는 작업을 줄인다.
프레임워크 범위Spring Boot 스타터, 자동 구성, 템플릿, 애너테이션 리스너 중심이다.aws-java, aws-kotlin, aws-exposed 공통 도우미 위에 Spring Boot 4와 Ktor 3 어댑터를 둔다.
SDK 기준AWS Java SDK v2를 Spring Boot 자동 구성과 연결한다.AWS Java SDK v2와 AWS Kotlin SDK에 Kotlin 확장 함수, 코루틴, DSL 빌더를 제공한다.
비동기 기능Spring 메시징, 리스너, 컨테이너 추상화로 AWS SDK 비동기 클라이언트를 감싼다.CompletableFuture, suspend, Flow를 연결해 코루틴 형태의 API를 제공한다.
S3 대용량 전송S3 통합과 템플릿·리소스 모델을 제공한다.CRT 클라이언트와 S3 TransferManager 도우미를 제공하고 Spring Boot에서는 S3TransferOperations로 노출한다.
Ktor대상 프레임워크가 아니다.Ktor 3용 SigV4, S3, SQS, DynamoDB, Exposed 등 플러그인과 런타임을 제공한다.
의존성 정책스타터가 Spring Boot 애플리케이션에 필요한 자동 구성과 의존성을 가져온다.핵심 모듈과 Spring Boot 모듈의 AWS 서비스 SDK는 주로 compileOnly이며 소비자가 추가한다. Ktor 모듈은 플러그인 구현에 필요한 여러 서비스 SDK를 api로 노출한다.
로컬 테스트spring-cloud-aws-testcontainers와 LocalStack 서비스 연결을 제공한다.Floci를 우선 사용하고 지원 범위 차이는 LocalStack으로 검증하며, Testcontainers 기반 예제를 제공한다.

Spring Boot 애플리케이션 안에서 Spring이 AWS 통합의 중심이 되길 원하면 Spring Cloud AWS가 잘 맞습니다. Kotlin/JVM 공통 도우미를 먼저 두고 그 위에서 Spring Boot 4와 Ktor 3를 선택하려면 bluetape4k-aws가 맞습니다. 의존성 정책은 모듈마다 다르므로 실제로 사용할 모듈의 빌드 파일까지 확인해야 합니다.

Spring Cloud AWS는 Spring Cloud와 Spring Boot 애플리케이션을 기준으로 설계됩니다. 현재 호환성 표에 따르면 Spring Cloud AWS 4.x는 Spring Boot 4.0.x, Spring Framework 7.0.x, AWS Java SDK 2.x 조합을 대상으로 하고, S3, SNS, SES, Parameter Store, Secrets Manager, SQS, CloudWatch, DynamoDB, Spring Integration AWS, Kinesis Stream Binder 등을 지원합니다.

이런 경우에는 Spring Cloud AWS를 먼저 검토하는 편이 좋습니다.

  • 애플리케이션이 Spring Boot 중심이고 AWS 통합도 Spring 빈, 속성, 스타터로 관리하려는 경우
  • SQS 소비자를 @SqsListener와 Spring 메시지 변환 모델로 구성하려는 경우
  • S3를 S3Template, 리소스 추상화, Spring Boot 구성 속성과 함께 사용하려는 경우
  • Secrets Manager나 Parameter Store를 Spring 외부 설정으로 가져오려는 경우
  • 팀이 Spring Cloud 릴리스 트레인, 스타터 BOM, Spring Actuator와 관측성 관례에 익숙한 경우

Spring Boot 팀은 이미 사용하는 구성 방식과 생명주기 모델로 AWS 통합을 설명할 수 있습니다. Spring Cloud AWS는 이 환경에서 반복 설정을 줄이고 Spring 방식의 확장 지점을 제공합니다.

bluetape4k-aws에는 Spring Boot 어댑터가 있지만 프로젝트의 중심은 Kotlin/JVM에서 AWS SDK를 사용할 때 반복되는 작업입니다. 핵심 모듈 위에 프레임워크 어댑터를 두기 때문에 Spring Cloud AWS와 기능 구성이 일대일로 대응하지 않습니다. Spring Boot 4와 Ktor 3는 같은 AWS 도우미를 각 프레임워크의 생명주기에 맞게 사용합니다.

첫 번째 차이는 SDK 선택권입니다. bluetape4k-aws-java는 AWS Java SDK v2에 동기·비동기·코루틴 확장 함수를 제공합니다. S3에서는 CRT 기반 S3AsyncClientS3TransferManager 업로드·다운로드 도우미를 제공합니다. S3ClientFactory.TransferManager.create는 기본 실행기로 가상 스레드 실행기를 사용하며, 호출자가 다른 Executor를 전달할 수도 있습니다.

두 번째 차이는 AWS Kotlin SDK입니다. bluetape4k-aws-kotlin은 네이티브 suspend API와 DSL 빌더를 제공합니다. 공유 HTTP 엔진을 명시적으로 사용할 때는 CRT가 기본값이며, 필요하면 다른 HttpClientEngine을 주입할 수 있습니다. 반면 클라이언트 생성 함수에서 httpClient를 생략하면 SDK가 HTTP 엔진의 생명주기를 소유합니다. 공유 엔진과 클라이언트 전용 엔진의 종료 책임을 구분해야 합니다.

세 번째 차이는 Ktor입니다. Spring Cloud AWS는 Spring 애플리케이션을 대상으로 하지만, bluetape4k-aws는 Ktor 3 어댑터를 별도 모듈로 제공합니다. AwsSigV4Plugin, S3KtorClient, SqsConsumer, DynamoDbKtorPlugin, AwsExposedPlugin은 Ktor의 install(...), 경로 도우미, 생명주기 이벤트에 맞춰 AWS 작업을 연결합니다.

네 번째 차이는 의존성 경계입니다. aws-java, aws-kotlin, aws-spring-boot의 서비스별 SDK 의존성은 대부분 compileOnly이므로 소비자가 필요한 SDK 모듈을 추가합니다. 그러나 aws-ktor는 플러그인 구현에 필요한 여러 Java·Kotlin SDK를 api로 노출합니다. 따라서 bluetape4k-aws 전체를 하나의 의존성 정책으로 일반화하지 말고 선택한 모듈의 빌드 파일을 확인해야 합니다.

SQS는 두 라이브러리의 차이가 분명한 영역입니다. Spring Cloud AWS는 SqsTemplate, SqsMessageListenerContainer, @SqsListener, 메시지 변환, 승인, 일괄 처리, 관측성 기능을 제공합니다. Spring Boot 애플리케이션에서는 대기열 리스너를 Spring 빈 생명주기 안에서 관리합니다.

bluetape4k-aws-spring-boot@SqsListener와 코루틴 리스너 컨테이너를 제공합니다. Kotlin 코루틴 처리기에서 SQS 수신, 삭제, 가시성 타임아웃, 재시도, 수동 승인을 반복 구현하지 않도록 돕습니다. Ktor에서는 애너테이션 대신 SqsConsumer 플러그인이 애플리케이션 시작과 종료에 맞춰 폴링 런타임을 관리합니다.

S3도 비슷합니다. Spring Cloud AWS는 Spring 애플리케이션에서 S3를 템플릿과 리소스 추상화로 다룹니다. bluetape4k-aws는 SDK 실행 방식도 선택할 수 있도록 지원합니다. 작은 객체 작업에는 코루틴 템플릿과 도우미를, 대용량 파일 처리에는 CRT 기반 비동기 클라이언트와 S3TransferManager를 사용합니다. Spring Boot 어댑터는 이를 S3TransferOperations로 노출하고, 핵심 모듈은 TransferManager 확장 함수를 제공합니다.

운영 코드에서는 S3 전송에 사용하는 HTTP 클라이언트와 전송 런타임, 종료 책임을 확인할 수 있어야 합니다. bluetape4k-aws는 이 결정을 설정, 클라이언트 팩토리, 작업 도우미에 드러냅니다.

가능하지만 하나의 AWS 경계에는 한 책임 주체만 두어야 합니다. 같은 Spring Boot 애플리케이션에서 Spring Cloud AWS와 bluetape4k-aws-spring-boot가 동일한 SQS 대기열 리스너를 관리하면 수신 반복, 승인, 재시도, 가시성 타임아웃의 소유권이 중복됩니다.

현실적인 조합은 이렇게 나뉩니다.

  • Spring Boot 애플리케이션의 SQS, S3, 외부 설정 통합을 Spring Cloud AWS에 맡깁니다.
  • Kotlin 도우미가 필요한 모듈에서는 bluetape4k-aws-javabluetape4k-aws-kotlin만 사용합니다.
  • Ktor 서비스는 bluetape4k-aws-ktor를 사용하고 Spring Boot 서비스와 AWS 도우미 및 설정 규칙을 공유합니다.
  • CRT와 TransferManager가 필요한 대용량 S3 전송은 bluetape4k-aws-java를 별도 경계로 둡니다.

같은 대기열, 버킷 작업, 설정 원본을 두 라이브러리가 동시에 소유하지 않도록 경계를 정해야 합니다.

Spring Boot 전용 서비스, Kotlin 코루틴 서비스, Ktor 런타임, CRT 기반 S3 전송 조건에 따라 Spring Cloud AWS와 bluetape4k-aws를 선택하는 흐름도
선택 기준은 프레임워크 선호가 아니라 반복되는 AWS 작업을 어디에 맡길지입니다.

다음 기준으로 지금 적합한 출발점을 고를 수 있습니다.

상황먼저 볼 선택
Spring Boot 애플리케이션이고 Spring Cloud 관례가 팀 표준인 경우Spring Cloud AWS
AWS 통합을 Spring 스타터, 속성, 템플릿, 리스너로 구성하려는 경우Spring Cloud AWS
AWS Java SDK v2 비동기 클라이언트에 코루틴 중심 도우미가 필요한 경우bluetape4k-aws-java
AWS Kotlin SDK와 CRT 공유 엔진, DSL 도우미를 함께 사용하려는 경우bluetape4k-aws-kotlin
Spring Boot 4와 Ktor 3 서비스가 같은 AWS 도우미 규칙을 사용해야 하는 경우bluetape4k-aws
Ktor에서 SigV4, S3 REST 클라이언트, SQS 소비자, DynamoDB 플러그인이 필요한 경우bluetape4k-aws-ktor
S3 대용량 파일 처리에서 CRT와 TransferManager 사용을 명시해야 하는 경우bluetape4k-aws-java / bluetape4k-aws-spring-boot
Exposed 데이터베이스 레지스트리를 Secrets Manager나 Parameter Store와 연결하려는 경우bluetape4k-aws-exposed / bluetape4k-aws-spring-boot

이 표는 순위가 아니라 적용 경계를 고르는 기준입니다. Spring Cloud AWS는 Spring 애플리케이션 안에서 AWS 통합을 Spring 구성 방식으로 관리할 때 적합합니다. bluetape4k-aws는 Kotlin/JVM 공통 도우미를 Spring Boot 4와 Ktor 3에서 함께 사용하려는 경우에 적합합니다.

어느 라이브러리를 쓰더라도 AWS 운영 책임은 남습니다. IAM 정책, 암호화, 타임아웃, 재시도, 멱등성, 대기열 순서, DLQ, S3 멀티파트 임계값, DynamoDB 용량, 테이블 마이그레이션, 로컬 에뮬레이터와 실제 AWS의 차이는 여전히 애플리케이션과 운영 환경이 결정해야 합니다.

특히 SNS HTTP 엔드포인트에서는 서명 검증을 애플리케이션 책임으로 다뤄야 합니다. bluetape4k-aws-spring-bootSnsHttpMessageParser는 메시지 유형, 주제 ARN, 토큰, 페이로드를 읽고 일부 필드와 인증서 URL 형식을 검증하지만 암호학적 서명을 검증하지 않습니다. 예상 주제 ARN, 인증서 체인, 서명을 검증한 뒤 메시지를 신뢰해야 합니다. Spring Cloud AWS를 사용하더라도 신뢰 경계는 별도로 설계해야 합니다.

다음 글에서는 examples/bluetape4k-workshop/aws의 실전 예제로 이 선택 기준이 코드에서 어떻게 드러나는지 살펴봅니다.

댓글

GitHub 계정으로 의견을 남기거나 reaction을 남길 수 있습니다.