๊ด€๋ฆฌ ๋ฉ”๋‰ด

Coding Planet

[Next.js]๊ธฐ์ƒ๊ด€๋ จ PWA ์›น์•ฑ ํšŒ๊ณ  - FCM์„ ์ค‘์ ์œผ๋กœ ๋ณธ๋ฌธ

๐Ÿ“šํ”„๋กœ์ ํŠธ

[Next.js]๊ธฐ์ƒ๊ด€๋ จ PWA ์›น์•ฑ ํšŒ๊ณ  - FCM์„ ์ค‘์ ์œผ๋กœ

jhj.sharon 2024. 9. 30. 13:51
๋ฐ˜์‘ํ˜•

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

  1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
    • ๊ธฐ์ƒ์ฒญ API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ ๋ฐ ๊ฐ€๊ณตํ•œ ํ›„, ํŠน์ • ์‚ฐ์—… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฏธ์„ธ ๊ธฐ์ƒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น์•ฑ ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ.
    • ๊ธ‰๊ฒฉํ•œ ๊ธฐ์ƒ ๋ณ€๋™ ์‹œ, ์›น์•ฑ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ Push ์•Œ๋ฆผ์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„.
  2. ๊ธฐ์ˆ  ์Šคํƒ
    • ํ”„๋ก ํŠธ์—”๋“œ: Next.js v13, TailwindCSS
    • ๋ฐฑ์—”๋“œ: Spring, JPA
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: PostgreSQL
  3. ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„
    • 5์ฃผ
  4. ์ฐธ์—ฌ ๋ถ„์•ผ
    • ํ”„๋ก ํŠธ์—”๋“œ ๊ณตํ†ต ๋ชจ๋“ˆ ๊ฐœ๋ฐœ
    • Next.js ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ๊ตฌ์„ฑ
    • Redux ํ™˜๊ฒฝ ๊ตฌํ˜„ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง ๊ฐœ๋ฐœ
    • FCM
  5. ํšŒ๊ณ 
    • Next.js ์ ์‘: ๊ธฐ๋ณธ์ ์ธ ๋ฆฌ์•กํŠธ ์ง€์‹๋งŒ์„ ๊ฐ€์ง€๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์˜€๊ธฐ ๋•Œ๋ฌธ์— Next.js ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“ˆ ๊ตฌ์กฐ์™€ ๊ธฐ๋Šฅ์— ์ ์‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ–ˆ๋‹ค.
    • ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋žœ๋”๋ง(SSR)๊ณผ ํด๋ผ์ด์–ธํŠธ์‚ฌ์ด๋“œ ๋žœ๋”๋ง(CSR) ๊ตฌ๋ถ„: Next.js๊ฐ€ SSR์— ํŠนํ™”๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , Redux๋ฅผ ํ™œ์šฉํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ผ๋ถ€ ๊ณตํ†ต ๋ชจ๋“ˆ์˜ ํŠน์„ฑ์ƒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง(CSR)์„ ๋ณ‘ํ–‰ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด๋กœ ์ธํ•ด SSR๊ณผ CSR์„ ์ ์ ˆํžˆ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์œผ๋ฉฐ, ๋‘ ๋žœ๋”๋ง ๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•œ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค.
    • ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ ์ธ์‹: ์ดˆ๊ธฐ ๊ธฐํš ๋‹จ๊ณ„์—์„œ SSR๊ณผ CSR์˜ ์‚ฌ์šฉ ๋ฒ”์œ„ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋ฐฉ์‹์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜์ง€ ๋ชปํ•œ ์ ์ด ํ”„๋กœ์ ํŠธ ์ค‘๋ฐ˜์— ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ผ๋ถ€ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ ํ†ตํ•ฉ์ ์ธ ์„ค๊ณ„๊ฐ€ ๋ถ€์กฑํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์ธ์ง€ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ํ–ฅํ›„ ์œ ์‚ฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ธฐํš ๋‹จ๊ณ„์—์„œ ์ฒ ์ €ํ•œ ์กฐ์‚ฌ๋ฅผ ํ†ตํ•ด ์„ค๊ณ„๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

ํšŒ๊ณ  - PWA Push ๊ตฌํ˜„ ๋ฐ FCM ์‚ฌ์šฉ

  • PWA ๋ฐ Push ์•Œ๋ฆผ ๊ตฌํ˜„: ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ์›น์•ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„ ๊ธ‰๊ฒฉํ•œ ๊ธฐ์ƒ ๋ณ€๋™์— ๋Œ€ํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก PWA(Progressive Web App) ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›น์•ฑ์„ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘์†ํ•˜๋”๋ผ๋„ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜์˜€๋‹ค.
  • FCM(Firebase Cloud Messaging) ๋„์ž… ๋ฐฐ๊ฒฝ: Push ์•Œ๋ฆผ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด Firebase Cloud Messaging(์ดํ•˜ FCM)์„ ์‚ฌ์šฉํ–ˆ๋‹ค. FCM์€ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ์˜ ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์•Œ๋ฆผ ์ „์†ก์ด ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ฑ„ํƒํ•˜์˜€๋‹ค. ์ดˆ๊ธฐ์—๋Š” ์„œ๋ฒ„์—์„œ ์ง์ ‘ ์•Œ๋ฆผ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค๋ฅผ ๊ฒ€ํ† ํ–ˆ์ง€๋งŒ, ์„ค์ •์˜ ๋ณต์žก์„ฑ๊ณผ ์•ˆ์ •์„ฑ ์ด์Šˆ๋กœ ์ธํ•ด FCM์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.
  • FCM ์—ฐ๋™ ๊ณผ์ •: FCM ์—ฐ๋™ ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์€ ์›น ์•ฑ์˜ ์ธ์ฆ ์ ˆ์ฐจ ๋ฐ ์‚ฌ์šฉ์ž ํ† ํฐ ๊ด€๋ฆฌ์˜€๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์›น์•ฑ์— ์ ‘์†ํ•  ๋•Œ๋งˆ๋‹ค FCM ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์—ฌ ๊ธฐ์ƒ ๋ณ€๋™ ๋ฐœ์ƒ ์‹œ ์•Œ๋ฆผ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ํ† ํฐ์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐฑ์‹ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ† ํฐ ๊ฐฑ์‹  ์‹œ ๊ธฐ์กด ํ† ํฐ์„ ๋ฌดํšจํ™”ํ•˜๊ณ  ์ƒˆ๋กœ์šด ํ† ํฐ์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์ด๋ฅผ Redux๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์„œ๋ฒ„์—์„œ๋Š” Spring์„ ํ™œ์šฉํ•ด REST API๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์†ก๋œ ํ† ํฐ์„ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ–ˆ๋‹ค.
  • ์•Œ๋ฆผ ์ „์†ก ๋ฐ ์ฒ˜๋ฆฌ: ๊ธฐ์ƒ์ฒญ API์—์„œ ๊ธฐ์ƒ ๋ณ€๋™ ์ •๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ›์•„ ๋ถ„์„ํ•œ ํ›„, ํŠน์ • ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•  ๋•Œ FCM์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ๋กœ ์•Œ๋ฆผ์„ ์ „์†กํ–ˆ๋‹ค. ์ด ๋•Œ ์•Œ๋ฆผ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ์ง€์—ญ ๋ฐ ๊ด€์‹ฌ ๊ธฐ์ƒ ์š”์†Œ(์˜ˆ: ๊ฐ•ํ’, ํญ์šฐ ๋“ฑ)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.
  • ๊ตฌํ˜„ ์‹œ ์–ด๋ ค์› ๋˜ ์  ๋ฐ ํ•ด๊ฒฐ:
    • ์ดˆ๊ธฐ FCM ์„ค์ • ์‹œ, ์„œ๋น„์Šค์›Œ์ปค(Service Worker)์™€์˜ ์—ฐ๋™์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋Š” HTTPS ํ™˜๊ฒฝ์—์„œ๋งŒ FCM์ด ์ •์ƒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋Š”๋ฐ, ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” HTTPS ์„ค์ •์ด ์–ด๋ ค์šด ์ƒํ™ฉ์ด์—ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ngrok์„ ํ™œ์šฉํ•ด ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ HTTPS ํ™˜๊ฒฝ์œผ๋กœ ๋ฐฐํฌํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ngrok ๋ฌด๋ฃŒ ํ”Œ๋žœ์˜ ์ œํ•œ ์‚ฌํ•ญ(์งง์€ ์„ธ์…˜ ์œ ์ง€ ์‹œ๊ฐ„)์œผ๋กœ ์ธํ•ด ์„œ๋น„์Šค ์›Œ์ปค๊ฐ€ ์ง€์†์ ์œผ๋กœ ์žฌ์—ฐ๊ฒฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋‚˜, ์œ ๋ฃŒ ํ”Œ๋žœ์„ ๊ฒฐ์ œํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ด๋กœ์จ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์ธ HTTPS ์—ฐ๊ฒฐ์„ ํ†ตํ•œ FCM ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค.
    • ๋˜ํ•œ, ์•Œ๋ฆผ์ด ์ „์†ก๋œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์›น์•ฑ์ด ์ ์ ˆํ•œ ๋ผ์šฐํŠธ๋กœ ์ด๋™ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„๋„ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค. ์•Œ๋ฆผ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๊ด€์‹ฌ ์ง€์—ญ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜์˜€๋‹ค.
  • ๊ฒฐ๊ณผ ๋ฐ ๊ฐœ์„ ์ :
    • FCM์„ ํ™œ์šฉํ•œ Push ์•Œ๋ฆผ ๊ธฐ๋Šฅ์€ ์›น์•ฑ์˜ ์‹ค์‹œ๊ฐ„์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ฃผ์—ˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๋“ค์ด ๊ธฐ์ƒ ๋ณ€๋™ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ๋‹ค๋งŒ, FCM ์˜์กด์„ฑ์œผ๋กœ ์ธํ•ด ๋„คํŠธ์›Œํฌ ์ƒํƒœ๊ฐ€ ์ข‹์ง€ ์•Š๊ฑฐ๋‚˜, ํ† ํฐ ๊ฐฑ์‹ ์ด ์›ํ™œํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ผ๋ถ€ ์•Œ๋ฆผ์ด ๋ˆ„๋ฝ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ์ถ”ํ›„ ์ž์ฒด ํ‘ธ์‹œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜, FCM ์™ธ๋ถ€์˜ ๋Œ€์•ˆ์„ ๋ชจ์ƒ‰ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
    • ์•Œ๋ฆผ ์ค‘๋ณต ๋ฐœ์†ก ๋ฌธ์ œ: ์‹ค์ œ ์šด์˜ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๊ธฐ ์ „๊นŒ์ง€ Push ์•Œ๋ฆผ์ด ๋ฌด์กฐ๊ฑด 2๋ฒˆ ๋ฐœ์†ก๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ์›์ธ์€ ์•„์ง ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ, ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค. ์ด๋Š” FCM ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์‹œ ์ค‘๋ณต ์ด๋ฒคํŠธ ๋ฐœ์ƒ ํ˜น์€ ์„œ๋น„์Šค์›Œ์ปค ๋“ฑ๋ก ๋ฐ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ์ค‘๋ณต ๋“ฑ๋ก ๋ฌธ์ œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ํŒ๋‹จ๋œ๋‹ค. ํ–ฅํ›„ ์ด๋Ÿฌํ•œ ์ค‘๋ณต ๋ฐœ์†ก์˜ ์›์ธ์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ณ  ์ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.
  • ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณ ๋ คํ•  ์‚ฌํ•ญ:
    • ์‚ฌ์šฉ์ž ๊ด€์‹ฌ ์ง€์—ญ์˜ ๊ธฐ์ƒ ์ •๋ณด๋ฅผ ์‚ฌ์ „์— ์บ์‹ฑํ•˜์—ฌ ์•Œ๋ฆผ ์ „์†ก ์‹œ ์‘๋‹ต ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์„ ์—ฐ๊ตฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
    • ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ์•Œ๋ฆผ์„ ์ˆ˜์‹ ํ•  ๋•Œ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ํ์ž‰(Queueing) ์‹œ์Šคํ…œ ๋„์ž…๋„ ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•˜๋‹ค.
๋ฐ˜์‘ํ˜•
Comments