AWS SES와 Kotlin/Gradle로 메일 발송 라이브러리 만들기

AWS SES SDK를 이용해 Kotlin/Gradle 기반의 간단한 메일 발송 라이브러리를 만드는 과정을 정리해보았다.
코틀린스프링
By Jeongmin Seo3월 6일, 2023년

AWS의 이메일 서비스인 SES(Simple Email Service)를 활용해서,
Kotlin과 Gradle 기반의 간단한 메일 발송 라이브러리를 구축한 경험을 공유한다.

1. 왜 만들었나?

항공 서비스를 개발하면서 회원가입을 위한 초대 메일 발송, 인증 등 다양한 목적으로 이메일을 보내야 했다.
특히 많은 사용자에게 개인화된 메일을 보내려면 안정적이고 확장 가능한 시스템이 필수다.
AWS SES는 저렴한 비용에 높은 전송률을 보장하는 좋은 솔루션이고,
이걸 좀 더 편하게 회사의 주요 용도에 맞게 재사용하려고 직접 기능들을 래핑했다.

2. 프로젝트 목표

  • 재사용성: 어떤 Kotlin/Java 프로젝트든 쉽게 의존성을 추가해서 쓸 수 있는 모듈화된 라이브러리를 만든다.
  • 추상화: SES의 복잡한 설정을 감추고, 개발자가 최소한의 정보(수신자, 제목 등)만으로 메일을 보내게 간단한 인터페이스를 제공한다.

3. 프로젝트 구조

표준 Gradle/Kotlin 라이브러리 구조를 따른다.

├── build.gradle.kts ├── settings.gradle.kts └── src └── main └── kotlin └── {company_domain}/sestransferlibrary/ ├── dto/ │ └── BulkRecipientDto.kt ├── model/ │ └── SesCredentialsModel.kt ├── service/ │ ├── IMailService.kt │ └── SesService.kt └── utils/ └── extension.kt

주요 파일 설명

  • build.gradle.kts: 프로젝트 의존성(AWS SES SDK 등)과 빌드 설정을 관리한다.
  • IMailService.kt: 메일 발송의 핵심 기능을 정의한 인터페이스. 나중에 다른 메일 서비스로 쉽게 교체할 수 있는 기반이 된다.
  • SesService.kt: IMailService의 실제 구현체. AWS SES SDK로 메일을 보내는 핵심 로직이 담겨있다.
  • BulkRecipientDto.kt: 대량 발송 시 수신자 한 명의 정보(이메일, 개인화 데이터)를 담는 DTO.
  • SesCredentialsModel.kt: AWS SES 접근 자격 증명을 관리하는 데이터 모델.
  • extension.kt: 코드를 더 간결하게 만드는 Kotlin 확장 함수들을 모아둔다.

4. 의존성 설정: build.gradle.kts

이 라이브러리가 동작하려면 AWS Java SDK(SES)가 필요하다. build.gradle.kts에 의존성을 추가한다.

// build.gradle.kts dependencies { // AWS Java SDK for SES implementation(""com.amazonaws:aws-java-sdk-ses:1.12.725"") // 최신 버전 확인 필요 // 기타 코틀린 관련 라이브러리 }

5. 핵심 로직 구현: SesService.kt

SesService는 AWS SES 클라이언트를 초기화하고, 외부 데이터를 SES가 요구하는 형식으로 변환해 메일을 전송하는 역할을 한다.

// SesService.kt import com.amazonaws.services.simpleemail.AmazonSimpleEmailService import com.amazonaws.services.simpleemail.model.* class SesService(private val credentialsModel: SesCredentialsModel) : IMailService { private val client: AmazonSimpleEmailService = // AWS SES Client 초기화 로직 override fun sendBulkEmail( sender: String, recipients: List<BulkRecipientDto>, templateName: String ) { val destinations = recipients.map { recipient -> Destination().withDestination( ToAddresses = listOf(recipient.email) ).withReplacementTemplateData( // 예: {""name"": ""홍길동""} recipient.templateDataAsJsonString ) } val request = SendBulkTemplatedEmailRequest().apply { source = sender template = templateName destinations = destinations defaultTemplateData = ""{ ""name"":""고객"" }"" // 기본값 } try { val result = client.sendBulkTemplatedEmail(request) // 성공 처리 } catch (e: Exception) { // 실패 처리 } } }

이 코드는 실제 구현과 다른 예시를 위한 코드다.

6. 라이브러리 사용법 (예시)

예시로 다른 프로젝트에서 이렇게 간단히 쓸 수 있다.

fun main() { // 1. 자격 증명 설정 val credentials = SesCredentialsModel(""YOUR_AWS_ACCESS_KEY"", ""YOUR_AWS_SECRET_KEY"") // 2. 서비스 초기화 val mailService = SesService(credentials) // 3. 수신자 목록 생성 val recipients = listOf( BulkRecipientDto(email = ""test1@example.com"", templateData = mapOf(""name"" to ""김대용"")), BulkRecipientDto(email = ""test2@example.com"", templateData = mapOf(""name"" to ""이지헌"")) ) // 4. 메일 발송 mailService.sendBulkEmail( sender = ""no-reply@정민.xyz"", recipients = recipients, templateName = ""TEMPLATE_NAME"" ) }

7. 마무리

AWS SES와 Kotlin/Gradle로 재사용 가능한 메일 발송 라이브러리를 구축하는 과정을 살펴봤다.

나의 경우 이 라이브러리를 사내 Nexus 저장소에 배포해서 모든 Kotlin/Java 프로젝트에서 쉽게 사용할 수 있게 했다.

이렇게 라이브러리를 만들어 두면, 회사 내 다른 프로젝트에서도 이메일 발송 기능이 필요할 때마다 밑바닥부터 구현할 필요 없이 가져다 쓸 수 있어 개발 생산성을 크게 높일 수 있다.