From 230a80e176cc2f22d2ef20851e35ef2675932eb1 Mon Sep 17 00:00:00 2001 From: truman-show Date: Sat, 12 Jun 2021 20:03:26 +0900 Subject: [PATCH 1/5] =?UTF-8?q?aws-java-sdk=20=EC=9D=98=EC=A1=B4=EC=84=B1?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adapters/notification/adapter-aws-sns/build.gradle | 2 +- build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/adapters/notification/adapter-aws-sns/build.gradle b/adapters/notification/adapter-aws-sns/build.gradle index c5be06e..d1475cf 100644 --- a/adapters/notification/adapter-aws-sns/build.gradle +++ b/adapters/notification/adapter-aws-sns/build.gradle @@ -4,5 +4,5 @@ jar.enabled = true dependencies { implementation project(':common') implementation project(':test-support') - implementation 'software.amazon.awssdk:sns' + implementation 'com.amazonaws:aws-java-sdk-sns' } diff --git a/build.gradle b/build.gradle index 81a0d89..71ae701 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ subprojects { springBootVersion = "2.3.4.RELEASE" mockitoVersion = "3.4.0" lombokVersion = "1.18.12" - awsSdkVersion = "2.16.82" + awsSdkVersion = "1.12.5" } dependencies { @@ -57,7 +57,7 @@ subprojects { // 하위 모듈 내에서 이러한 종속성 중 하나가 필요한 경우 버전 번호가 dependencyManagement 클로저에서 로드되므로 버전 번호를 제공하지 않고 하위 모듈에서 지정할 수 있습니다. // 이를 통해 Maven의 pom.xml 파일에있는 요소와 매우 유사하게 여러 모듈에 배포하는 대신 단일 위치에서 버전 번호를 지정할 수 있습니다. mavenBom"org.springframework.boot:spring-boot-dependencies:${springBootVersion}" - mavenBom"software.amazon.awssdk:bom:${awsSdkVersion}" + mavenBom"com.amazonaws:aws-java-sdk-bom:${awsSdkVersion}" } } From ae1c268e2b44a41e3c599a58a11d34fba46b6cf1 Mon Sep 17 00:00:00 2001 From: truman-show Date: Sat, 12 Jun 2021 20:04:34 +0900 Subject: [PATCH 2/5] =?UTF-8?q?AWS=20properties=20=EB=B9=88=EC=9D=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/caregiver/config/AwsProperties.java | 26 +++++++++++++++++ .../src/main/resources/application.yml | 5 +--- .../caregiver/config/AwsPropertiesTest.java | 29 +++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsProperties.java create mode 100644 adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/config/AwsPropertiesTest.java diff --git a/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsProperties.java b/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsProperties.java new file mode 100644 index 0000000..251e0fa --- /dev/null +++ b/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsProperties.java @@ -0,0 +1,26 @@ +package com.caregiver.config; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * SNS 서비스를 사용하기위한 properties 클래스입니다. + */ +@Getter +@Component +public class AwsProperties { + + @Value("${caregiver.aws.access-key:default-aws-access-key}") + private String accessKey; + + @Value("${caregiver.aws.secret-key:default-aws-secret-key}") + private String secretKey; + + @Value("${caregiver.aws.signing-region}") + private String signingRegion; + + @Value("${caregiver.aws.sns.arn}") + private String arn; + +} diff --git a/adapters/notification/adapter-aws-sns/src/main/resources/application.yml b/adapters/notification/adapter-aws-sns/src/main/resources/application.yml index a10c9aa..84b1220 100644 --- a/adapters/notification/adapter-aws-sns/src/main/resources/application.yml +++ b/adapters/notification/adapter-aws-sns/src/main/resources/application.yml @@ -4,11 +4,8 @@ spring: caregiver: aws: - #service-endpoint: - signing-region: ap-northeast-2 + signing-region: ap-northeast-1 access-key: ${caregiver.aws.secret-key} secret-key: ${caregiver.aws.access-key} sns: arn: ${caregiver.aws.sns.arn} - - diff --git a/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/config/AwsPropertiesTest.java b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/config/AwsPropertiesTest.java new file mode 100644 index 0000000..fe434ae --- /dev/null +++ b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/config/AwsPropertiesTest.java @@ -0,0 +1,29 @@ +package com.caregiver.config; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.amazonaws.regions.Regions; +import com.caregiver.common.BaseConfiguration; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@SuppressWarnings("NonAsciiCharacters") +class AwsPropertiesTest extends BaseConfiguration { + + @Autowired + AwsProperties awsProperties; + + @Test + @DisplayName("Aws 설정정보를 확인하라") + public void Aws_설정정보를_확인하라() { + + assertThat(awsProperties.getSigningRegion()).isEqualTo(Regions.AP_NORTHEAST_1.getName()); + assertThat(awsProperties.getArn()).isNotBlank(); + assertThat(awsProperties.getAccessKey()).isNotBlank(); + assertThat(awsProperties.getSecretKey()).isNotBlank(); + + } + + +} From 0bdd3315b6c4e6018518696d3fc89964ad9cce4b Mon Sep 17 00:00:00 2001 From: truman-show Date: Sat, 12 Jun 2021 20:04:55 +0900 Subject: [PATCH 3/5] =?UTF-8?q?SNS=20Application=20Junit=20Test=EB=A5=BC?= =?UTF-8?q?=20=EC=8B=A4=ED=96=89=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/caregiver/AdapterSnsApplicationTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/AdapterSnsApplicationTest.java diff --git a/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/AdapterSnsApplicationTest.java b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/AdapterSnsApplicationTest.java new file mode 100644 index 0000000..2a5472b --- /dev/null +++ b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/AdapterSnsApplicationTest.java @@ -0,0 +1,10 @@ +package com.caregiver; + +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * SNS Application Junit Test를 실행하기 위한 클래스. + */ +@SpringBootApplication +public class AdapterSnsApplicationTest { +} From 82f61574a1e8d6b6cc3b7734926e50eef95aa06b Mon Sep 17 00:00:00 2001 From: truman-show Date: Sat, 12 Jun 2021 20:05:25 +0900 Subject: [PATCH 4/5] =?UTF-8?q?AWS=20SNS=20=EC=9D=98=20SMS=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EC=9E=90=EA=B2=A9=EC=A6=9D?= =?UTF-8?q?=EB=AA=85=20=EC=84=A4=EC=A0=95=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/AwsDefaultCredential.java | 55 +++++++++++++++++++ .../caregiver/config/AwsSnsClientFactory.java | 21 +++++++ .../caregiver/common/BaseConfiguration.java | 20 +++++++ 3 files changed, 96 insertions(+) create mode 100644 adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsDefaultCredential.java create mode 100644 adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsSnsClientFactory.java create mode 100644 adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/common/BaseConfiguration.java diff --git a/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsDefaultCredential.java b/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsDefaultCredential.java new file mode 100644 index 0000000..2cd0320 --- /dev/null +++ b/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsDefaultCredential.java @@ -0,0 +1,55 @@ +package com.caregiver.config; + + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.sns.AmazonSNS; +import com.amazonaws.services.sns.AmazonSNSClientBuilder; +import com.amazonaws.services.sns.model.MessageAttributeValue; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * AmazonSNS 객체를 생성합니다. + * 기본 자격 증명을 사용 합니다. + */ +@Configuration +@RequiredArgsConstructor +@SuppressWarnings("SpringFacetCodeInspection") +public class AwsDefaultCredential implements AwsSnsClientFactory { + + private final AwsProperties awsProperties; + + @Bean + @Override + public AmazonSNS createSnsClient() { + BasicAWSCredentials credentialsMaster = new BasicAWSCredentials( + awsProperties.getAccessKey(), awsProperties.getSecretKey()); + + AmazonSNSClientBuilder amazonSnsClientBuilder = AmazonSNSClientBuilder + .standard() + .withCredentials(new AWSStaticCredentialsProvider(credentialsMaster)); + amazonSnsClientBuilder.setRegion(awsProperties.getSigningRegion()); + + return amazonSnsClientBuilder.build(); + } + + /** + * 메세지 전송 속성 값 을 가진 빈을 리턴합니다. + * + */ + @Bean + public Map messageAttributeValue() { + return Map.of( + "AWS.SNS.SMS.SenderID", + new MessageAttributeValue().withStringValue("mySenderId").withDataType("String"), + "AWS.SNS.SMS.MaxPrice", + new MessageAttributeValue().withStringValue("0.50").withDataType("String"), + "AWS.SNS.SMS.SMSType", + new MessageAttributeValue().withStringValue("Promotional").withDataType("String")); + } + +} diff --git a/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsSnsClientFactory.java b/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsSnsClientFactory.java new file mode 100644 index 0000000..2facfa7 --- /dev/null +++ b/adapters/notification/adapter-aws-sns/src/main/java/com/caregiver/config/AwsSnsClientFactory.java @@ -0,0 +1,21 @@ +package com.caregiver.config; + + +import com.amazonaws.services.sns.AmazonSNS; + +/** + *

AWS SNS 를 사용하기 위한 객체를 생성합니다.

+ * Spring profile 구분 별로 다른 자격 증명 방식을 사용하고 있습니다. + * 기본 자격 증명 방식 과 IAM ROLE 자격증명 방식을 사용합니다. + * + * @see + * Setting Credentials + */ +public interface AwsSnsClientFactory { + + /** + * SNS 서비스 클라이언트 AmazonSNS 리턴합니다. + */ + AmazonSNS createSnsClient(); + +} diff --git a/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/common/BaseConfiguration.java b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/common/BaseConfiguration.java new file mode 100644 index 0000000..560aa24 --- /dev/null +++ b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/common/BaseConfiguration.java @@ -0,0 +1,20 @@ +package com.caregiver.common; + +import com.caregiver.config.AwsDefaultCredential; +import com.caregiver.config.AwsProperties; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +/** + * 테스트를 클래스에서 공통으로 필요로하는 정보를 관리하는 클래스. + */ +@ActiveProfiles("test") +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = {AwsProperties.class, AwsDefaultCredential.class}, + initializers = ConfigFileApplicationContextInitializer.class) +public class BaseConfiguration { + +} From 8981aca24d1cee33bb096b37791be4c1f208be91 Mon Sep 17 00:00:00 2001 From: truman-show Date: Sat, 12 Jun 2021 21:31:03 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EB=AC=B8=EC=9E=90=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20=EB=B0=9C=EC=86=A1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/caregiver/sms/SendSmsMessageTest.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/sms/SendSmsMessageTest.java diff --git a/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/sms/SendSmsMessageTest.java b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/sms/SendSmsMessageTest.java new file mode 100644 index 0000000..15612a3 --- /dev/null +++ b/adapters/notification/adapter-aws-sns/src/test/java/com/caregiver/sms/SendSmsMessageTest.java @@ -0,0 +1,53 @@ +package com.caregiver.sms; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.amazonaws.services.sns.AmazonSNS; +import com.amazonaws.services.sns.model.MessageAttributeValue; +import com.amazonaws.services.sns.model.PublishRequest; +import com.amazonaws.services.sns.model.PublishResult; +import com.caregiver.common.BaseConfiguration; +import com.caregiver.config.AwsDefaultCredential; +import java.util.Map; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 문자메세지 발송 테스트. + */ +@SuppressWarnings({"NonAsciiCharacters", "CheckStyle"}) +public class SendSmsMessageTest extends BaseConfiguration { + + @Autowired + AwsDefaultCredential awsDefaultCredential; + + /** + * 테스트가 실행될 경우 SMS 문자 메세지를 발송합니다. + * 과금이 발생 요소가 있기에 Disabled 처리합니다. + * TODO 테스트 코드 목킹 그리고 리팩토링 + */ + @Test + @Disabled + @DisplayName("aws Sms 메일 발송을 테스트하라") + public void aws_sms_메일_발송을_테스트하라() { + + final var amazonSns = awsDefaultCredential.createSnsClient(); + + final var publishResult = sendSmsMessage(amazonSns, "안녕하세요 이지훈입니다. 문자메세지 테스트", + "+8201093793259", awsDefaultCredential.messageAttributeValue()); + + assertThat(publishResult.getMessageId()).isNotBlank(); + } + + private PublishResult sendSmsMessage(AmazonSNS amazonSns, String message, String phoneNumber, + Map smsAttributes) { + + return amazonSns.publish(new PublishRequest().withMessage(message) + .withPhoneNumber(phoneNumber) + .withMessageAttributes(smsAttributes)); + + } + +}