Spring

Spring - AWS SES를 활용한 이메일 알림 기능 구현

윤승 2025. 6. 27. 20:53

이번에는 AWS SES(Amazon Simple Email Service)를 활용해, 회원가입 시 이메일 알림 기능을 적용해봤다.
사용자가 회원가입을 완료하면, 등록한 이메일 주소로 성공 안내 메일이 자동으로 발송된다.

이메일 본문에는 회원가입 성공 메시지와 함께 간단한 안내 사항 및 환영 인사를 함께 담아봤다.
현재는 회원가입 완료 시에만 이 기능을 적용했지만, 앞으로는 예약 완료, 비밀번호 변경 등 다양한 사용자 활동에도 이메일 알림을 확장해볼 계획이다.

 

왜 AWS SES를 선택했을까?

 

최종프로젝트를 하면서 초기 개발 단계에서는 카카오톡 알림톡 기능을 적용하기로했다.

카카오 알림톡은 빠르고 직관적인 메시지 전달에 강점이 있지만, 비즈니스 인증 절차가 까다롭고 비용 부담도 있었기에 다른 알림 메세지 기능들을 찾아봤다.

 

반면 AWS SES(Amazon Simple Email Service)는 구현이 간단하면서도 대량 이메일 발송에 최적화되어 있어, 테스트 환경과 실제 운영 환경 모두에서 유연하게 활용할 수 있다는 장점이 있었다.

그리고 초기 도입 비용 없이 바로 적용 가능하다는 점도 선택 이유 중 하나였다.

 

카카오 알림톡 vs AWS SES

항목
카카오 알림톡
AWS SES
인증 절차
기업 인증 필수, 발신번호 등록 필요
이메일 인증만으로 사용 가능
테스트 환경
테스트 불가 (실발송 전제)
로컬/개발서버에서 테스트 가능
비용
건당 과금
무료 티어
메시지 신뢰도
모바일 중심
이메일 기반, 수신 확인 API 제공
개발 속도
초기 진입장벽 높음
바로 적용 가능

 

AWS SES 사용 하기

 

먼저 SES를 사용하려면 도메인을 등록하거나 본인 이메일계정을 등록하여 인증을 받아야한다.

본인이 도메인이 있다면 등록해서 인증받아서 사용하면 된다.

밑에 이미지 처럼 인증받을 이메일 주소를 등록하고 생성하면 된다.

 

현재 나는 도메인 인증은 아직 진행하지 않았고,
사용자에게 메일을 보내는 발신자 주소만 이메일 방식으로 인증해둔 상태다.

 

이메일 주소 등록이 완료되면, 등록한 이메일로 아래 이미지와 같은 인증 메일이 발송된다.
해당 메일에 포함된 확인 링크를 클릭하면 이메일 인증이 완료된다.

 

 

아직은 테스트 단계이기 때문에 AWS SES는 샌드박스(Sandbox) 환경으로 설정된 상태이며,
발신자 이메일과 수신자 이메일을 사전에 인증한 뒤 프로젝트에 적용하여 이메일 전송 기능을 테스트하고 있다.


샌드박스 상태에서는 다음과 같은 제한이 존재한다:

  • 인증된 이메일 주소로만 발신 및 수신 가능
  • 하루 발송량 및 속도에 제한 존재
  • 도메인 인증 및 프로덕션 전환 전까지는 테스트 목적의 이메일 발송만 가능

이제 AWS SES 설정을 마쳤다면, Spring 프로젝트로 이동해 실제로 SES를 적용하여 사용자에게 이메일 알림을 보내는 기능을 구현해보자.

 

 

간단하게 회원가입 시 AWS SES를 이용해 환영 이메일을 발송하는 기능을 추가했다.
이를 위해 SES 설정, 클라이언트 등록, 서비스 구현까지 순차적으로 반영되도록 작성하였다.

 

Sequence Diagram

1. AWS SDK 빌드하기

   	// AWS SES
    implementation 'org.springframework.boot:spring-boot-starter-mail'
    implementation 'com.amazonaws:aws-java-sdk-ses:1.12.3'

 

먼저 build.gradle에서 빌드를 진행한다.

빌드를 진행했다면, 환경변수를 등록해주자

 

2. 환경 변수에 등록  📁application.properties

application.properties파일에서 환경변수 설정을 해준다.

 

3. AWS Access Key / Secret Key 발급 과정

IAM 사용자 생성

  • 좌측 메뉴에서 사용자(Users) 클릭 → 사용자 추가 버튼 클릭
  • 사용자 이름: 예) ses-user
  • 액세스 유형 선택:
    • 프로그래밍 방식 액세스 체크 (필수)
      • 이 옵션을 통해 Access Key와 Secret Access Key가 생성된다.

 

4. 코드 구성

 

환경변수 설정이 완료되었다면, 이제 로직들을 추가하면된다.

SES 설정 클래스

LocalSesConfig.java

역할: AWS SES 클라이언트를 Bean으로 등록하는 설정 클래스

 
@Configuration
public class LocalSesConfig {
    @Value("${aws.ses.access-key}")
    private String accessKey;

    @Value("${aws.ses.secret-key}")
    private String secretKey;

    @Value("${aws.region}")
    private String region;

    @Bean
    public AmazonSimpleEmailService amazonSimpleEmailService() {
        BasicAWSCredentials creds = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonSimpleEmailServiceClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(creds))
                .withRegion(Regions.fromName(region))
                .build();
    }
}

 

  • @Configuration: 스프링 설정 클래스임을 명시.
  • @Value: application.properties 또는 환경 변수로부터 값을 주입받음.
  • AmazonSimpleEmailService: SES API 호출을 위한 클라이언트 객체 생성.
  • Bean 등록을 통해 다른 클래스에서 @Autowired 또는 생성자 주입으로 사용 가능.

 


✅ 이메일 발송 서비스

AwsSesMailService.java

역할: 실제로 이메일을 구성하고 SES를 통해 메일을 발송하는 서비스

@Service
@RequiredArgsConstructor
public class AwsSesMailService {
    private final AmazonSimpleEmailService sesClient;

    @Value("${aws.ses.from-email}")
    private String from;

    public void sendWelcomeEmail(String to) {
        SendEmailRequest request = new SendEmailRequest()
            .withDestination(new Destination().withToAddresses(to))
            .withMessage(new Message()
                .withSubject(new Content("회원가입을 축하합니다!").withCharset("UTF-8"))
                .withBody(new Body()
                    .withHtml(new Content("<h1>회원가입 완료 🎉</h1>").withCharset("UTF-8"))))
            .withSource(from);

        sesClient.sendEmail(request);
    }
}

 

  • AmazonSimpleEmailService 클라이언트를 사용해 메일 전송 API 호출
  • 제목, 본문 등 메시지를 HTML로 구성
  • from 주소는 SES에서 인증된 이메일이어야 전송 가능
  • HTML 기반 템플릿으로 추후 커스터마이징도 가능

 

 

 


✅ AuthService에 서비스 주입 및 호출

역할: 회원가입 비즈니스 로직을 처리하고, 가입 완료 후 환영 이메일을 전송

@Service
@RequiredArgsConstructor
public class AuthService {
    private final AwsSesMailService awsSesMailService;

    public AuthResponseDto signup(AuthRequestDto dto) {
        // 유저 저장 생략...
        awsSesMailService.sendWelcomeEmail(dto.getEmail());
        return AuthResponseDto.of(savedUser);
    }
}

 

  • 기존 회원가입 로직은 그대로 유지
  • 회원 저장 후 AwsSesMailService를 호출해 이메일 발송
  • 메일 관련 로직을 분리했기 때문에 SRP(단일 책임 원칙)에 충실

 

 

설정이 완료된 후 Postman을 통해 회원가입 요청을 전송해보자.

이렇게 사용자가 입력한 이메일 주소로 환영 메시지가 성공적으로 도착하는 것을 확인할 수 있다. 

 


이메일 알림 기능은 향후 다른 사용자 관련 서비스 로직에도 확장 적용해볼 예정이며, AWS SES 샌드박스 해제를 통해 인증된 발신자 외의 실제 사용자에게도 이메일을 전송할 수 있도록 추후 프로덕션 환경으로 전환할 계획이다.