AWS SES와 Kotlin/Gradle로 메일 발송 라이브러리 만들기
목차
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 프로젝트에서 쉽게 사용할 수 있게 했다.
이렇게 라이브러리를 만들어 두면, 회사 내 다른 프로젝트에서도 이메일 발송 기능이 필요할 때마다 밑바닥부터 구현할 필요 없이 가져다 쓸 수 있어 개발 생산성을 크게 높일 수 있다.