Bluetape4k AWS Part 1: Kotlin 서비스의 AWS 작업대

이 글은 bluetape4k-aws 시리즈의 1편입니다. 전체 시리즈는
Part 1: 프로젝트 개요와 개념 모델에서 시작합니다.
Part 2에서는 핵심 모듈과 AWS 서비스 지원 현황을 살펴보고, Part 3에서는 Spring Boot 4와 Ktor 3 통합을
다룹니다. Part 4에서는 Spring Cloud AWS와의 차이를 정리하고, Part 5에서는 examples/와
bluetape4k-workshop/aws의 실전 예제를 더 상세하게 소개합니다.
AWS에는 이미 AWS SDK for Java v2와
AWS SDK for Kotlin이 있습니다. 두 SDK는
새 AWS API를 사용하는 공식 출발점입니다. 그러나 애플리케이션 코드가 SDK의 모든 통합 세부 사항을
직접 다룰 필요는 없습니다. Kotlin 서비스에는 suspend 함수, 코루틴 친화적인 비동기 변환 계층,
프레임워크별 설정, 로컬 에뮬레이터, BOM을 통한 버전 정렬이 필요합니다.
bluetape4k-aws는 이 사이에 놓인 얇은 통합 계층이며 AWS SDK를 대체하지 않습니다. Java SDK v2와
Kotlin SDK를 기반으로 Kotlin/JVM 서비스가 반복해서 구현하는 기능을 재사용 가능한 도우미로 제공합니다.
일반 Kotlin 서비스는 특정 프레임워크 없이 사용할 수 있고, Spring Boot 4와 Ktor 3 서비스는 각 프레임워크의
관례에 맞게 연결할 수 있어야 합니다. 따라서 이 라이브러리의 핵심 질문은 “새 SDK를 만들 것인가”가 아니라
“서비스 경계에서 기존 SDK를 어떻게 자연스럽게 사용할 것인가”입니다.

bluetape4k-aws는 BOM, SDK 래퍼, 프레임워크 어댑터, 실행 가능한 예제, 로컬 검증 환경을 한 저장소에서 함께 관리합니다.개념 모델
섹션 제목: “개념 모델”이 라이브러리를 볼 때는 세 층으로 나누면 이해하기 쉽습니다.
핵심에는 SDK 래퍼가 있습니다. bluetape4k-aws-java는 AWS Java SDK v2의 동기·비동기 클라이언트와 코루틴
확장 함수를 제공합니다. Java SDK v2는 지원 범위가 넓고 안정적이지만, 비동기 API를 코루틴 서비스에서
사용하려면 변환 계층이 필요합니다. 특히 S3 대용량 전송처럼 처리량이 중요한 경로에서는 AWS CRT
런타임과 CRT 기반 S3AsyncClient를 선택할 수 있습니다.
bluetape4k-aws-kotlin은 AWS Kotlin SDK의 네이티브 suspend API와 DSL 빌더를 Kotlin 관례에 맞게 사용할 수 있도록 돕습니다.
그 위에는 프레임워크 중립적인 공통 계층이 있습니다. S3, SQS, SNS, DynamoDB, KMS, SES, CloudWatch, Kinesis, STS 같은 서비스를 다루더라도 핵심 모듈이 특정 웹 프레임워크를 강제하지 않습니다. 이 원칙 덕분에 같은 AWS 도우미를 CLI, 작업자 프로세스, Spring Boot 서비스, Ktor 서비스에서 함께 사용할 수 있습니다.
애플리케이션과 맞닿는 곳에는 프레임워크 통합 계층이 있습니다. bluetape4k-aws-spring-boot는 Spring Boot 4 자동 설정,
템플릿, 저장소, 리스너, 속성 바인딩을 제공합니다. bluetape4k-aws-ktor는 Ktor 3 SigV4
플러그인, 코루틴 기반 S3 REST 클라이언트, SQS 소비자 런타임, DynamoDB 서버 저장소 등의 접점을
제공합니다. 핵심 계층은 프레임워크에 의존하지 않고, 통합 계층에서 각 프레임워크의 관례를 수용하는 구조입니다.

모듈 구성
섹션 제목: “모듈 구성”현재 프로젝트가 제공하는 모듈은 다음과 같습니다.
출발점은 Spring Cloud AWS가 보여 준 Spring 친화적인 AWS 통합 경험이었습니다. 다만 bluetape4k-aws는
Spring Boot 4에서 코루틴 중심 모듈을 제공하고, 같은 핵심 도우미를 Ktor 3에서도 사용할 수 있도록
확장했습니다. 따라서 Spring Boot 모듈과 Ktor 모듈은 경쟁 관계가 아니라, 같은 AWS
래퍼를 각 프레임워크의 사용 방식에 연결하는 어댑터입니다.
| 영역 | 대표 모듈 | 맡는 일 |
|---|---|---|
| BOM | bluetape4k-aws-bom | io.github.bluetape4k.aws:* 모듈 버전 정렬 |
| Java SDK 변환 계층 | bluetape4k-aws-java | AWS Java SDK v2 래퍼, 비동기·코루틴 확장, CRT 기반 S3 전송, 다양한 AWS 서비스 지원 |
| Kotlin SDK 도우미 | bluetape4k-aws-kotlin | AWS Kotlin SDK 기반 suspend 도우미와 DSL 빌더 |
| 데이터베이스 기반 | bluetape4k-aws-exposed | RDS IAM 인증, Secrets Manager·Parameter Store 설정, Hikari 기반 Exposed 데이터베이스와 이름별 레지스트리 |
| Spring Boot 통합 | bluetape4k-aws-spring-boot | Spring Boot 4 자동 설정과 S3, SES, SNS, SQS, DynamoDB, KMS, Secrets Manager, Parameter Store 등의 연동 기능 |
| Ktor 통합 | bluetape4k-aws-ktor | Ktor 3용 SigV4, S3, SQS, DynamoDB, EventBridge, Kinesis, STS, SES, SNS, Exposed 등의 플러그인과 런타임 |
| 예제 | examples/* | Ktor와 Spring Boot에서 DynamoDB, S3, SQS, Exposed 등 주요 통합을 실행 가능한 코드로 제공 |
Spring Boot 모듈을 사용한다고 Ktor 런타임이 함께 추가되는 구조가 아닙니다. 서비스는 필요한 기능만 선택하면 됩니다. BOM은 모듈 버전을 정렬하고, 핵심 모듈은 SDK와 코루틴의 경계를 정리하며, 프레임워크 어댑터는 애플리케이션 연결 코드를 줄입니다.
로컬 개발 모델
섹션 제목: “로컬 개발 모델”AWS 통합 코드는 검증 환경을 제대로 갖추지 않으면 실제 계정에서만 문제를 재현할 수 있습니다. 그래서
bluetape4k-aws는 Floci, LocalStack, Testcontainers 기반의 로컬 검증 모델을 중요하게 다룹니다.
프로젝트의 통합 테스트는 Testcontainers 기반 AWS 에뮬레이터를 사용합니다. 운영 환경의 요청은 실제
AWS로 향하지만, 개발과 CI에서는 같은 SDK 클라이언트의 엔드포인트를 에뮬레이터로 전환합니다. 지원하는 모듈은
-Dbluetape4k.aws.emulator=... 시스템 속성으로 에뮬레이터를 바꿀 수 있습니다. 기본 정책은 Floci 우선이며,
Floci가 지원하지 않는 호출은 LocalStack으로 검증합니다. MiniStack은 Spring Boot 모듈의 비교 실행에만 사용합니다.
이 모델에서는 서비스 코드가 같은 래퍼를 호출하고 테스트 환경의 엔드포인트만 에뮬레이터로 바뀝니다. DynamoDB 테이블, S3 버킷, SQS 대기열을 실제 계정에 매번 구성하지 않고도 Spring Boot와 Ktor의 연결 상태, 코루틴 실행 흐름을 검증할 수 있습니다.
관련 자료
섹션 제목: “관련 자료”마무리
섹션 제목: “마무리”bluetape4k-aws는 AWS SDK를 다시 구현하지 않습니다. 공식 AWS SDK 위에 Kotlin 코루틴 도우미,
프레임워크 어댑터, 로컬 에뮬레이터 검증, BOM 기반 버전 정렬을 더하는 라이브러리입니다. 일반 Kotlin
서비스는 SDK 래퍼를 직접 사용하고, Spring Boot 4와 Ktor 3 서비스는 각 프레임워크의 연결 기능을 활용하며,
테스트에서는 Floci, LocalStack, Testcontainers로 실제 AWS 계정에 대한 의존성을 줄일 수 있습니다.
다음 글에서는 aws-java, aws-kotlin, aws-exposed와 AWS 서비스 지원 현황을 더 구체적으로 보겠습니다.
어떤 서비스를 어느 모듈에서 다루는지 파악하면 애플리케이션마다 SDK 클라이언트 팩토리를 중복 구현하지
않을 수 있습니다.
댓글
GitHub 계정으로 의견을 남기거나 reaction을 남길 수 있습니다.