๐ Firebase๋ฅผ ์ด์ฉํ ํธ์์๋ฆผ flow
์ด๋ฒ ํ๋ก์ ํธ์์๋ firebase๋ฅผ ์ ์ฉํ๊ฒ ์ฐ๊ณ ์๋๋ฐ, ํธ์ ์๋ฆผ๋ ํ์ด์ด ๋ฒ ์ด์ค์์ ์ ๊ณตํด์ฃผ๊ณ ์์ด์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค!
๋ฐฑ์๋๋ fcm ์๋ฒ์ ํธ์ ์๋ฆผ์ ์ ์กํ๊ณ ํ๋ก ํธ์๋๋ fcm ์๋ฒ์ ์๋ ๋ฉ์์ง๋ฅผ ํด๋น ๋๋ฐ์ด์ค์ ์๋ฆผ์ ๋์์ฃผ๋ ๊ฒ์ด๋ค.
๐ Firebase๋ก ๋ฉ์์ง ๋ณด๋ด๊ธฐ ์ํ ์ค๋น ๊ณผ์
1, Firebase project ์์ฑ ํ, ํฐ๋ฏธ๋์์ Firebase Admin SDK ์ค์น
$ npm install firebase-admin --save
2. SDK ์ด๊ธฐํ๋ฅผ ์ํ ์๋ฒ ํค ๋ค์ด๋ก๋
ํ๋ก์ ํธ ์ฝ์๋ก ์ด๋ -> ์๋น์ค ๊ณ์ -> ํค ์์ฑ
3. SDK ์ด๊ธฐํ ์ฝ๋ ์์ฑ
์์ ์ฌ์ง์ ๋ณด์ด๋ ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ค.
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
์ค๊ฐ์ "path/to/serviceAccountKey.json"์ ํด๋น ํค ๊ฒฝ๋ก๋ฅผ ์จ์ฃผ๋ฉด ๋๋๋ฐ,
๋๋ ํ๋ก์ ํธ ํด๋ ์์ ํค๋ฅผ ๋ฃ์ด์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ ์ด์ฃผ์๋ค.
(๊ผญ .gitignore์ ํค๋ฅผ ์จ์ฃผ์ด์ผ ํฉ๋๋ค!! ๊นํ์ ์ฌ๋ผ๊ฐ๋ฉด ์ ๋ผ์!!!!!!!)
let serviceAccount = require(./๋ค์ด๋ฐ์serviceAccountKey๊ฐ.json);
4. ์ค์ message ๋ณด๋ด๊ธฐ
// ๋ฉ์ธ์ง ๋ด์ฉ
const message = {
notification: {
title: notificationTitle,
body: notificationContent,
},
token: token,
};
// ๋ฉ์ธ์ง ์ ์ก
admin
.messaging()
.send(message)
.then(function (response) {
console.log("ํธ์์๋ฆผ ์ ์ก ์ฑ๊ณต", response);
})
.catch(function (error) {
console.log("ํธ์์๋ฆผ ์ ์ก ์คํจ");
});
};
๐ ์ด ์ฝ๋๊ฐ ์ค์ ๋ก fcm ์๋ฒ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ฝ๋์ด๋ค. (unicast, ๋๋ฐ์ด์ค ํ ํฐ ํ ๊ฐ ํ์)
๋๋ฐ์ด์ค ํ ํฐ์ ํ๋ก ํธ์ํธ ๊ฐ๋ฐ์ ๋ถ๋ค๊ป ์์ฒญํด์ ํธ์ ์๋ฆผ์ด ์ ๊ฐ๋์ง ํ
์คํธํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ ์์์๋ ์ ์ ๊ฐ ๋ก๊ทธ์ธํ ๋ db์ ๊ทธ ์ ์ ์ ๋๋ฐ์ด์ค ํ ํฐ์ ์ ์ฅํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
์ด๋ค ์ ์ ์๊ฒ ํธ์ ์๋ฆผ์ ๋ณด๋ด์ผ ํ๋์ง ํ์ธํ๋ฉด์ ํด๋น ์ ์ ์ ๋๋ฐ์ด์ค ํ ํฐ์ ๊ฐ์ ธ์ token ๊ฐ์ผ๋ก ๋ฃ์ด์ฃผ์๋ค!
๋๋์ ๋ฐฐ ํ๋ก์ ํธ์์๋ api์ ์ด ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ฌด ๊ธธ์ด์ ธ์ lib์์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ฝ๋๋ฅผ ๋ชจ๋ํ ํด ๋๊ณ , ํ์ํ api์์ ํธ์ถํ๋ ์์ผ๋ก ์ฝ๋ ๋ฆฌํฉํ ๋ง ์ค์ด๋ค! ์ ์งํํ๋ค. (์๋ฒ ์ ๋ฐฐ๋ค ์ต๊ณ ๐๐ป)
๋ฐ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด sendUnicast์ sendMulticast๊ฐ ์๋๋ฐ
- sendUnicast -> send(message) : ํ๋์ device token์๊ฒ ๋ณด๋
- sendMulticast -> sendMulticast(message) : ์ฌ๋ฌ ๊ฐ์ device token๋ค์๊ฒ ํ ๋ฒ์ ๋ณด๋
์ด๋ ๊ฒ ๋๋ ์ ๋ณผ ์ ์๋ค.
์ multicast๋ฅผ ์ผ๋์ง๋ ๋ฐ์์ ์ค๋ช
ํ๋๋ก ํ๋ค.
const admin = require("firebase-admin");
const sendUnicast = function (token, notificationTitle, notificationContent) {
// ๋ฉ์ธ์ง ๋ด์ฉ
const message = {
notification: {
title: notificationTitle,
body: notificationContent,
},
token: token,
};
// ๋ฉ์ธ์ง ์ ์ก
admin
.messaging()
.send(message) // ํ๋์ device token์๊ฒ ๋ณด๋
.then(function (response) {
console.log("ํธ์์๋ฆผ ์ ์ก ์ฑ๊ณต", response);
})
.catch(function (error) {
console.log("ํธ์์๋ฆผ ์ ์ก ์คํจ");
});
};
const sendMulticast = function (tokens, notificationTitle, notificationContent) {
// ๋๊ธ์ด ์์ ๋๋ง ํธ์์๋ฆผ ์ ์ก, ๋๊ธ์ด ์์ ๊ฒฝ์ฐ tokens๊ฐ ๋น ๋ฐฐ์ด์ด๋ผ์ ์ค๋ฅ๋จ.
if (tokens.length !== 0) {
// ๋ฉ์ธ์ง ๋ด์ฉ
const message = {
notification: {
title: notificationTitle,
body: notificationContent,
},
tokens: tokens,
};
// ๋ฉ์ธ์ง ์ ์ก
admin
.messaging()
.sendMulticast(message) // ์ฌ๋ฌ๊ฐ์ device token์๊ฒ ํ ๋ฒ์ ๋ณด๋
.then((response) => {
console.log("ํธ์์๋ฆผ ์ ์ก ์ฑ๊ณต", response.successCount);
})
.catch(function (error) {
console.log("ํธ์์๋ฆผ ์ ์ก ์คํจ");
});
}
};
module.exports = {
sendUnicast,
sendMulticast,
};
โผ๏ธ ์, ์ค๊ฐ์ ์ค๋ฅ๋ฅผ ํ ๋ฒ ๋ง๋ฌ๋๋ฐ ๊ทธ ์ด์ ๋.... multicast์ ๋น ๋ฐฐ์ด์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ์ empty array๋ก ์๋ฌ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ด์๋ค...
๊ทธ๋์ tokens ๋ฐฐ์ด ๊ธธ์ด๊ฐ 0์ธ ๊ฒฝ์ฐ๋ ๋ณด๋ด์ง ์๋๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋ค.
๐ ๋๋์ ๋ฐฐ์ ์๋์ด ํ์ํ ์ํฉ! - ์ multicast๊ฐ ํ์ํด?
๋๋์ ๋ฐฐ ์ฑ์๋ ํฌ๊ฒ
- ๋์๊ฒ ์จ 1:1 ์ง๋ฌธ๊ธ ์๋ฆผ(๋ง์ดํ์ด์ง์ 1:1 ์ง๋ฌธ๊ธ์ด ์ฌ๋ผ์จ ๊ฒฝ์ฐ)
- ๋ต๊ธ ์๋ฆผ(๋ด๊ฐ ์ด ๊ธ์ ๋ต๊ธ์ด ๋ฌ๋ฆฐ ๊ฒฝ์ฐ)
- ์ ๋ต๊ธ ์๋ฆผ(๋ด๊ฐ ๋ต๊ธ์ ์ด ํ์ธ ๊ธ์ ์ ๋ต๊ธ์ด ๋ฌ๋ฆฐ ๊ฒฝ์ฐ)
์ด๋ ๊ฒ ์ธ ๊ฐ์ง์ ์๋ฆผ ์ข
๋ฅ๊ฐ ์๊ณ ,
์ธ๋ถ์ ์ผ๋ก๋ 2, 3๋ฒ์ ์ง๋ฌธ๊ธ / ์ ๋ณด๊ธ๋ก ๋๋์ด์ ธ์ ์ด 7๊ฐ์ ์ ํ์ด ์๋ค.
์ ํ๋ง๋ค ์๋ฆผ ๋ฌธ๊ตฌ๋ ๋ฌ๋๊ณ , ํนํ ๊ฒ์๊ธ์ธ ๊ฒฝ์ฐ๋ ํน์ ์ ์ 1๋ช
์๊ฒ ๋ณด๋ด๋ unicast์ธ์ง ๋ค์์๊ฒ ๋ณด๋ด๋ multicast์ธ์ง ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ ๋ถ๋ถ์ด ์ข ๊น๋ค๋ก์ ๋ค.
์๋ฅผ ๋ค์ด, ๋ด๊ฐ 1๋ฒ ๊ฒ์๋ฌผ์ ๋๊ธ์ ๋จ ๊ฒฝ์ฐ
- 1๋ฒ ๊ฒ์๋ฌผ์ ์ด ์ ์ (์์ฑ์)์๊ฒ "์์ฑํ์ ์ง๋ฌธ๊ธ์ ์ฃผํ๋์ด ๋ต๊ธ์ ๋จ๊ฒผ์ต๋๋ค." ๋๋ "์์ฑํ์ ์ ๋ณด๊ธ์ ์ฃผํ๋์ด ๋ต๊ธ์ ๋จ๊ฒผ์ต๋๋ค."๋ผ๋ ์๋ฆผ์ ๋ณด๋ธ๋ค.
- 1๋ฒ ๊ฒ์๋ฌผ์ ๋๊ธ์ ๋ฌ์๋ ์ ์ ๋ค์๊ฒ "๋ต๊ธ์ ์์ฑํ์ ์ง๋ฌธ๊ธ์ ์ฃผํ๋์ด ๋ต๊ธ์ ๋จ๊ฒผ์ต๋๋ค." ๋๋ "๋ต๊ธ์ ์์ฑํ์ ์ ๋ณด๊ธ์ ์ฃผํ๋์ด ๋ต๊ธ์ ๋จ๊ฒผ์ต๋๋ค."
์ด๋ฐ ์์ผ๋ก ๋ง์ case๊ฐ ์๋ค.
์ฌ๊ธฐ์ "์ ์ ๋ค" ์๊ฒ ๋ณด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ multicast๋ฅผ ์ฌ์ฉํ๋ค.
๋ง์ฝ, ๊ทธ๋ฅ send๋ฅผ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ํธ์ ์๋ฆผ์ ์ ์กํ๋ค๋ฉด ํด๋น ๊ฒ์๊ธ์ ๋๊ธ์ ๋จ ์ ์ ๋ง๋ค ํธ์์๋ฆผ์ ๋ฐ๋ ์๊ฐ์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
(์ฌ๋ฌ ๋ช
์๊ฒ ํ ๋ฒ์ ๋ณด๋ผ ๋ multicast๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค!)
๐ ๋ง์น๋ฉฐ
์ฌ์ค ๋ค๋ฅธ ํ์๋ค์๊ฒ ๋์์ด ๋๊ณ ์ถ์ด์ ๋ค๋ฅธ API๋ฅผ ๊ตฌํํ๋ฉด์ ํํ์ด ํธ์ ์๋ฆผ ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ์ฝ๋๋ฅผ ์งฐ์๋๋ฐ ๋๋ฐ์ด์ค ํ ํฐ์ด ์์ด์ ์ง์ ์๋์ด ์ค๋ ๊ฒ์ ๋์ผ๋ก ํ์ธ ๋ชปํ๋ ๊ฒ ์์ฌ์ ๋ค.
๋น๋ก ์ฑ์ผ ๊ธฐ๊ฐ์ด ์ผ๋ง ์ ๋จ์์ ์๋ / ์ด๋ฉ์ผ ์ธ์ฆ ์ด๋ ๊ฒ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๋๋ ์ ๋ด๋นํด์ ๋๋ ์๋ ์ฝ๋์ ์ง์ ์ ์ธ ์ํฅ(?)์ ๋ผ์น์ง ๋ชปํ์ง๋ง ํผ์ ๊ณต๋ถํ๋ฉด์ ์ฌ๋ฐ์๋ค. ์ถ๊ฐ๋ก ์๊ฐ ์ค์ ํด์ ํธ์ ์๋ฆผ ๋ณด๋ด๋ ๊ธฐ๋ฅ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค!
๋ค์ ํ๋ก์ ํธ์ ํธ์ ์๋ฆผ์ด ์๋ค๋ฉด ํผ์ ๊ตฌํํ ์... ์์ง ์์๊น..? ํํ
+ ์๋ฒ ํ์๋ค๊ณผ ์ฝ๋ ๊ตฌํ ๊ด๋ จ ํ์ํ ๋ ๋ค๋ค ํธ์ ์๋ฆผ์ด ํด๋ณด๊ณ ์ถ๋ค๊ณ ํด์ ๊ฐ์ ์ฝ๋๋ฅผ ์ง๋ฉฐ ๊ณต๋ถ๋ฅผ ํด๋ณด๊ธฐ๋ก ํ๋๋ฐ, ๋ชจ๋ ์ด์ฌํ ํด์ค์ ๊ณ ๋ง์ ๋ค. ๋ค๋ค ๊ณ ์ํ์ด์ ๐ฅ
'Programming > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Nodejs] firebase๋ก ์ด๋ฉ์ผ ์ธ์ฆ ๊ตฌํํ๊ธฐ (0) | 2022.06.01 |
---|---|
[Nodejs] Express ๊ตฌ์กฐ ๋ฏ์ด๋ณด๊ธฐ (0) | 2022.04.05 |
[Nodejs] express๋ฅผ ์ด์ฉํ ์๋ฒ ๊ตฌ์ถ (0) | 2022.03.31 |
[Nodejs] firebase FCM์ ์ด์ฉํ pushAlarm ์๋ฒ ๊ตฌํ - ์๋ฆฌ ์ค์ (5) | 2022.02.04 |