~☆~ 우하하!!~ 개발블로그

[SpringBoot] AWS SES 를 이용하여 메일 발송 테스트 본문

SpringBoot

[SpringBoot] AWS SES 를 이용하여 메일 발송 테스트

iwoohaha 2024. 11. 1. 09:23
728x90
반응형

https://iwoohaha.tistory.com/308 에서 이어진다.

 

build.gradle 파일에 AWS SDK 종속성을 추가한다.

implementation 'com.amazonaws:aws-java-sdk-ses:1.12.3'

 

build.gradle 파일을 수정하면 코끼리 모양의 아이콘이 생성되는데, gradle sync 기능이다. 이 버튼을 눌러주면 추가한 종속성에 관련된 파일을 자동으로 다운로드한다.

 

 

application.properties 에 AWS SES 접속용 자격 증명을 구성한다.

# AWS SES 자격증명
aws.ses.access-key=YOUR_ACCESS_KEY_ID
aws.ses.secret-key=YOUR_SECRET_ACCESS_KEY
aws.ses.region=YOUR_AWS_REGION

 

위 코드에서 YOUR_ACCESS_KEY_ID, YOUR_SECRET_ACCESS_KEY, YOUR_AWS_REGION 은 실제 값으로 대체해야 한다.

 

만약 application.yml 파일이라면

aws:
  ses:
    access-key: YOUR_ACCESS_KEY_ID
    secret-key: YOUR_SECRET_ACCESS_KEY
    region: YOUR_AWS_REGION

 

와 같은 형태로 입력해야 한다.

YOUR_ACCESS_KEY_ID 와 YOUR_SECRET_ACCESS_KEY 값은 아래의 과정으로 생성할 수 있다.

 

AWS의 IAM 콘솔 화면으로 이동하여 사용자 페이지로 진입한다.

 

오른쪽 위의 "사용자 생성" 버튼을 클릭한다.

 

적절한 사용자명을 입력한 후 "다음" 버튼을 클릭한다.

 

적절한 권한 그룹을 생성하여 해당 사용자 그룹의 구성원으로 추가해도 되고, 그룹에 포함시키지 않고 직접 정책에 연결시켜도 된다.

여기에서는 SESMailService 라는 이름의 권한 그룹을 생성하여 그 그룹에 포함시키는 과정을 설명한다.

가운데 섹션의 오른쪽 "그룹 생성" 버튼을 클릭한다.

 

권한 정책 목록의 검색어로 SES 를 입력하면 AmazonSESFullAccess 라는 정책이 검색결과에 포함되어 표시된다.

이 항목을 체크한 후에 아래쪽 "사용자 그룹 생성" 버튼을 클릭한다.

 

이제 사용자 그룹 목록에는 SESMailService 라는 이름의 그룹이 표시된다.

이 사용자 그룹을 체크한 후 아래쪽의 "다음" 버튼을 클릭한다.

 

지금까지 수행한 내용에 대한 검토를 마치고 "사용자 생성" 버튼을 클릭하여 최종적으로 사용자를 생성한다.

 

방금 생성한 SESMailService 라는 이름의 사용자가 사용자 목록에 표시되는 것을 확인할 수가 있다. (사용자 그룹과 사용자 이름을 동일하게 설정했다는 것을 기억해두기 바란다)

이 사용자를 클릭한다.

 

오른쪽 위의 액세스 키 만들기 링크를 클릭해서 해당 사용자 계정에 대한 접속 키를 생성해야 한다.

 

액세스 키 사용 사례로 많은 유형이 제시된다.

일단, 로컬 개발 환경에서 SES 서비스를 사용하여 이메일 발송을 테스트하는 과정이므로 두 번째 항목 로컬 코드를 선택한다.

 

적절한 설명 태그를 입력하고 "액세스 키 만들기" 버튼을 클릭한다.

 

생성된 비밀 액세스 키 값은 이 화면을 떠나는 순간 다시는 볼 수가 없으므로 잘 저장해 두어야 한다.

사용자 화면으로 돌아오면 액세스 키 값은 화면에 표시가 된다.

 

가장 먼저 AWS SES 서비스에 접속하기 위한 환경 구성 클래스를 작성한다.

 

위 이미지와 같이 com.woohahaapps.example 패키지 아래에 config.aws 패키지를 만들고 그 아래에 AwsSesConfig 라는 이름의 클래스 파일을 생성한다.

AwsSesConfig 클래스 소스는 다음과 같다.

package com.woohahaapps.example.config.aws;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AwsSesConfig {

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

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

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

    @Bean
    public AmazonSimpleEmailService amazonSimpleEmailService() {
        final BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);
        final AWSStaticCredentialsProvider awsStaticCredentialsProvider = new AWSStaticCredentialsProvider(
                basicAWSCredentials);

        return AmazonSimpleEmailServiceClientBuilder.standard()
                .withCredentials(awsStaticCredentialsProvider)
                .withRegion(region)
                .build();
    }

}

 

이번에는 AWS SES 를 이용하여 이메일을 발송하는 서비스 클래스를 작성해본다.

클래스 이름은 AwsMailService 이고, com.woohahaapps.example 패키지 아래에 service 패키지를 만들고 그 아래에 생성한다.

 

클래스의 private 멤버 변수로 AmazonSimpleEmailService 형 amazonSimpleEmailService 를 선언한다.

package com.woohahaapps.example.service;

import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;

public class AwsMailService {
    private final AmazonSimpleEmailService amazonSimpleEmailService;
}

 

 

위 이미지에서 보는 바와 같이 빨간색 밑줄이 그어질텐데, 클래스에 @RequiredArgsConstructor 어노테이션을 선언해주면 해결된다.

 

추가로 @Service 어노테이션을 붙여주자.

package com.woohahaapps.example.service;

import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AwsMailService {
    private final AmazonSimpleEmailService amazonSimpleEmailService;
}

 

AwsMailService 클래스에 메일 발송 함수 send 를 작성해본다.

메일 발송에 필요한 데이터로는

  • 메일 제목
  • 메일 본문
  • 메일 수신자
  • 메일 발송자

가 있다. 이 값들을 함수의 파라미터로 받아서 메일을 발송하는 로직으로 작성해본다.

package com.woohahaapps.example.service;

import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.model.SendEmailRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AwsMailService {
    private final AmazonSimpleEmailService amazonSimpleEmailService;

    public void send(String subject, String body, String receiver, String sender) {
        SendEmailRequest sendEmailRequest = new SendEmailRequest();
        amazonSimpleEmailService.sendEmail(sendEmailRequest);
    }
}

 

AmazonSimpleEmailService 의 sendMail 함수는 SendEmailRequest 형의 데이터를 필요로 한다.

SendEmailRequest 는 3개의 필수 멤버를 채워서 만들 수 있다.

  • String source
  • Destination destination
  • Message message

source 는 발신자 이메일 주소이다.

destination 은 메일 수신 이메일 주소이다. 여러 개의 주소를 , 문자로 연결시킬 수 있다.

message 는 메일의 제목과 본문 내용으로 구성한다.

아래와 같은 방법으로 SendEmailRequest 형 변수를 생성해주면 된다.

package com.woohahaapps.example.service;

import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.model.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AwsMailService {
    private final AmazonSimpleEmailService amazonSimpleEmailService;

    public void send(String subject, String body, String receiver, String sender) {
        Destination destination = new Destination().withToAddresses(receiver);
        Message message = new Message()
                .withSubject(new Content().withCharset("UTF-8").withData(subject))
                .withBody(new Body().withHtml(new Content().withCharset("UTF-8").withData(body)));
        SendEmailRequest sendEmailRequest = new SendEmailRequest()
                .withSource(sender)
                .withDestination(destination)
                .withMessage(message)
                ;
        amazonSimpleEmailService.sendEmail(sendEmailRequest);
    }
}

 

이 메소드를 테스트해보자.

AwsMailService 가 선택된 상태에서 마우스 오른쪽 버튼을 누르고 Generate 메뉴를 선택한다.

 

이어서 표시되는 메뉴들 중에서 Test 항목을 선택한다.

테스트를 작성할 멤버함수 앞에 체크표시를 한 상태에서 "OK" 버튼을 클릭하면 테스트 클래스가 작성된다.

package com.woohahaapps.example.service;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class AwsMailServiceTest {

    @Test
    void send() {
    }
}

 

AwsMailServiceTest 클래스에 @SpringBootTest 어노테이션을 붙여준다.

그리고 AwsMailService 클래스를 테스트하기 위한 클래스이므로 AwsMailService 클래스형 변수를 선언한다.

package com.woohahaapps.example.service;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class AwsMailServiceTest {

    @Autowired
    private AwsMailService awsMailService;

    @Test
    void send() {
    }
}

 

이제 테스트 함수인 send 에 AwsMailService 클래스의 메소드 send 를 호출하는 테스트 코드를 작성한다.

package com.woohahaapps.example.service;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class AwsMailServiceTest {

    @Autowired
    private AwsMailService awsMailService;

    @Test
    void send() {
        awsMailService.send("제목입니다.", "본문입니다.", "woohaha.apps@gmail.com", "woohaha@woohahaapps.com");
    }
}

 

테스트 클래스를 마우스 오른쪽 버튼으로 선택하여 Run 'AwsMailServiceTest' 메뉴항목을 선택하면 테스트가 실행된다.

 

지정된 수신 메일 주소로 메일이 수신된 것을 확인하거나 테스트 결과를 확인하여 에러없이 발송된 것을 확인하면 된다.

 

 

반응형