-
Notifications
You must be signed in to change notification settings - Fork 3
ChungUlLim_ProjectBlog
By ์ฒญ์ธ๋ฆผ ํ | ๊น์์ค, ๊ถ์์, ์ฌ์์
๋ชฉ์ฐจ
- ์๋ก | ์ฒญ๊ฐ์ฅ์ ์ธ ๋ถ๋ค์ด ๊ฒช๋ ์นดํ ์ด์ฉ์ ์ด๋ ค์
- ๋ณธ๋ก | ํด๊ฒฐ์ ์ค๋ง๋ฆฌ
1) PWA๋?
2) PWA๋ฅผ ์ด์ฉํ ์นดํ ์ฃผ๋ฌธ์๋ฃ ์์คํ
3) ์์คํ ๋ฐฐ๊ฒฝ ๋ฐ ๊ธฐ๋ฐ ๊ธฐ์- AWS EC2 Amazon Linux ์ธ์คํด์ค ์์ฑ
- Node.js Server
- HTTPS ์ฌ์ฉ์ ์ํ Let's encrypt CA ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ๊ธฐ
- Notification API & Push API
- ๊ฒฐ๋ก | ๊ฐ๋ฅ์ฑ๊ณผ ํ๊ณ
1) ํ๋ก์ ํธ ๊ฒฐ๊ณผ
2) ํ๋ก์ ํธ ์์ฝ ์ ๋ฆฌ
3) ๊ธฐ๋๋๋ ํจ๊ณผ
4) ํ๊ณ
5) ํ์ฅ๊ฐ๋ฅ์ฑ
์ฒญ๊ฐ์ฅ์ ์ธ๋ถ๋ค์ด ์นดํ๋ฅผ ์ด์ฉํ ๋ ๊ฐ์ฅ ๋ถํธํ๋ ์ ์ด ๋ฌด์์ผ๊น์?
์์ ํ๋ฅผ ๋ณด์, ์ฒญ๊ฐ์ฅ์ ์ธ๋ถ๋ค์ ์นดํ์์ ์ปคํผ ์ ์กฐ ์๋ฃ์ ์ง์์ด ๋ถ๋ฅด๋ ๊ฒ์ ๋ฃ์ง ๋ชปํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋ถํธํ๋ค๊ณ ํ์
จ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด โ์ง๋๋ฒจ์ ๊ตฌ๋นํ์ฌ ์ฌ์ฉํ๋ฉด ๋์ง ์๋๋!โ ๋ผ๋ ์๋ฌธ์ด ๋คํ ๋ฐ์.
ํ์ง๋ง ์ง๋๋ฒจ์ ๋จ๊ฐ๋
๊ฐ๋น 6~9๋ง์์ ๋น์ฉ์ด๋ ๋ค๊ณ ํฉ๋๋ค. ๊น๋นก ์๊ณ ์ง๋๋ฒจ์ ๋ค๊ณ ๊ฐ์๋ ๋ถ๋ค๋ ๋ง์ผ์
์ ๋ถ์ค์ ์ฐ๋ ค๋ ๋ํ ๋๋ค๊ณ ํ๋๋ฐ์.
๊ทธ๋ฆฌํ์ฌ ๋จผ์ โ์ง๋๋ฒจ์ ๋์ฒดํ์ฌ ๋ฌด์์ ์ง๊ธ์ ์ฌ์ฉํ๊ณ ์๋๊ฐ?โํ๊ณ ์กฐ์ฌ๋ฅผ ํด ๋ณด์์ต๋๋ค.
์ฒซ๋ฒ์งธ๋ก ํ ๋ํ ํ๋์ฐจ์ด์ฆ ์นดํ ๋ฅผ ์๋ก ๋ค ์ ์์ต๋๋ค.
์ด ํ๋์ฐจ์ด์ฆ ์นดํ๋ ํด๋น ์นดํ์ ์ฑ์ ๋ค์ด ๋ฐ์ ํด๋ํฐ ๋จ๋ง๊ธฐ๋ก ์ฃผ๋ฌธ ์๋ฃ ์๋ฆผ์ ์ฃผ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ํด๋ํฐ์ผ๋ก ์๋ฆผ์ ๋ฐ๊ธฐ๋๋ฌธ์ ์ง๋๋ฒจ์ด ํ์ ์๋ ์ข์ ๋์ฒด ๋ฐฉ์์ผ๋ก ๋ณด์ด๋๋ฐ์. ์ฌ์ค ์ฑ ์๋น์ค๊ฐ ์ง๋๋ฒจ์ ๋์ ํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ด์ 1. ๋ชจ๋ ์นดํ๊ฐ ์ฑ ์๋น์ค๋ฅผ ์ ๊ณตํ ์๋ ์๋ค.
๋ชจ๋ ์นดํ๊ฐ ์ฑ ์๋น์ค๋ฅผ ์ ๊ณต ํ ์ ์๋ค๋ ๊ฒ์ ์๊ท๋ชจ์ ์นดํ์ ๊ฒฝ์ฐ ๊ฐ ๊ฐ์ธ ์นดํ์ ์ฑ์ ์ ์ํ๊ณ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ ์นดํ๋ง๋ค ์ฑ์ ๋ชจ๋ ์ ์ํ๊ธฐ์๋ ๋ง์ ์ด๋ ค์์ด ์๊ฒ ์ฃ ?
์ด์ 2. ๋ชจ๋ ์๋์ด ์ฑ์ ์ฌ์ฉํ์ง๋ ์๋๋ค.
์ฑ์ ๋ค์ด๋ฐ์์ผํ๋ ๋ฒ๊ฑฐ๋ก์๊ณผ ์๋ฆผ์๋น์ค์ ํ์์ฑ์ ๋๋ผ์ง ๋ชปํ๋ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ด์ ๋ค๋ก ์๋๋ค์ ์ฑ์ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ค์ ๋ก ํ ์ธ์ด๋ ํฌ์ธํธ์ ๋ฆฝ ๋ฑ์ ํํ์ ์ํด ์ฑ์ ๋ค์ด๋ฐ์ ์ฌ์ฉํ์ง๋ง, ๊ทธ๋ค์ง ํ์์ฑ์ ๋๋ผ์ง ๋ชปํ๋ ์๋๋ค์ ์ฑ์ ์ค์นํ์ง ์์ต๋๋ค.
์ฆ, ๋ชจ๋ ์๋์ด ์ฑ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ๋ํ ํ๋์ฐจ์ด์ฆ ์นดํ๋ ์ด ์ฌ์ค์ ์ธ์งํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋งค์ฅ ๋ด์์๋ ์ฌ์ ํ ์ง๋๋ฒจ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋๋ฒ์งธ๋ก ๋ฌธ์๋ฉ์์ง๋ก ์๋ฃ ์ ์ ์๋ฃ๋ฅผ ์๋ ค์ฃผ๋ ์์คํ ์ ์๋ก๋ค ์ ์์ต๋๋ค.
์ผ๋ถ ์นดํ๋ ์ฑ์ด ์๋ ์ ํ๋ฒํธ๋ฅผ ์ด์ฉํ์ฌ ์๋ฃ ์ ์กฐ ์๋ฃ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํฉ๋๋ค. ํ์ง๋ง ๊ฐ์ธ ์ ํ๋ฒํธ๋ฅผ ์นดํ์ธก์ ์๋ ค์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์, ๊ฐ์ธ์ ๋ณด ์ ์ถ ์ฐ๋ ค๋๊ฐ ๋์ ์์ฆ ์๋๋ค์ด ๋ฌ๊ฐ์ํ์ง๋ ์๊ฒ ์ฃ ?
์ฒญ๊ฐ์ฅ์ ์ธ ๋ถ๋ค๊ป์ ๊ฒช๊ณ ์๋ ์ด๋ ค์(์ปคํผ ์ ์กฐ ์๋ฃ์ ์ง์์ด ๋ถ๋ฅด๋ ๊ฒ์ ๋ฃ์ง ๋ชปํ๋ ๊ฒ), ์ฑ ์ค์น์ ๋ฒ๊ฑฐ๋ก์, ๊ฐ์ธ์ ๋ณด์ ์ถ ๋ฑ์ ๋ฌธ์ ๋ค๋ก๋ถํฐ ์ ํฌํ์ ์ฌ๋๋ค์ด ๊ฐ์ฅ ๋ง์ด ์ง๋๊ณ ๋ค๋๋ ํด๋ํฐ ๋จ๋ง๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฑ์ด ์๋ ์น์ผ๋ก ๊ตฌํํ์ฌ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๋๋ก ๊ฐ๋ฐํ๊ธฐ๋ก ํ์ต๋๋ค. ์กฐ์ฌ๋ฅผ ํ๋ ๋์ค ์น์ผ๋ก ํด๋ํฐ ๋จ๋ง๊ธฐ๋ก ์๋ฆผ์ ์ค ์ ์๋ PWA๋ผ๋ ๊ฐ๋ ์ ๋ฐ๊ฒฌํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ตฌ๊ธ ํฌ๋กฌ ์์ง๋์ด ์๋ ์ค ๋ฌ์
์ด 2015๋
์ ๊ณ ์ํ ๊ฐ๋
์ผ๋ก ์ฑ์ ๊ทผ์ ํด๊ฐ๋ ์น์ผ๋ก, ์ฑ ์์ค๊ณผ ๊ฐ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์น์์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ๊ฐ์ง
์ฅ์
- ์น์ฃผ์๋ง ์์ผ๋ฉด ๋๊ตฌ๋ ์ ๊ทผํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
- ๋จ๋ง๊ธฐ์ ์ ์ฅ๊ณต๊ฐ์ ๋ง์ด ์ฐจ์ง ์๋๋ค.
- ๋ค์ํ ํ๋ซํผ์ ํตํด์ ํ๋ณด๋ฅผ ์งํํ ์ ์๋ค.
- ์ฑ๋ณด๋ค ๋น ๋ฅธ ๊ตฌ๋์๋๋ฅผ ๊ฐ์ง๋ค.
- ์คํ๋ผ์ธ์ผ ๋์๋ ๋ก๋ฉ์ด ๊ฐ๋ฅํ๋ค.
๋จ์
- ์ฌ์ฉ์๊ฐ ํ๋ฒ ์ ์ํ๊ฒ ํ๊ธฐ๋ ์ฝ์ง๋ง, ๋ฐ๋ณตํด ์ ์ํ๊ฒํ๊ธฐ๋ ์ฝ์ง์๋ค.
PWA๋ฅผ ์คํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ธฐ์
Web App Manifest : Native App ์ ๊ทผ์ฑ ์ ๊ณต
Service Worker : ์คํ๋ผ์ธ ์บ์ฑ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ
Push Notification : ํธ์ ์๋ฆผ
๋ชจ๋ฐ์ผ ์น์ด์ง๋ง ํธ์ ์๋ฆผ์ ๋ณด๋ผ ์ ์๋ค. <์ถ์ฒ: ๊ตฌ๊ธ ๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ>
๊ทธ๋์ ์ ํฌ๋ PWA์ โ์๋น์ค ์์ ์(service worker)โ๋ก ๋ถ๋ฆฌ๋ API๋ก ์ฌ์ฉ์์๊ฒ ํธ์ ์๋ฆผ์ ๋ณด๋ด๋ ์์คํ ์ ๊ตฌ์ฑํ์ต๋๋ค.
Service worker๋
๋ธ๋ผ์ฐ์ ์ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์คํฌ๋ฆฝํธ๊ธฐ๋ฐ์ ์์ปค์ด๋ฉฐ, ์นํ์ด์ง์๋ ๋ณ๋์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ๋์ํ๋ ๊ฒ์
๋๋ค.
์๋น์ค์์ปค๊ฐ ๋ณ๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ๋์ํ๋ค๊ณ ํ๋๋ฐ ์ด๋ฒ์๋ ์๋น์ค์์ปค์ ์๋ช ์ฃผ๊ธฐ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
Service worker์ ์๋ช
์ฃผ๊ธฐ
์ฌ์ฉ์๊ฐ ์น ํ์ด์ง์ ์ต์ด๋ก ์ ์ํ๋ฉด ์๋น์ค ์์ปค๋ install ์ด๋ฒคํธ๋ฅผ ์๋ํฉ๋๋ค. install์ ์๋น์ค ์์ปค ๋ณ๋ก ํ ๋ฒ๋ง ํธ์ถ๋๋ฉฐ, ํด๋น ์๋น์ค์์ปค ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ค๋ฅธ ์๋น์ค์์ปค๋ก ๊ฐ์ฃผํฉ๋๋ค. install์ ์คํจํ๋ฉด, ๋ค์ ์น ํ์ด์ง ์ ์ ์์ ๋ค์ install์ ์๋ํฉ๋๋ค. install์ ์ฑ๊ณตํ๋ฉด ์๋น์ค์์ปค๋ activiated ์ํ, ์ฆ ํ์ฑํ๊ฐ ๋ฉ๋๋ค. ์ด ๋จ๊ณ์์, ์๋น์ค ์์ปค๋ fetch๋ push ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ฒ๋ฆฌํ ์ด๋ฒคํธ๊ฐ ์๋ ๋์๋ idle ์ํ๋ก ๋๊ธฐํฉ๋๋ค.
๊ทธ๋ผ ์๋น์ค ์์ปค๋ ๋ฌด์จ์ผ์ ํ ๊น์?
์๋น์ค์์ปค์ ๊ธฐ๋ฅ
- ์บ์(cache)์ ์ํธ์์ฉ
์๋น์ค ์์ปค๋ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ์ด ๋๊ฒจ๋ PWA์ฑ์ด ์๋ํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๊ธฐ์ ์บ์๋ก ์ ์ฅํด ๋๊ณ ์ ๋ณด๋ฅผ ์บ์์์ ๊บผ๋ด์ค๊ธฐ ๋๋ฌธ์ด์ฃ . - ํธ์ ์๋ฆผ(Push Notification) ๋ณด๋ด๊ธฐ
๋ธ๋ผ์ฐ์ ๊ฐ ๋ซํ ์ํ์์๋ ๋์ํ๋ ํน์ฑ์ผ๋ก๋ถํฐ ํธ์์๋ฆผ์ ๋ณด๋ผ ์ ์์ต๋๋ค. - ๋ฐฑ๊ทธ๋ผ์ด๋ ๋๊ธฐํ(Background Sync)
์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๊ฒจ ์ค๋จ๋ ์์ ์ ์ธํฐ๋ท์ด ์ฐ๊ฒฐ๋๋ฉด ๋ฐ๋ก ์ฌ๊ฐํ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก๋ ๊ฐ๋จํ๊ฒ ์๋น์ค์์ปค๋ฅผ ๋ฑ๋กํ๊ณ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Service Worker ๋ฑ๋ก ๋ฐ ํ์ฑํ
๋จผ์ , ํธ์์๋น์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฐ์ ์๋น์ค์์ปค๋ฅผ ๋ฑ๋กํด์ผํฉ๋๋ค.
๋จผ์ ์น๋ธ๋ผ์ฐ์ ๊ฐ ์๋น์ค์์ปค๋ฅผ ์ง์ํ๋์ง ํ๋จํ๊ณ , ์ง์ํ๋ค๋ฉด /sw.js์ ์๋ ์๋น์ค์์ปค ๋ฑ๋กํ๋ ๊ฒ์
๋๋ค.
์๋น์ค ์์ปค ํ์ผ์ ์์น๋ ๋๋ฉ์ธ์ ๋ฃจํธ์ ๋์ผํฉ๋๋ค. ์๋น์ค ์์ปค๋ ํ์ฌ ๊ฒฝ๋ก์ ํ์ ๊ฒฝ๋ก์์๋ง ๋์ํ๊ธฐ ๋๋ฌธ์, ์๋น์ค ์์ปค์ ๋์ ๋ฒ์๊ฐ ๋๋ฉ์ธ์ ๋ชจ๋ ํญ๋ชฉ์ ์ ์ฉ๋์ด์ผํ๊ธฐ ๋๋ฌธ์ด์ฃ .
์น ์ฌ์ดํธ์ ๋ค๋ฅธ ์ค์ํ ํ๋ก์ธ์ค์ ์๋๋ฅผ ๋ฆ์ถ์ง ์๊ธฐ ์ํด์ ์นํ์ด์ง๋ฅผ ์์ ํ ๋ค์ด๋ก๋ํ ํ ์๋น์ค ์์ปค๋ฅผ ๋ฑ๋ก ํ๋๋ฐ์. ์๋์ ์ฝ๋์ฒ๋ผ window.addEventListener ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
if ('serviceWorker' in navigator) { window.addEventListener('load', function() { navigator.serviceWorker.register('./sw.js'); }); }
์๋๋ฆฌ์ค
์๋์ด ์นดํ ์ ์์๊ฒ ์ฃผ๋ฌธ์ ํ ํ nfcํํฌ์ ํ๊น
์ ํฉ๋๋ค. ์นํ์ด์ง ์ ์๊ณผ ๋์์ ์๋์ ๋จ๋ง์ ๋ณด๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ฉ๋๋ค. ์๋ฃ์ ์์ด ์๋ฃ๋๋ฉด ์๋์ ๋จ๋ง๊ธฐ๋ก push์๋ฆผ์ด ๋ณด๋ด์ด์ง๋๋ค.
์์คํ ๊ตฌ์ฑ๋
Client ๋จ๋ง๊ธฐ(์๋)๋ nfcํ๊น ์ ํตํด ์น๋ธ๋ผ์ฐ์ ์ ์ ์ํฉ๋๋ค.(1) ์น๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์นํ์ด์งdata๋ฅผ ์ฝ์ด Client ๋จ๋ง๊ธฐ์ ํ๋ฉด์ ๋ํ๋ด ์ค๋๋ค.(2, 3) ์ด๋ ์น๋ธ๋ผ์ฐ์ ์ ์๋น์ค ์์ปค๊ฐ ๋ฑ๋ก๋๊ณ (4) ์๋์ด ์นํ์ด์ง์ ํธ์์๋ฆผํ์ฉ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ตฌ๋ ๊ฐ์ฒด(ํธ์ ๋ฉ์์ง๋ฅผ ์ ์กํ๊ธฐ ์ํด ํ์ํ ์ ๋ณด)๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ฉ๋๋ค.(5)
Manager ๋จ๋ง๊ธฐ(์นดํ์ ์)๋ (5)๊น์ง Client ๋จ๋ง๊ธฐ์ ๋์ผํ๊ฒ ์งํ๋ฉ๋๋ค. Manager ๋จ๋ง๊ธฐ์์ Client ๋จ๋ง๊ธฐ์๊ฒ push์๋ฆผ์ ๋ณด๋ด๋ฉด(6) ๋ ธ๋์๋ฒ์ web push protocol์ ์ด์ฉํ์ฌ Client ๋จ๋ง๊ธฐ๋ก push์๋ฆผ์ด ์ ์ก๋ฉ๋๋ค.(7)
์์ ์์คํ ์ด ์ด๋ค ์๋๋ฆฌ์ค๋ก ๋์ํ๊ณ ๊ฐ ์์คํ ๊ตฌ์ฑ์ด ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง, ๊ทธ๋ฆฌ๊ณ ์์คํ ๊ตฌ์ฑ ์ฌ์ด์ ์ด๋ค ๋์์ด ์ด๋ฃจ์ด์ง๋์ง์ ๋ํด์ ์ดํด๋ณด์์ต๋๋ค. ์ด์ ์์ ์์คํ ๊ตฌ์ฑ์ด ๋ฌด์์ ๊ฐ์ง๊ณ ๋ง๋ค์ด์ก๊ณ , ๊ตฌ์ฑ ๊ฐ ์ํธ์์ฉ์ด ์ด๋ค ์๋ฆฌ๋ก ๋์ํ๋์ง ์ข ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด ์ค๋ช ์ ๋ชฉ์ ์ ์์คํ ์ ๋ฐฐ๊ฒฝ๊ณผ ๊ธฐ๋ฐ ๊ธฐ์ ์ ์ ๋ฐ์ ์ธ ์ดํด๋ฅผ ๋๊ธฐ ์ํ ๊ฒ์ด๋ฏ๋ก, ๋๋ฌด ๊น์ด ์๋ ๋ด์ฉ์ ์๋ตํ๊ฒ ์ต๋๋ค.
- AWS EC2 Amazon Linux ์ธ์คํด์ค ์์ฑ
์น ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด์๋ ๋น์ฐํ ์น ์๋ฒ๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์๋ฒ์ ์๋น์ค์ ๋ํ ์ด๋ค ์์ฒญ(Request)๋ฅผ ํ๊ฒ ๋๋ฉด, ์๋ฒ๋ ๊ทธ์ ์์ํ๋ ์๋ต(Response)์ ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๊ฒ์ด์ฃ . ๊ฐ๋จํ ์๋ฅผ ๋ค์๋ฉด, ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ก ์๋ฒ์ ์นํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ์๋ฒ๋ ํด๋น ์นํ์ด์ง๋ฅผ ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์ ๋์ฐ๊ฒ ๋ฉ๋๋ค.
AWS๋ Amazon Web Services์ ์ฝ์ด๋ก, ์๋ง์กด์ ๊ณผ๊ธ ๋ฐฉ์์ ํตํด ํด๋ผ์ฐ๋ ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ์๋น์ค ์ค์, โํ๋ฆฌํฐ์ดโ๋ผ๊ณ ํด์ 1๋ ๊ฐ ๋งค์ 750์๊ฐ๊น์ง EC2 t2.micro ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์๋น์ค๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ธ์คํด์ค๋ ์๋ฒ๋ฅผ ๋งํ๋ฉฐ ํ๋ฌ ๋ด๋ด ์๋ฒ๋ฅผ ๋๋ ค๋ 750์๊ฐ์ด ๋์ง ์์ผ๋, ์ฌ์ค์ ๋ฌด๋ฃ๋ก ์๋น์ค๋ฅผ ์ด์ฉํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด์ฃ . AWS์ ๊ฐ์ ๋ง ํ๋ฉด ํ๋ฆฌํฐ์ด์ ๋์์ด ๋ฉ๋๋ค.
EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, Ubuntu, Red Hat, Amazon Linux ๋ฑ์ ์ ํ์ง ์ค์ ํ๋๋ฅผ ๊ณ ๋ฅด๊ฒ ๋๋๋ฐ ์ ํฌ ์์คํ ์๋ Amazon Linux๊ฐ ์ฌ์ฉ๋์์ต๋๋ค. ์ธ์คํด์ค์ ์์ธํ ์ฑ๋ฅ์ด๋ ์์ฑ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์๋ตํ๊ณ , ์ค์ํ๋ค๊ณ ์๊ฐ๋๋ โ๋ณด์๊ทธ๋ฃน ์ค์ โ๊ณผ โํค ํ์ดโ์ ๋ํด์๋ง ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ณด์๊ทธ๋ฃน ์ค์
๋จผ์ ๋ณด์ ๊ทธ๋ฃน(Security Group)์ ๊ฐ๋จํ๊ฒ ๋งํด์ ๋คํธ์ํฌ ์ ์ฑ ์ ๋ฐ๋ฅธ ๋ณด์์ ์ค์ ํด ์ฃผ๋ ๊ฐ๋ ์ ๋๋ค. ์ด๋ค ํํ์ ๋ฐ์ดํฐ๋ฅผ, ์ด๋ ๊ธธ์ ํตํด ๋ฐ์๋ค์ด๊ณ ๋ด๋ณด๋ผ ๊ฒ์ธ์ง์ ๋ํ ์ค์ ์ ํ๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.์์ ์ฌ์ง์ ์ ํฌ EC2 ์ธ์คํด์ค์ ๋ณด์ ๊ทธ๋ฃน ์ค์ ์ํ์ ๋๋ค. ๋งค ํญ๋ชฉ์ ์์ธํ ์ค๋ช ํ๊ธฐ์๋ ๋คํธ์ํฌ ๊ด๋ จ ์ง์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ ๋ถ๋ถ๋ง ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ๋จผ์ โ์์คโ ํญ๋ชฉ์ ์ด๋๋ก๋ถํฐ ์ค๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ ๊ฒ์ธ์ง๋ฅผ ์ ํฉ๋๋ค. ์ผ์ข ์ IP๋ฅผ ์ง์ ํด์ค ์ ์๋๋ฐ, ์ฌ์ง์ ํํ๋ Anywhere์ ์๋ฏธํ์ฌ ์ด๋ ๊ณณ์์ ์ค๋ ๋ฐ์ดํฐ์ธ์ง์ ์๊ด ์์ด ํ์ฉํ ์ ์์์ ๋ปํฉ๋๋ค. โํฌํธ ๋ฒ์โ๋ ์ผ์ข ์ ๋ฌธ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, SSH(Secure Shell, ๋คํธ์ํฌ ๋ณด์ ๋๊ตฌ ์ค ํ๋๋ก ์๊ฒฉ ์ ์์ ์์ ํ๊ฒ ํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋กํ ์ฝ) ์ ํ์ Putty ๋ฑ์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ ์ค ๊ณ์ด์ ์๋ฒ๋ฅผ ์๊ฒฉ ์ ์ดํ๊ธฐ ์ํด ํ์ํ ๋ฐฉ์์ธ๋ฐ, ํด๋น ์ ํ์ 22๋ฒ ํฌํธ๋ฅผ ํตํด์๋ง ์ ๊ทผํ ์ ์๋ ๊ฒ์ ๋๋ค. ์ด์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก, 80๋ฒ ํฌํธ์ 443๋ฒ ํฌํธ๋ ํด๋น ์ธ์คํด์ค๋ฅผ ์น ์๋ฒ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์, 22๋ฒ์ SSH์ฌ์ฉ์ ์ํด, 27017๋ฒ์ MongoDB ์ฌ์ฉ์ ์ํด, 3306๋ฒ์ MySQL ์ฌ์ฉ์ ์ํด, ๊ทธ๋ฆฌ๊ณ 3000๋ฒ์ ๋ค์ ์ค๋ช ํ Node.js ์๋ฒ ์ฌ์ฉ์ ์ํด ์ค์ ํ ๊ฒ์ ๋๋ค.
ํค ํ์ด
๋ค์์ผ๋ก ํค ํ์ด(Key pair)๋ Public Key์ Private Key์ ์์ ์๋ฏธํฉ๋๋ค. ์ด ๊ฐ๋ ๋ ๊น๊ฒ ๋ค์ด๊ฐ๋ฉด ํค ํ์ด์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์์ด 2048-bit SSH-2 RSA ๋ฐฉ์์ด๋ผ๋ ๋ฑ์ ์ ๋ฌธ์ง์์ด ํ์ํ๋ฏ๋ก, ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ EC2์์ ์ฌ์ฉํ๋ SSH ์ธ์ฆ ๋ฐฉ์์ ํตํด ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ผ๋จ, Public key๋ ์ํธํ์ ์ฌ์ฉ๋๋ฉฐ EC2 ์๋ฒ๊ฐ ๊ฐ์ง๊ณ ์๋ค๋ ์ ๊ณผ Private key๋ ๋ณตํธํ์ ์ฌ์ฉ๋๋ฉฐ ์ฌ์ฉ์(client)๊ฐ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์ ์ผ๋ํด์ฃผ์ธ์.
- Client๋ Server์ SSH ์ ์ ์์ฒญ์ ํ๋ค.
- Server๋ ์์์ ๊ฐ์ ์์ฑํ๊ณ Public Key๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฐ์ ์ํธํํ์ฌ Client์๊ฒ ๋ณด๋ธ๋ค.
- Client๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๊ฐ์ Private Key๋ก ๋ณตํธํ ํด์ ๋ค์ Server๋ก ๋ณด๋ธ๋ค.
- Server๋ Client๋ก๋ถํฐ ๋ฐ์ ๊ฐ๊ณผ ์ฒ์์ ์์์ ๊ฐ๊ณผ ๋น๊ตํด์ ์ผ์นํ๋ฉด ์ ์์ ํ์ฉํ๊ณ ํ๋ฆฌ๋ฉด ๋ถํํ๋ค.
์ด์ฒ๋ผ ๊ฐ์ ๋์กฐํ๋ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์ ์ํ์ค ์ ์ ์ต์ด์ Private Key๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๊ฒ ๋๋ฉด .pem ํ์์ ํ์ผ์ ์ป์ ์ ์๋๋ฐ, ์ด ํ์ผ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ๋ ์๊ณ puttygen๊ณผ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํด์ .ppk ํํ์ ํ์ผ์ ์ป์ด๋ด์ด ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- Node.js Server
์น ๊ฐ๋ฐ์ ์์ด์ ๋ถ์ผ๋ ํฌ๊ฒ ํ๋ก ํธ์๋(Front end)์ ๋ฐฑ์๋(Back end)๋ก ๋๋์ด ์ง๋๋ค. ํ๋ก ํธ์๋๋ ์ฃผ๋ก ํด๋ผ์ด์ธํธ ์ธก์์์ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๊ณ , ๋ฐฑ์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ์๋ฒ ์ธก์ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณธ๋ ํ๋ก ํธ์๋์์๋ง ์ฌ์ฉ๋๋ ์ธ์ด์ธ๋ฐ, ์ด ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก ํธ์๋ ๋ฟ๋ง ์๋๋ผ ๋ฐฑ์๋๋ฅผ ๊ฐ๋ฐํ ์ ์๊ฒ ํ ์ผ์ข ์ ๋๊ตฌ๊ฐ ๋ฐ๋ก ๋ ธ๋(Node.js) ์ ๋๋ค. ์ฆ, ๋ ธ๋๋ ํ๋์ ์ธ์ด๋ก ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ชจ๋ ๊ฐ๋ฐํ ์ ์๋ค๋ ํฐ ์ฅ์ ์ ์ง๋๋๋ค.
๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ชจ๋(๋๋ ํจํค์ง)๋ค์ ๋ด ์ฝ๋์ ์ ์ฉํ์ฌ ํด๋น ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. NPM(Node Packaged Manager) ํ๋ก๊ทธ๋จ์ ์ด์ฉํ๋ฉด ๋ชจ๋์ ์ค์น์ ๊ด๋ฆฌ๊ฐ ์ฌ์์ง๊ณ , ์ ๋ฐ์ดํธ ๊ด๋ฆฌ ์ญ์ ํ ์ ์์ต๋๋ค.
์ฐ์ , ๋ ธ๋ ์๋ฒ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ AWS EC2 ์ธ์คํด์ค์ ๋ ธ๋๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. ๋ฏธ๋ฆฌ ๋งํ์๋ฉด, ์ ํฌ ํ๋ก์ ํธ์์ ๋ ธ๋ ์๋ฒ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋๊ฐ์ ๋ํด์๋ ์ง๊ธ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ๋ ธ๋ ์๋ฒ์ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ธฐ์๋ ์ ๋ฅ๋ ฅ์ด ๋ชจ์๋ ๋ฟ๋ง ์๋๋ผ, ์ผ๋จ ๊ทธ ์์ด ๋๋ฌด ๋ฐฉ๋ํฉ๋๋ค. ๋ฐ๋ผ์, ํ์ํ๋ค๋ฉด ์ด ํ์ ์ ํฌ ํ๋ก์ ํธ์์ ๋ ธ๋ ์๋ฒ์ ์ญํ ์ด๋ ๋ฐ์ดํฐ์ ํ๋ฆ ์ ๋๋ง ๊ฐ๋จํ๊ฒ ์ธ๊ธํ๊ฒ ์ต๋๋ค.
๋ค์ ๋์์์, EC2 ์ธ์คํด์ค์ ๋ ธ๋๋ฅผ ์ค์นํ๊ธฐ ์ํด์๋ NVM(Node Version Manager)๋ฅผ ๋จผ์ ์ค์นํด์ผ ํฉ๋๋ค. SSH๋ฅผ ํตํด ์ธ์คํด์ค์ ์ ์ํ์ฌ NVM์ ์ค์นํฉ๋๋ค. NVM์ ๋ ธ๋์ ์ค์น๋ฅผ ๊ฐ๋จํ๊ฒ ํด์ค ๋ฟ๋ง ์๋๋ผ ์ดํ ๋ ธ๋ ๋ฒ์ ์ ๊ด๋ฆฌ์๋ ํฐ ๋์์ด ๋ฉ๋๋ค.
NVM์ ์ค์นํ๊ณ ๋ ํ์, โnvm install 8โ ๋ช ๋ น์ด๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ๋ ธ๋๋ฅผ ์ค์นํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ์์, ๋ ธ๋ ์๋ฒ์ ์ญํ ์ ํฌ๊ฒ 3๊ฐ์ง ์ ๋๋ค.
์ฒซ์งธ ์ญํ ์, ์์ฒญ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ผ์ฐํ (routing) ์ฒ๋ฆฌํ์ฌ ๋ถ๋ฅํ๊ณ , ๊ทธ์ ๋ง๋ ์๋ต์ ํฉ๋๋ค.
๊ฐ๋จํ ์ฝ๋๋ก ์๋ฅผ ๋ค์ด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
ํด๋ผ์ด์ธํธ์ธก
์๋ ์ฝ๋๋ ํด๋ผ์ด์ธํธ ์ธก์์ ์๋ฒ๋ก POST ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ฝ๋์ ๋๋ค. ๋นจ๊ฐ ๋ฐ์ค๋ฅผ ๋ณด์๋ฉด, ๊ฐ๋ ค์ง ๋ถ๋ถ์ ๋๋ฉ์ธ ์ฃผ์๋ก ๋ฐ์ดํฐ์ ๋ชฉ์ ์ง๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์๋ฒ์ ํฌํธ ๋ฒํธ๊ฐ 3000๋ฒ์์ ์๋ฏธํฉ๋๋ค. ์ด์ , ๊ทธ ๋ค์ process/addSubscription๋ฅผ ์ ๊ธฐ์ตํด ๋์๊ธธ ๋ฐ๋๋๋ค. ์ด ๋ถ๋ถ์ ํตํด์ ์๋ฒ์์ ๋ผ์ฐํ ์ด ์ด๋ฃจ์ด์ง๋๋ค.
์๋ฒ์ธก
์๋ ์ฌ์ง์ ์๋ฒ ์ธก์์, ๋ผ์ฐํ ์ ๋ถ๋ถ์ ๊ด๋ จ๋ ์ฝ๋ ์ค ์ผ๋ถ๋ฅผ ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค. ์ด๋ฒ์๋ ์ญ์ ๋นจ๊ฐ ๋ฐ์ค๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ app์ ๋ ธ๋ ์๋ฒ ์์ ์ ์๋ฏธํฉ๋๋ค. ์ ๋ค์ post๋ app์ post๋ฐฉ์์ผ๋ก ๋ค์ด์จ ๋ฐ์ดํฐ๋ค์ ๋ค๋ฃจ๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณด๋ฉด, ์์ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ๊ธฐ์ตํด ๋์๋ผ ํ ๋ถ๋ถ๊ณผ ์ผ์นํจ์ ์ ์ ์์ต๋๋ค. ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋ฉด ์คํ๋ ํจ์๋ฅผ ๋งํฉ๋๋ค. ์ฌ๊ธฐ๊น์ง ์ ๋ฆฌํ๋ฉด, ์๋์ ์ฝ๋๋ ๋ ธ๋ ์๋ฒ์ post๋ฐฉ์์ผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ ์ค์ /process/addSubscription์ ๊ผฌ๋ฆฌํ๋ฅผ ๊ฐ์ง ๊ฒ์ด ์๋ค๋ฉด user.addSubscription ํจ์๋ฅผ ์คํํ๋ผ๋ ๊ฒ์ด ๋ฉ๋๋ค. ์ด์ ์ ์ฌํ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ค๋ ๋ผ์ฐํ ์ฒ๋ฆฌํ์ฌ ์ ์ ํ ํจ์๋ฅผ ์คํํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๋์งธ ์ญํ ์, ์ธ์คํด์ค์ ์ค์น๋ DB์ ์ฐ๋ํ์ฌ ๊ด๋ จ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ ธ๋๋ MongoDB๋ MySQL ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋๋์ด ์ฌ์ฉ๋ ์ ์์ต๋๋ค. NPM์ ํตํด ์ ํฉํ ๋ชจ๋์ ๋ค์ด๋ฐ์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค. ์ ํฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ์๋ MongoDB๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
MongoDB๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ NoSQL(Not Only SQL) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. ๋ฐ์ดํฐ์ ๊ตฌ์ฑ์ ์ด 3๊ฐ์ง๋ก, database, collection, document์ ๋๋ค. Database๋ ๋ง ๊ทธ๋๋ก ์ต์์์ธต์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋ฏธํฉ๋๋ค. Collection์ document์ ์ปจํ ์ด๋ ๊ฐ๋ ์ผ๋ก table๊ณผ ์ ์ฌํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก document์๋ JSON(JavaScript Object Notation)์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
MongoDB์ ์ฅ์
-Schema-less ๊ตฌ์กฐ : ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ฐํ ๋ณํ๊ฐ ๊ฐ๋ฅ
-๋น ๋ฅธ ์๋์ Read/Write ๊ฐ๋ฅ
-Scale Out ๊ตฌ์กฐ : ๋น ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฉ์ด
-JSON ๊ตฌ์กฐ : ๋ฐ์ดํฐ์ ์ง๊ด์ ์ดํด ๊ฐ๋ฅ
-์ฌ์ด ์ฌ์ฉ๋ฒ์ผ๋ก ๊ฐ๋ฐ์ ํธ๋ฆฌMongoDB์ ๋จ์
-๋ถ์์ ์ฑ๊ณผ ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ : ๋ฐ์ดํฐ ๊ฐฑ์ ์ ๋ฐ๋ก ๋์คํฌ์ ์ ๋ ฅํ์ง ์์
-JOIN์ด๋ ํธ๋์ญ์ ์ฒ๋ฆฌ์ ์ทจ์ฝ : ์ฑ๋ฅ ์ ์ฝ
-์ธ๋ฑ์ค๋ฅผ ๋ง์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉ์๋์ ์ฌ์ง์ โDo it! Node.js ํ๋ก๊ทธ๋๋ฐโ ์ฑ ์์ ์ ๊ณตํ ์์ค ์ฝ๋ ์ค ์ผ๋ถ๋ฅผ ์ฐธ๊ณ ์ฉ์ผ๋ก ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค. ์ดํด๋ณด๋ฉด, ๋จผ์ mongoose ๋ชจ๋์ requireํจ์๋ฅผ ํตํด ๊ฐ์ ธ์์ mongoose ๊ฐ์ฒด์ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด mongoose ๊ฐ์ฒด๋ connect ํจ์๋ฅผ ํตํด ๋ก์ปฌ ํธ์คํธ์ DB์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ DB๋ฅผ database ๊ฐ์ฒด์ ํ ๋นํ์ฌ ์ฌ์ฉํฉ๋๋ค. ์ค๊ฐ ๋ถ๋ถ์ ์คํค๋ง์ ๋ํด ์ ์ํ๋ ๋ถ๋ถ๊ณผ ๊ทธ ์๋์ ๋ชจ๋ธ์ ์ ์ํ๋ ๋ถ๋ถ์ด ํ์ํ ์ด์ ๋ ์์ ๋งํ๋ฏ์ด MongoDB๊ฐ Schema-less ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ์งธ ์ญํ ์, ํด๋ผ์ด์ธํธ์ ์น ๋ธ๋ผ์ฐ์ (๋จ๋ง๊ธฐ)๋ก ํธ์ ์๋ฆผ์ ๋ณด๋ ๋๋ค.
์๋ ์ฝ๋๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ web push ๊ด๋ จ๋ ์๋ฒ ์ธก ์ฝ๋ ์ค ์ผ๋ถ์ ๋๋ค. ์๋ ์ชฝ์ webPush.sendNotification ํจ์๋ ํน์ ํด๋ผ์ด์ธํธ์ ์น ๋ธ๋ผ์ฐ์ (๋จ๋ง๊ธฐ)์ ํธ์ ์๋ฆผ์ ๋ณด๋ด๋ ์ญํ ์ ํฉ๋๋ค. ์ด ๋ ํจ์์ ์ ๋ฌ๋๋ ๊ฒ์ ๋ณด์๋ ๋ฐ์ ๊ฐ์ด pushSubscription, payload, options์ด์ฃ . ๋จผ์ pushSubscription์ push ์๋ฆผ์ ๋ฐ์ ์๋์ ๊ตฌ๋ (Subscription) ๊ฐ์ฒด ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฌ์ง ์์๋ ๋์์์ง ์์ง๋ง DB์์ ํ์ํ ๊ตฌ๋ ๊ฐ์ฒด ๊ฐ์ ์ฝ์ด์์ pushSubscription ๊ฐ์ฒด์ ํ ๋นํ๋๋ก ์ฝ๋ฉํ์์ต๋๋ค. ์ฐธ๊ณ ๋ก, ๊ตฌ๋ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ํน์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์ด์ธ์๋ ์ฌ์ง๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก payload ๋ฐ options ๋ ํจ์์ ์ ๋ฌํ ์ ์์ต๋๋ค.
- HTTPS ์ฌ์ฉ์ ์ํ Letsencrypt CA ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ๊ธฐ
HTTPS๋?
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)๋ HTTP ํ๋กํ ์ฝ์์ ๋ณด์์ ๊ฐ๋ ์ด ์ถ๊ฐ๋ ํ๋กํ ์ฝ์ ๋๋ค. ์๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ์ฌ์ด์ ๊ตํ๋๋ ์ ๋ณด๋ฅผ ์ํธํํจ์ผ๋ก์จ, ๋๊ตฐ๊ฐ ๊ณ ์๋ก ๋คํธ์ํฌ ์์ ์ค๊ฐ๋ ์ ๋ณด๋ฅผ ๋นผ๋ด๋๋ผ๋ HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์ํธํ๋์ด ์๋ ์ ๋ณด๋ ํด์ํ ์ ์์ต๋๋ค. HTTPS์ ์ฌ์ฉ์ผ๋ก, ๋น์ํธํ๋ก ์ผ๊ธฐ๋๋ ๋ณด์ ์ด์๋ ๋ง์ด ๊ฐ์ํ์์ต๋๋ค.
Letโs Encrypt CA ์ธ์ฆ์
HTTPS๋ฅผ ์น ์ฌ์ดํธ์ ์ ์ฉํ๊ธฐ ์ํด์๋ CA (Certificate Authority)์์ ์ธ์ฆ์๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค. ๊ณต์ธ/์ฌ์ค ์ธ์ฆ๊ธฐ๊ด์ ํตํด ์ธ์ฆ์๋ฅผ ๊ตฌ๋งคํ ์ ์์ต๋๋ค. ๊ตฌ๋งค๋น์ฉ์ด ๊ทธ๋ฆฌ ์ ๋ ดํ์ง๋ ์์๋ฐ, ISRG(Internet Security Research Group)์์ ๋ง๋ Letโs Encrypt๋ผ๋ ์ธ์ฆ ๊ธฐ๊ด์ ์ด์ฉํ๋ฉด ๋ฌด๋ฃ๋ก ์ธ์ฆ์๋ฅผ ์ทจ๋ํ๊ณ ๊ฐฑ์ ํ ์ ์์ต๋๋ค.
์ธ์ฆ์๋ฅผ ์ทจ๋ํ๋ ์์ธํ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค. ๋ค๋ง, Certbot ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ๋ฉด EC2 ์ธ์คํด์ค์ ์ฝ๊ฒ Letโs encrypt ์ธ์ฆ์๋ฅผ ์ค์นํ ์ ์๊ณ ๊ฐฑ์ ๋ ํ ์ ์์ต๋๋ค. ๋ํ, ๋๋ฉ์ธ ์ฃผ์๊ฐ ํ์ํ๋ฏ๋ก ๋ฏธ๋ฆฌ ๊ตฌ๋งคํด ๋๊ธฐ๋ฅผ ์ถ์ฒํฉ๋๋ค. ์ ์์ ์ผ๋ก ๋ชจ๋ ๊ณผ์ ์ ๋ง์น๊ณ ๋๋ฉด, ์๋์ฒ๋ผ ์ด๋ก์ ์๋ฌผ์ ์ ํจ๊ป https๋ก ์น ์ฌ์ดํธ์ ์ ์ํ ์ ์๊ฒ ๋ฉ๋๋ค.
- Notification API & Push API
ํธ์ ์๋ฆผ ์๋น์ค๋ Notification API์ Push API ์ด ๋ ๊ฐ์ง API ๊ตฌ์ฑ์ผ๋ก ๋์ํฉ๋๋ค. ์ด ๋ API๋ ๋ชจ๋ ๋ฐฑ๋ผ์ด๋์์ ํธ์ ๋ฉ์ธ์ง ์ด๋ฒคํธ์ ์๋ตํ๊ณ ์ด๋ฅผ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๋ Service Worker API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ฉ๋๋ค.
Notification API
Notification API๋ ๋จ๋ง๊ธฐ์ ์๋ฆผ์ ๋์ฐ๋ ์ญํ ์ ํฉ๋๋ค. ๋ฌผ๋ก ์๋ฆผ์ ๋์ฐ๊ธฐ ์ํด์๋ ์ฌ์ ์ ์ฌ์ฉ์์ ํ๊ฐ๊ฐ ํ์ํฉ๋๋ค.ํ๊ฐ ์์ฒญ
์๋๋ requestPermission ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉ์์๊ฒ ์๋ฆผ ํ์ฉ ํ์ ์ฐฝ์ ๋์ฐ๋ ์ฝ๋์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ์ ์ ์ํ๋ฉด ์น ๋ธ๋ผ์ฐ์ ๋ ํ์ ์ฐฝ์ ๋์ฐ๊ณ , ์ฌ์ฉ์์ ์๋ต์ด ์น ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์๋ฆผ์ ํ์ฉํ ์ํ์์๋ง ์๋ฆผ์ ํ์ํ ์ ์์ต๋๋ค.
์๋ฆผ ํ์
์๋๋ showNotification ํจ์๋ฅผ ํธ์ถํ์ฌ ๋จ๋ง๊ธฐ์ ์๋ฆผ์ ํธ์ถํ๋ ์ฝ๋์ ๋๋ค. ํธ์ถ๋๋ ์๋ฆผ์ ๋ํด ์ต์ ์ ์ค์ ํ ์ ๋ ์๊ณ , Interaction API๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉํ๋ฉด Service Worker์ ์ํธ์์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์๋ฆผ์ ๋ณธ ํ์ ์ทจํ๋ ํ๋์ ๋ฐ๋ฅธ action ์ฒ๋ฆฌ๋ ํ ์ ์์ต๋๋ค.
์๋ ์ฝ๋๋ ์ฌ์ฉ์๊ฐ ์๋ฆผ์ ํด๋ฆญํ์์ ๋, ์๋น์ค์์ปค๊ฐ ํด๋ฆญ ์ด๋ฒคํธ์ ๋ฐ์ํ์ฌ ๋์ํ๋ ์ฝ๋์ ๋๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํด๋ฆญํ action์ ๋ฐ๋ผ ์๋ฆผ์ ๋ ์ ๋ ์๊ณ ํน์ ํน์ ์น ์ฌ์ดํธ๋ก ์ด๋ํ ์ ๋ ์์ต๋๋ค.
Push API
์น ํ์ด์ง๊ฐ ์ด๋ ค ์์ง ์์ ๊ฒฝ์ฐ์, ์ฌ์ฉ์์ ๋จ๋ง๊ธฐ์ ์๋ฆผ์ ๋์ฐ๊ธฐ ์ํด์๋ Push API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Push API๊ฐ ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์ ํธ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด, Service Worker๊ฐ ๊ทธ ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ๊ทธ ๋ค์ Notification API๋ ์๋ฆผ์ ํ๋ฉด์ ๋์ฐ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.๊ตฌ๋ ๊ฐ์ฒด
Push API๊ฐ ํน์ ์น ๋ธ๋ผ์ฐ์ ์๊ฒ ํธ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ ์ํด์๋ ๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ์ด๋ค ๊ฒ์ด ํ์ํฉ๋๋ค. ์ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ตฌ๋ (Subscription) ๊ฐ์ฒด์ ๋๋ค. ์์, Notification API์์ ์ฌ์ฉ์๊ฐ ์๋ฆผ์ ํ์ฉํ๋ฉด, ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ ์์ฒด์ ์ธ ํธ์ ์๋น์ค์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฑ๋ก๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ด์ ์ฌ์ฉ์ ์น ๋ธ๋ผ์ฐ์ ์ endpoint URL๊ณผ public key๊ฐ ํฌํจ๋ ํน์ํ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋๋ฐ, ์ด๊ฒ์ด ๊ณง ๊ตฌ๋ ๊ฐ์ฒด์ด๋ฉฐ ์๋์ ํํ์ ๊ฐ์ต๋๋ค.
ํธ์ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ฌ์ฉ์๋ public key๋ก ์ํธํ๋ endpoint URL์ ๋ณด๊ณ ์ ์ ์์ต๋๋ค. ์ด endpoint URL์ ์๋ ์๋ณ์๋ ์ํธํ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ด๋ ์ดํดํ ์๊ฐ ์์ผ๋ฉฐ, ๊ณ ์ ์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ์ 3์๊ฐ ์ฌ์ฉ์๋ฅผ ์ถ์ ํ ์๋ ์์ต๋๋ค. ์ ์ด์ Service Worker์ ํจ๊ป ๋์ํ๊ธฐ ๋๋ฌธ์ HTTPS ์ฌ์ฉํ๋ ์น ์ฌ์ดํธ์์๋ง ๋์์ด ๊ฐ๋ฅํ๊ณ , ๋ฐ๋ผ์ ์๋ฒ์ ํธ์ ์๋น์ค ๊ฐ์ ํต์ ์ฑ๋๊ณผ ํธ์ ์๋น์ค์ ์ฌ์ฉ์ ๊ฐ์ ํต์ ์ฑ๋์ ์์ ํฉ๋๋ค.
์๋ฒ๋ก๋ถํฐ ํธ์ ๋ฉ์์ง๋ฅผ ๋ฐ๊ฒ ๋๋ฉด, ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์ํ๋ ์๋น์ค ์์ปค๋ ์ด์ ๋ฐ์ํ์ฌ ๋์ํฉ๋๋ค. ์๋๋ push ์ด๋ฒคํธ์ ๋ฐ์ํ์ฌ ๋์ํ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ฝ๋์ ๋๋ค. ์๋น์ค ์์ปค๊ฐ push ์ด๋ฒคํธ๋ฅผ ์ธ์ํ๋ฉด, showNotification ํจ์๊ฐ ๋์ํ์ฌ ์๋ฆผ์ ํ๋ฉด์ ๋์๋๋ค.
ํธ์ ์๋น์ค ํ๋ก์ธ์ค
๊ฒฐ๊ตญ, ์๋น์ค ์์ปค์ Notification API, ๊ทธ๋ฆฌ๊ณ Push API๋ฅผ ์ด์ฉํ ํธ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ๋ฐ๊ณ ์๋ฆผ์ ํ์ํ๋ ํ๋ก์ธ์ค๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
์ฒญ๊ฐ์ฅ์ ์ธ๋ถ๋ค์ ์ง๋๋ฒจ์ด ์๋ ์นดํ์์ ์๋ฃ์ ์กฐ ์๋ฃ์๋ฆผ์ ๋ฐ๋๋ฐ ๋ถํธํจ์ ๋๋ผ์ญ๋๋ค. ์ ํฌ๋ ์ฑ ์ค์น๋ ๋ฌธ์๋ฉ์ธ์ง ๋ฑ ์ง๋๋ฒจ์ ๋์ฒดํ๋ ๊ธฐ์กด์ ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ, ์ค๋งํธํฐ์ ํตํด ๊ฐํธํ๊ฒ ์๋ฃ์ ์กฐ์๋ฃ๋ฅผ push ์๋ฆผ์ผ๋ก ๋ฐ์ ์ ์๋๋ก PWAํ์์ ์์คํ ์ ๊ฐ๋ฐํ์์ต๋๋ค.
์นดํ์ ์ฅ)
- ์ง๋๋ฒจ ๊ด๋ฆฌ(๋ถ์ค, ๊ณ ์ฅ, ์ฒญ๊ฒฐ์ํ ๋ฑ)์ ๋ํ ๋ถ๋๋น์ฉ์ ๊ณ ๋ คํ์ง ์์๋ ๋ฉ๋๋ค.
์ ์์ ์ฅ)
- ์๋์ด ์ฃผ๋ฌธ์ ํ ํ nfcํ๊น ์ ํตํด ์๋ฃ์ ์ ์๋ฃ์๋ฆผ์ ๋ฐ์ ์ ์๋๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ์์ด ์ฃผ๋ฌธ์ ๋ฐ์ผ๋ฉด์ ์ง๋๋ฒจ์ ์ ๋ ฅํ๊ณ ์๋ฃ์ ์์ด ์๋ฃ๋์์ ๋ ๊ทธ์ ๋ง๋ ์ง๋๋ฒจ ๋ฒํธ๋ฅผ ํธ์ถํ๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ผ ์ ์์ต๋๋ค.
์๋์ ์ฅ)
- ์น์ฃผ์๋ง์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ๋๋ฌธ์ ์ ๊ทผ์ฑ์ด ์ฉ์ดํ๊ณ ํธ๋ฆฌํ ๊ฒ์ ๋๋ค.
- ์ฑ์ ์ค์นํ ํ์๊ฐ ์๊ณ , ๋จ๋ง๊ธฐ์ ์ ์ฅ๊ณต๊ฐ์ ๊ฑฐ์ ์ฐจ์ง ์๊ธฐ๋๋ฌธ์ ๋ถ๋ด์ด ์ ์ ๊ฒ์ ๋๋ค.
-
์์ดํฐ ์ฌ์ฉ์๋ ์ด์ฉํ ์ ์๋ค.
- ios๊ฐ ๊ฐ๋ฐํ ์น๋ธ๋ผ์ฐ์ ์ธ safari์์๋ PWA๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ๋ํ ์์ดํฐ์ ํฌ๋กฌ ์ฑ์ด ์ค์น๋์ด ์๋๋ผ๋ PWA์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์๋ํ์ง ์์ต๋๋ค.
-
ํน์ ์น๋ธ๋ผ์ฐ์ ๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- ๋ธ๋ผ์ฐ์ ๋ณ๋ก ์ง์๋๋ PWA๊ด๋ จ ์๋น์ค๊ฐ ๋ค๋ฆ ๋๋ค. ๋ํ ๋์ผํ ๋ธ๋ผ์ฐ์ ๋ผ๋ ์ค์น๋ ๋ฒ์ ์ ๋ฐ๋ผ์ ์๋น์ค๊ฐ ์ง์๋์ง ์์ ์ ์์ต๋๋ค.
- ์ ํฌ ์์คํ ์ ํฌ๋กฌ ์น๋ธ๋ผ์ฐ์ ๋ฒ์ 50์ด์์ ์ถ์ฒ๋๋ฆฌ๋ฉฐ ๊ทธ ์ดํ์ ๋ฒ์ ์์ ์์คํ ์ด ์ ๋์ํ์ง ์์ ์ ์์ต๋๋ค.
-
์ค๋งํธํฐ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋์ฒดํ ๋งํ ์ฅ์น๊ฐ ํ์ํ๋ค.
- ์์ฆ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ค๋งํธํฐ์ ์ฌ์ฉํ์ง๋ง ์นดํ๋ฅผ ์ด์ฉํ๋ ๋ชจ๋ ์๋๋ค์ด ์ค๋งํธ ํฐ์ ์ด์ฉํ๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๋งํธํฐ์ ์ฌ์ฉํ์ง ์์๋ ์น๋ธ๋ผ์ฐ์ ๊ฐ ์ค์น๋ ์ฅ์น(์: ๋ ธํธ๋ถ)์ url์ ์ ๋ ฅํ๋ฉด ์ด์ฉํ ์ ์์ต๋๋ค.
-
์ ํ์ ๊ธ์ ์ ์ธ ๊ฒํ
- Apple์ ์ฌ์ ํ PWA๋ฅผ ์ง์ํ์ง ์์ง๋ง WebKit์์ service worker API๋ฅผ ๊ฐ๋ฐ์ค์ ๋๋ค. ๋ฐ๋ผ์ ์ธ์ ๊ฐ Apple๋ ์ผ์ข ์ PWA์ ๊ฐ์ ํํ๋ฅผ ์ง์ํ ์ ๋ง์ด ๋ณด์ ๋๋ค.
- ์ฐธ๊ณ ์ฌ์ดํธ https://webkit.org/status/
-
์คํ๋ผ์ธ ๋ก๋ฉ๊ฐ๋ฅ ํ์ฉ
- PWA๋ ์จ๋ผ์ธ์์ ํ๋ฒ๋ง ๋ก๋ฉํ๋ฉด ์คํ๋ผ์ธ ์ํ์ผ๋๋ ๋ก๋ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฐ ์ ์ ์ด์ฉํ์ฌ ์นดํ์ธก์์ ๋ฉ๋ดํ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค๋ฉด ์นดํ๋ฅผ ๋ฐฉ๋ฌธํ์ง ์๊ณ ๋ ๋ฉ๋ด์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ ๊ฒ์ ๋๋ค.
-
๊ฒฐ์ ๋ชจ๋ ์ ์ฉ
- 2๋ฒ์์ ์๊ฐํ ๋ฉ๋ดํ ํ์ด์ง๊ฐ ๊ฐ๋ฐ๋์๋ค๋ฉด ๋ ๋์๊ฐ ๊ฒฐ์ ์์คํ ์ ์ ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ค๋ฉด ์๋๋ค์ด ์นดํ์ ์ง์ ์์ ์ด๋ค ๋ฉ๋ด๊ฐ ์๋์ง ํ์ธํ๊ณ ๋ญ ๋จน์์ง ๊ฒฐ์ ํ์ฌ ์ฃผ๋ฌธ์ ์๋ฃํ๊ธฐ๊น์ง์ ์๊ฐ์ ์ ์ฝํ๋๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
-
์ ๋ฐ์ดํธ ์ ์ค์น ํ์ X
- ์๋น์ค ์ ๊ณต์๊ฐ ๊ธฐ๋ฅ ๋ฐ ๋ณด์ ์ ๋ฐ์ดํธ๋ฅผ ํ์ ์ ๋ชจ๋ ์ฌ์ฉ์๋ค์ด ์จ๋ผ์ธ ์ํ์์ ๋ค์ ๋ก๋๋ง ํด์ฃผ๋ฉด ์ต์ ์ํ๋ก ์ ์งํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ฒด ์ฌ์ฉ์์๊ฒ ์ต์ ํ๋ ์ฌ์ฉ์ํ๊ฒฝ์ ์ง์์ ์ผ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค.


