PWA μ•±μ—μ„œ ν‘Έμ‹œ μ•Œλ¦Όμ„ μœ„ν•΄ FCM(Firebse Cloud Messaging)을 λ„μž…ν–ˆλ‹€λ©΄ Amazon SNS의 λͺ¨λ°”일 ν‘Έμ‹œ μ•Œλ¦ΌμœΌλ‘œ 톡합할 수 μžˆλ‹€. Firebase Admin SDK λ‘œλ„ μ‰½κ²Œ ν‘Έμ‹œ μ•Œλ¦Όμ„ μœ„ν•œ λ©”μ‹œμ§€λ₯Ό 전솑할 수 μžˆμ§€λ§Œ Amazon SNS에 λ“±λ‘λœ ν”Œλž«νΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 톡해 μ‚¬μš©μž λ””λ°”μ΄μŠ€λ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•€λ“œν¬μΈνŠΈλ‘œ κ΄€λ¦¬ν•˜κ³  μš°λ¦¬λŠ” Amazon SNS에 λ“±λ‘λœ ν”Œλž«νΌ μ—”λ“œν¬μΈνŠΈλ₯Ό 톡해 λ””λ°”μ΄μŠ€λ‘œ ν‘Έμ‹œ μ•Œλ¦Όμ„ 전달해보도둝 ν•˜μž.

ν”Œλž«νΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 생성 μ‹œ FCM 자격 증λͺ… 등둝

FCM ν‘Έμ‹œ μ•Œλ¦Ό ν”Œλž«ν””μ„ μ‚¬μš©ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 생성 μ‹œ FCM μ½˜μ†”μ˜ μ„œλΉ„μŠ€ κ³„μ •μ—μ„œ λ°œκΈ‰λ°›μ€ Firebase μ„œλΉ„μŠ€ κ³„μ •μ˜ λΉ„κ³΅κ°œ ν‚€ 정보λ₯Ό 등둝해야 ν•œλ‹€. Firebase Admin SDK μ—μ„œ μ‚¬μš©μ€‘μ΄μ—ˆλ˜ μ„œλΉ„μŠ€ κ³„μ •μ˜ JSON νŒŒμΌμ„ κ·ΈλŒ€λ‘œ μ„€μ •ν–ˆλ‹€.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•€λ“œν¬μΈνŠΈ 생성 μ‹œ FCM λ””λ°”μ΄μŠ€ 토큰 등둝

ν”Œλž«νΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ©”μ‹œμ§€λ₯Ό 전달할 μ—”λ“œν¬μΈνŠΈλŠ” ν•˜λ‚˜μ˜ 식별할 수 μžˆλŠ” λ””λ°”μ΄μŠ€λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€. λ””λ°”μ΄μŠ€ 토큰은 FCM ν΄λΌμ΄μ–ΈνŠΈ SDKλ‘œλΆ€ν„° λ””λ°”μ΄μŠ€ λ‚΄μ—μ„œ λ°œκΈ‰λ°›μ€ 토큰을 μž…λ ₯ν•˜λ©΄ λœλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ—”λ“œν¬μΈνŠΈ 생성 ν›„ λ©”μ‹œμ§€ κ²Œμ‹œλ₯Ό 톡해 μƒ˜ν”Œ λ©”μ‹œμ§€λ₯Ό 전달해볼 수 μžˆλ‹€.

{
  "GCM": "{ \"data\": { \"title\": \"Hi!\", \"body\": \"Mambo?!\" } }"
}

Amazon SNS의 λͺ¨λ°”일 ν‘Έμ‹œ μ•Œλ¦Όμ—μ„œ FCM을 μœ„ν•œ λ©”μ‹œμ§€λŠ” GCM μ΄λΌλŠ” ν‚€λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

Amazon SNS SDK for Java V2둜 λ©”μ‹œμ§€ κ²Œμ‹œ

μ›Ή μ½˜μ†”μ„ 톡해 FCM λ©”μ‹œμ§€κ°€ λ””λ°”μ΄μŠ€λ‘œ ν‘Έμ‹œ μ•Œλ¦Όμ΄ λ˜μ—ˆμŒμ„ ν™•μΈν–ˆλ‹€λ©΄ Amazon SDK for Java v2λ₯Ό μ‚¬μš©ν•΄μ„œ ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ λ©”μ‹œμ§€λ₯Ό 전솑해보도둝 ν•˜μž. λ¨Όμ €, μ•„λž˜μ™€ 같이 λͺ¨λ°”일 ν‘Έμ‹œ APIλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ Amazon SDK for Java v2 μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•˜λ„λ‘ ν•˜μž.

dependencies {
    implementation platform('software.amazon.awssdk:bom:2.26.16')
    implementation 'software.amazon.awssdk:sns'
}

μ˜μ‘΄μ„±μ„ μΆ”κ°€ν–ˆλ‹€λ©΄ λͺ¨λ°”일 ν‘Έμ‹œ API 쀑 CreatePlatformEndpoint와 Publishλ₯Ό μ‚¬μš©ν•΄μ„œ λ©”μ‹œμ§€λ₯Ό κ²Œμ‹œν•˜λŠ” μƒ˜ν”Œ μ½”λ“œλ₯Ό λ§Œλ“€μ–΄λ³Ό 수 μžˆλ‹€.

@Test
void send() {
    try (SnsClient snsClient = SnsClient.builder()
            .credentialsProvider(ProfileCredentialsProvider.create())
            .region(Region.AP_NORTHEAST_2)
            .build()) {

        Assertions.assertDoesNotThrow(() -> {
            String platformApplicationArn = "";
            String fcmDeviceToken = "";
            String endpointArn = snsClient.createPlatformEndpoint(CreatePlatformEndpointRequest.builder()
                    .platformApplicationArn(platformApplicationArn)
                    .token(fcmDeviceToken)
                    .build()).endpointArn();

            Gson gson = new GsonBuilder().create();
            String fcmMessage = gson.toJson(Map.of("data", Map.of("title", "Hi!", "body", "Mambo?!")));
            String messageId = snsClient.publish(PublishRequest.builder()
                    .messageStructure("json")
                    .message(gson.toJson(Map.of("GCM", fcmMessage)))
                    .targetArn(endpointArn)
                    .build()).messageId();

            log.info("messageId: {}", messageId);
            Assertions.assertNotNull(messageId);


        });
    }
}

μœ„ μ˜ˆμ œμ½”λ“œμ—μ„œ λ©”μ‹œμ§€μ˜ GCM 이 μ΄μŠ€μΌ€μ΄ν”„λœ JSON λ¬Έμžμ—΄λ‘œ κ΅¬μ„±λ˜μ–΄μ•Όν•¨μ„ μ£Όμ˜ν•΄μ•Όν•©λ‹ˆλ‹€.

PWA μ•±μ—μ„œμ˜ ν‘Έμ‹œ μ•Œλ¦Ό μ˜ˆμ‹œ