Coding Planet
[Next.js]๊ธฐ์๊ด๋ จ PWA ์น์ฑ ํ๊ณ - FCM์ ์ค์ ์ผ๋ก ๋ณธ๋ฌธ
๐ํ๋ก์ ํธ
[Next.js]๊ธฐ์๊ด๋ จ PWA ์น์ฑ ํ๊ณ - FCM์ ์ค์ ์ผ๋ก
jhj.sharon 2024. 9. 30. 13:51๋ฐ์ํ
ํ๋ก์ ํธ ๊ฐ์
- ํ๋ก์ ํธ ๊ฐ์
- ๊ธฐ์์ฒญ API๋ฅผ ํ์ฉํ์ฌ ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ง ๋ฐ ๊ฐ๊ณตํ ํ, ํน์ ์ฐ์ ์ฌ์ฉ์์๊ฒ ๋ฏธ์ธ ๊ธฐ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์น์ฑ ๊ฐ๋ฐ ํ๋ก์ ํธ.
- ๊ธ๊ฒฉํ ๊ธฐ์ ๋ณ๋ ์, ์น์ฑ์ด ํ์ฑํ๋์ด ์์ง ์์ ์ํฉ์์๋ ์ฌ์ฉ์์๊ฒ Push ์๋ฆผ์ ํตํด ์ค์๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ ๊ตฌํ.
- ๊ธฐ์ ์คํ
- ํ๋ก ํธ์๋: Next.js v13, TailwindCSS
- ๋ฐฑ์๋: Spring, JPA
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: PostgreSQL
- ํ๋ก์ ํธ ๊ธฐ๊ฐ
- 5์ฃผ
- ์ฐธ์ฌ ๋ถ์ผ
- ํ๋ก ํธ์๋ ๊ณตํต ๋ชจ๋ ๊ฐ๋ฐ
- Next.js ํ๊ฒฝ ์ค์ ๋ฐ ๊ตฌ์ฑ
- Redux ํ๊ฒฝ ๊ตฌํ ๋ฐ ์ํ ๊ด๋ฆฌ ๋ก์ง ๊ฐ๋ฐ
- FCM
- ํ๊ณ
- 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