인프라

AWS SNS과 FCM 그리고 Spring Boot를 곁들인..

dev.Dove 2024. 5. 8. 23:45

시작하기 앞서

본 글은 2024년 4월 말~ 5월 1주 차에 작성했습니다.

Spring boot 2, Java 17과 AWS SDK v2를 사용했습니다.


언제 이런 기능이 생긴거지..?

..??????

 

회사에서 AWS SNS를 이용해 Slack메시지 전송을 구현하려다 우연히 모바일 푸시를 발견했다.

새 기능 알럿을 보니, FCM 사용이 가능하다는데, 기존 FCM만 사용하는 것과 차이가 궁금하다.

퇴근하고 조금씩 조사한 내용을 정리해 보자

 

AWS SNS 모바일 푸시

 

모바일 푸시 알림 - Amazon Simple Notification Service

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

공식 문서를 보니, 푸시 메시지 플랫폼을 AWS SNS로 연결해서 AWS 인프라로 Push 알림을 전송할 수 있는 것 같다.

구현해보자

 

0. Firebase에서 FCM을 전송할 프로젝트를 먼저 구성해야 한다.

프로젝트 생성 후 설정, "서비스 계정"에서 "새 비공개 키 생성"을 통해 json키를 먼저 받는다.

 

 

1. AWS SNS에서 "푸시 알림"을 선택하고 "플랫폼 어플리 케이션 생성"을 선택한다.

 

 

2. 푸시 알림 플랫폼을 "FCM"으로 선택하고 자격증명은 "토큰"으로 한 뒤 Firebase에서 미리 받은 json키를 업로드한다.

 

3. Spring Boot에서 사용하기 위해 AWS SDK v2를 gradle에 추가한다.

    implementation "software.amazon.awssdk:lambda:2.20.122"

 

4. FCM에서 발급받은 토큰을 AWS SNS에 엔드포인트로 만들고 전송한다.

CreatePlatformEndpointResponse platformEndpoint = snsClient.createPlatformEndpoint(CreatePlatformEndpointRequest.builder()
            .platformApplicationArn("{aws sns 콘솔에서 확인 가능한 arn 값}")
            .token(token)
            .build());


Notification notification = new Notification("제목", "내용");
PublishResponse publishResponse = snsClient.publish(
	PublishRequest.builder()
        .targetArn(platformEndpoint.endpointArn())
        .message(notification.toJson())
        .build()
);

 

AWS SNS를 사용할 이유가 있는가..?

결국 FCM를 AWS SNS로 감싸서 사용하는 형태니, 다음과 같은 특징을 가지고 있다.

 

1. AWS 인프라와 연계성이 좋다. (장점)

>> spring boot가 아닌 AWS Lambda로 서버리스 환경을 구성하면, 고가용성에 대한 고민이 사라진다.

>> Cloud Watch 연동이 가능하다.

 

2. AWS 내 인프라 사용에 제약을 인지하고 사용해야 한다.

>> push를 topic기반으로 전송할 경우 AWS는 구독자의 수를 제한하고 FCM은 최대 구독수를 제한다.

>> 이건 프로젝트의 성격에 따라 FCM도 AWS 도 둘 다 좋은 선택지가 될 수 있다.

https://docs.aws.amazon.com/ko_kr/general/latest/gr/sns.html
https://firebase.google.com/docs/cloud-messaging/android/topic-messaging?hl=ko

 

3. 비용

>> FCM은 무료다. AWS SNS는 백만건당. $0.5를 청구한다.(한국 리전 기준)

https://aws.amazon.com/ko/sns/pricing/

 

 

정리

AWS SNS는 기존 AWS 인프라를 사용하길 원하며, 다양한 주제(몇 만개)를 만들어서 앱을 일괄로 묶어서 푸시 전송할 경우에는 사용할 가치가 있어 보인다. 다만, 프로젝트의 규모가 작으면(구독할 주제가 적을 경우) 굳이 부가적은 AWS SNS 비용을 지불하며 사용할 필요는 없어 보인다.

 

 

참고한 사이트

 

SDK for Java 2.x를 사용하는 Amazon SNS 예제 - AWS SDK for Java 2.x

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

SubscribeRequest (AWS SDK for Java - 2.25.47)

Sets whether the response from the Subscribe request includes the subscription ARN, even if the subscription is not yet confirmed. If you set this parameter to true, the response includes the ARN in all cases, even if the subscription is not yet confirmed.

sdk.amazonaws.com