Skip to content

ChungUlLim_ProjectBlog

sowjd edited this page Nov 5, 2017 · 45 revisions

์•ฑ ์„ค์น˜ ์—†์ด๋„ PUSH ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค9?!

| ์ง„๋™๋ฒจ์ด ํ•„์š” ์—†๋Š” ์นดํŽ˜ ์ฃผ๋ฌธ ์™„๋ฃŒ ์•Œ๋ฆผ ์‹œ์Šคํ…œ

By ์ฒญ์šธ๋ฆผ ํŒ€ | ๊น€์‘์ค€, ๊ถŒ์†Œ์˜, ์‹ฌ์†Œ์ •

๋ชฉ์ฐจ

  1. ์„œ๋ก  | ์ฒญ๊ฐ์žฅ์• ์ธ ๋ถ„๋“ค์ด ๊ฒช๋Š” ์นดํŽ˜ ์ด์šฉ์˜ ์–ด๋ ค์›€
  2. ๋ณธ๋ก  | ํ•ด๊ฒฐ์˜ ์‹ค๋งˆ๋ฆฌ
    1) PWA๋ž€?
    2) PWA๋ฅผ ์ด์šฉํ•œ ์นดํŽ˜ ์ฃผ๋ฌธ์™„๋ฃŒ ์‹œ์Šคํ…œ
    3) ์‹œ์Šคํ…œ ๋ฐฐ๊ฒฝ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ 
    • AWS EC2 Amazon Linux ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
    • Node.js Server
    • HTTPS ์‚ฌ์šฉ์„ ์œ„ํ•œ Let's encrypt CA ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๋ฐ›๊ธฐ
    • Notification API & Push API
  3. ๊ฒฐ๋ก  | ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ•œ๊ณ„
    1) ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ
    2) ํ”„๋กœ์ ํŠธ ์š”์•ฝ ์ •๋ฆฌ
    3) ๊ธฐ๋Œ€๋˜๋Š” ํšจ๊ณผ
    4) ํ•œ๊ณ„
    5) ํ™•์žฅ๊ฐ€๋Šฅ์„ฑ

[ 1.์„œ๋ก  | ์ฒญ๊ฐ์žฅ์• ์ธ ๋ถ„๋“ค์ด ๊ฒช๋Š” ์นดํŽ˜ ์ด์šฉ์˜ ์–ด๋ ค์›€ ]

์ฒญ๊ฐ์žฅ์• ์ธ๋ถ„๋“ค์ด ์นดํŽ˜๋ฅผ ์ด์šฉํ•  ๋•Œ ๊ฐ€์žฅ ๋ถˆํŽธํ–ˆ๋˜ ์ ์ด ๋ฌด์—‡์ผ๊นŒ์š”?
์œ„์˜ ํ‘œ๋ฅผ ๋ณด์•„, ์ฒญ๊ฐ์žฅ์• ์ธ๋ถ„๋“ค์€ ์นดํŽ˜์—์„œ ์ปคํ”ผ ์ œ์กฐ ์™„๋ฃŒ์‹œ ์ง์›์ด ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ๋“ฃ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋ถˆํŽธํ•˜๋‹ค๊ณ  ํ•˜์…จ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด โ€˜์ง„๋™๋ฒจ์„ ๊ตฌ๋น„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€ ์•Š๋А๋ƒ!โ€™ ๋ผ๋Š” ์˜๋ฌธ์ด ๋“คํ…๋ฐ์š”.

ํ•˜์ง€๋งŒ ์ง„๋™๋ฒจ์˜ ๋‹จ๊ฐ€๋Š”

๊ฐœ๋‹น 6~9๋งŒ์›์˜ ๋น„์šฉ์ด๋“ ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊นœ๋นก ์žŠ๊ณ  ์ง„๋™๋ฒจ์„ ๋“ค๊ณ  ๊ฐ€์‹œ๋Š” ๋ถ„๋“ค๋„ ๋งŽ์œผ์…”์„œ ๋ถ„์‹ค์˜ ์šฐ๋ ค๋„ ๋˜ํ•œ ๋†’๋‹ค๊ณ  ํ•˜๋Š”๋ฐ์š”.

๊ทธ๋ฆฌํ•˜์—ฌ ๋จผ์ € โ€˜์ง„๋™๋ฒจ์„ ๋Œ€์ฒดํ•˜์—ฌ ๋ฌด์—‡์„ ์ง€๊ธˆ์€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๊ฐ€?โ€™ํ•˜๊ณ  ์กฐ์‚ฌ๋ฅผ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ๋กœ ํ•œ ๋Œ€ํ˜• ํ”„๋žœ์ฐจ์ด์ฆˆ ์นดํŽ˜ ๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋žœ์ฐจ์ด์ฆˆ ์นดํŽ˜๋Š” ํ•ด๋‹น ์นดํŽ˜์˜ ์•ฑ์„ ๋‹ค์šด ๋ฐ›์•„ ํœด๋Œ€ํฐ ๋‹จ๋ง๊ธฐ๋กœ ์ฃผ๋ฌธ ์™„๋ฃŒ ์•Œ๋ฆผ์„ ์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํœด๋Œ€ํฐ์œผ๋กœ ์•Œ๋ฆผ์„ ๋ฐ›๊ธฐ๋•Œ๋ฌธ์— ์ง„๋™๋ฒจ์ด ํ•„์š” ์—†๋Š” ์ข‹์€ ๋Œ€์ฒด ๋ฐฉ์•ˆ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ์š”. ์‚ฌ์‹ค ์•ฑ ์„œ๋น„์Šค๊ฐ€ ์ง„๋™๋ฒจ์„ ๋Œ€์‹ ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์œ  1. ๋ชจ๋“  ์นดํŽ˜๊ฐ€ ์•ฑ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋Š” ์—†๋‹ค.
๋ชจ๋“  ์นดํŽ˜๊ฐ€ ์•ฑ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์†Œ๊ทœ๋ชจ์˜ ์นดํŽ˜์˜ ๊ฒฝ์šฐ ๊ฐ ๊ฐœ์ธ ์นดํŽ˜์˜ ์•ฑ์„ ์ œ์ž‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์นดํŽ˜๋งˆ๋‹ค ์•ฑ์„ ๋ชจ๋‘ ์ œ์ž‘ํ•˜๊ธฐ์—๋Š” ๋งŽ์€ ์–ด๋ ค์›€์ด ์žˆ๊ฒ ์ฃ ?
์ด์œ  2. ๋ชจ๋“  ์†๋‹˜์ด ์•ฑ์„ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
์•ฑ์„ ๋‹ค์šด๋ฐ›์•„์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€๊ณผ ์•Œ๋ฆผ์„œ๋น„์Šค์˜ ํ•„์š”์„ฑ์„ ๋А๋ผ์ง€ ๋ชปํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๋“ค๋กœ ์†๋‹˜๋“ค์€ ์•ฑ์„ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ• ์ธ์ด๋‚˜ ํฌ์ธํŠธ์ ๋ฆฝ ๋“ฑ์˜ ํ˜œํƒ์„ ์œ„ํ•ด ์•ฑ์„ ๋‹ค์šด๋ฐ›์•„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทธ๋‹ค์ง€ ํ•„์š”์„ฑ์„ ๋А๋ผ์ง€ ๋ชปํ•˜๋Š” ์†๋‹˜๋“ค์€ ์•ฑ์„ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ์†๋‹˜์ด ์•ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€ํ˜• ํ”„๋žœ์ฐจ์ด์ฆˆ ์นดํŽ˜๋„ ์ด ์‚ฌ์‹ค์„ ์ธ์ง€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์žฅ ๋‚ด์—์„œ๋Š” ์—ฌ์ „ํžˆ ์ง„๋™๋ฒจ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ๋กœ ๋ฌธ์ž๋ฉ”์‹œ์ง€๋กœ ์Œ๋ฃŒ ์ œ์ž‘ ์™„๋ฃŒ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์‹œ์Šคํ…œ์„ ์˜ˆ๋กœ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์นดํŽ˜๋Š” ์•ฑ์ด ์•„๋‹Œ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์Œ๋ฃŒ ์ œ์กฐ ์™„๋ฃŒ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ์ธ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์นดํŽ˜์ธก์— ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€, ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ ์šฐ๋ ค๋„๊ฐ€ ๋†’์€ ์š”์ฆ˜ ์†๋‹˜๋“ค์ด ๋‹ฌ๊ฐ€์›Œํ•˜์ง€๋Š” ์•Š๊ฒ ์ฃ ?

์ฒญ๊ฐ์žฅ์• ์ธ ๋ถ„๋“ค๊ป˜์„œ ๊ฒช๊ณ ์žˆ๋Š” ์–ด๋ ค์›€(์ปคํ”ผ ์ œ์กฐ ์™„๋ฃŒ์‹œ ์ง์›์ด ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ๋“ฃ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ), ์•ฑ ์„ค์น˜์˜ ๋ฒˆ๊ฑฐ๋กœ์›€, ๊ฐœ์ธ์ •๋ณด์œ ์ถœ ๋“ฑ์˜ ๋ฌธ์ œ๋“ค๋กœ๋ถ€ํ„ฐ ์ €ํฌํŒ€์€ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์ง€๋‹ˆ๊ณ  ๋‹ค๋‹ˆ๋Š” ํœด๋Œ€ํฐ ๋‹จ๋ง๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์•ฑ์ด ์•„๋‹Œ ์›น์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌ๋ฅผ ํ•˜๋˜ ๋„์ค‘ ์›น์œผ๋กœ ํœด๋Œ€ํฐ ๋‹จ๋ง๊ธฐ๋กœ ์•Œ๋ฆผ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” PWA๋ผ๋Š” ๊ฐœ๋…์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.


[ 2.๋ณธ๋ก  | ํ•ด๊ฒฐ์˜ ์‹ค๋งˆ๋ฆฌ ]

1) PWA(Progressive Web Apps)๋ž€?

๊ตฌ๊ธ€ ํฌ๋กฌ ์—”์ง€๋‹ˆ์–ด ์•Œ๋ ‰์Šค ๋Ÿฌ์…€์ด 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'); }); }

2) PWA๋ฅผ ์ด์šฉํ•œ ์นดํŽ˜ ์ฃผ๋ฌธ ์™„๋ฃŒ ์‹œ์Šคํ…œ

์‹œ๋‚˜๋ฆฌ์˜ค

์†๋‹˜์ด ์นดํŽ˜ ์ ์›์—๊ฒŒ ์ฃผ๋ฌธ์„ ํ•œ ํ›„ nfcํƒœํฌ์— ํƒœ๊น…์„ ํ•ฉ๋‹ˆ๋‹ค. ์›นํŽ˜์ด์ง€ ์ ‘์†๊ณผ ๋™์‹œ์— ์†๋‹˜์˜ ๋‹จ๋ง์ •๋ณด๋Š” ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์Œ๋ฃŒ์ œ์ž‘์ด ์™„๋ฃŒ๋˜๋ฉด ์†๋‹˜์˜ ๋‹จ๋ง๊ธฐ๋กœ push์•Œ๋ฆผ์ด ๋ณด๋‚ด์–ด์ง‘๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„

Client ๋‹จ๋ง๊ธฐ(์†๋‹˜)๋Š” nfcํƒœ๊น…์„ ํ†ตํ•ด ์›น๋ธŒ๋ผ์šฐ์ €์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.(1) ์›น๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์˜ ์›นํŽ˜์ด์ง€data๋ฅผ ์ฝ์–ด Client ๋‹จ๋ง๊ธฐ์˜ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด ์ค๋‹ˆ๋‹ค.(2, 3) ์ด๋•Œ ์›น๋ธŒ๋ผ์šฐ์ €์— ์„œ๋น„์Šค ์›Œ์ปค๊ฐ€ ๋“ฑ๋ก๋˜๊ณ (4) ์†๋‹˜์ด ์›นํŽ˜์ด์ง€์˜ ํ‘ธ์‹œ์•Œ๋ฆผํ—ˆ์šฉ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ตฌ๋…๊ฐ์ฒด(ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด)๊ฐ€ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.(5)

Manager ๋‹จ๋ง๊ธฐ(์นดํŽ˜์ ์›)๋„ (5)๊นŒ์ง€ Client ๋‹จ๋ง๊ธฐ์™€ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. Manager ๋‹จ๋ง๊ธฐ์—์„œ Client ๋‹จ๋ง๊ธฐ์—๊ฒŒ push์•Œ๋ฆผ์„ ๋ณด๋‚ด๋ฉด(6) ๋…ธ๋“œ์„œ๋ฒ„์˜ web push protocol์„ ์ด์šฉํ•˜์—ฌ Client ๋‹จ๋ง๊ธฐ๋กœ push์•Œ๋ฆผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.(7)

3) ์‹œ์Šคํ…œ ๋ฐฐ๊ฒฝ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ 

์•ž์„œ ์‹œ์Šคํ…œ์ด ์–ด๋–ค ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๋™์ž‘ํ•˜๊ณ  ๊ฐ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์‚ฌ์ด์— ์–ด๋–ค ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์œ„์˜ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์ด ๋ฌด์—‡์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค์–ด์กŒ๊ณ , ๊ตฌ์„ฑ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์ด ์–ด๋–ค ์›๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์„ค๋ช…์˜ ๋ชฉ์ ์€ ์‹œ์Šคํ…œ์˜ ๋ฐฐ๊ฒฝ๊ณผ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์˜ ์ „๋ฐ˜์ ์ธ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ, ๋„ˆ๋ฌด ๊นŠ์ด ์žˆ๋Š” ๋‚ด์šฉ์€ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • 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)๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ์—ผ๋‘ํ•ด์ฃผ์„ธ์š”.

  1. Client๋Š” Server์— SSH ์ ‘์† ์š”์ฒญ์„ ํ•œ๋‹ค.
  2. Server๋Š” ์ž„์˜์˜ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ  Public Key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ Client์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.
  3. Client๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฐ’์„ Private Key๋กœ ๋ณตํ˜ธํ™” ํ•ด์„œ ๋‹ค์‹œ Server๋กœ ๋ณด๋‚ธ๋‹ค.
  4. 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๋ฅผ ์ด์šฉํ•œ ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›๊ณ  ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


[ 3.๊ฒฐ๋ก  | ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ•œ๊ณ„ ]

1) ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ

2) ํ”„๋กœ์ ํŠธ ์š”์•ฝ ์ •๋ฆฌ

์ฒญ๊ฐ์žฅ์• ์ธ๋ถ„๋“ค์€ ์ง„๋™๋ฒจ์ด ์—†๋Š” ์นดํŽ˜์—์„œ ์Œ๋ฃŒ์ œ์กฐ ์™„๋ฃŒ์•Œ๋ฆผ์„ ๋ฐ›๋Š”๋ฐ ๋ถˆํŽธํ•จ์„ ๋А๋ผ์‹ญ๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์•ฑ ์„ค์น˜๋‚˜ ๋ฌธ์ž๋ฉ”์„ธ์ง€ ๋“ฑ ์ง„๋™๋ฒจ์„ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์Šค๋งˆํŠธํฐ์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์Œ๋ฃŒ์ œ์กฐ์™„๋ฃŒ๋ฅผ push ์•Œ๋ฆผ์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก PWAํ˜•์‹์˜ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

3) ๊ธฐ๋Œ€๋˜๋Š” ํšจ๊ณผ

์นดํŽ˜์ž…์žฅ)

  • ์ง„๋™๋ฒจ ๊ด€๋ฆฌ(๋ถ„์‹ค, ๊ณ ์žฅ, ์ฒญ๊ฒฐ์ƒํƒœ ๋“ฑ)์— ๋Œ€ํ•œ ๋ถ€๋Œ€๋น„์šฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

์ ์›์ž…์žฅ)

  • ์†๋‹˜์ด ์ฃผ๋ฌธ์„ ํ•œ ํ›„ nfcํƒœ๊น…์„ ํ†ตํ•ด ์Œ๋ฃŒ์ œ์ž‘ ์™„๋ฃŒ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์›์ด ์ฃผ๋ฌธ์„ ๋ฐ›์œผ๋ฉด์„œ ์ง„๋™๋ฒจ์— ์ž…๋ ฅํ•˜๊ณ  ์Œ๋ฃŒ์ œ์ž‘์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋–„ ๊ทธ์— ๋งž๋Š” ์ง„๋™๋ฒจ ๋ฒˆํ˜ธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†๋‹˜์ž…์žฅ)

  • ์›น์ฃผ์†Œ๋งŒ์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ ‘๊ทผ์„ฑ์ด ์šฉ์ดํ•˜๊ณ  ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์•ฑ์„ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ๋‹จ๋ง๊ธฐ์˜ ์ €์žฅ๊ณต๊ฐ„์„ ๊ฑฐ์˜ ์ฐจ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ๋ถ€๋‹ด์ด ์ ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4) ํ•œ๊ณ„

  1. ์•„์ดํฐ ์‚ฌ์šฉ์ž๋Š” ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    • ios๊ฐ€ ๊ฐœ๋ฐœํ•œ ์›น๋ธŒ๋ผ์šฐ์ €์ธ safari์—์„œ๋Š” PWA๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•„์ดํฐ์— ํฌ๋กฌ ์•ฑ์ด ์„ค์น˜๋˜์–ด ์žˆ๋”๋ผ๋„ PWA์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ํŠน์ • ์›น๋ธŒ๋ผ์šฐ์ €๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

    • ๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ์ง€์›๋˜๋Š” PWA๊ด€๋ จ ์„œ๋น„์Šค๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™์ผํ•œ ๋ธŒ๋ผ์šฐ์ €๋ผ๋„ ์„ค์น˜๋œ ๋ฒ„์ „์— ๋”ฐ๋ผ์„œ ์„œ๋น„์Šค๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ €ํฌ ์‹œ์Šคํ…œ์€ ํฌ๋กฌ ์›น๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „ 50์ด์ƒ์„ ์ถ”์ฒœ๋“œ๋ฆฌ๋ฉฐ ๊ทธ ์ดํ•˜์˜ ๋ฒ„์ „์—์„œ ์‹œ์Šคํ…œ์ด ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์Šค๋งˆํŠธํฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋Œ€์ฒดํ•  ๋งŒํ•œ ์žฅ์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    • ์š”์ฆ˜ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์Šค๋งˆํŠธํฐ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์นดํŽ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ชจ๋“  ์†๋‹˜๋“ค์ด ์Šค๋งˆํŠธ ํฐ์„ ์ด์šฉํ•œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šค๋งˆํŠธํฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„ค์น˜๋œ ์žฅ์น˜(์˜ˆ: ๋…ธํŠธ๋ถ)์— url์„ ์ž…๋ ฅํ•˜๋ฉด ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5) ํ™•์žฅ๊ฐ€๋Šฅ์„ฑ

  1. ์• ํ”Œ์˜ ๊ธ์ •์ ์ธ ๊ฒ€ํ† 

    • Apple์€ ์—ฌ์ „ํžˆ PWA๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ WebKit์—์„œ service worker API๋ฅผ ๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ธ์  ๊ฐ€ Apple๋„ ์ผ์ข…์˜ PWA์™€ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ์ง€์›ํ•  ์ „๋ง์ด ๋ณด์ž…๋‹ˆ๋‹ค.
    • ์ฐธ๊ณ ์‚ฌ์ดํŠธ https://webkit.org/status/
  2. ์˜คํ”„๋ผ์ธ ๋กœ๋”ฉ๊ฐ€๋Šฅ ํ™œ์šฉ

    • PWA๋Š” ์˜จ๋ผ์ธ์‹œ์— ํ•œ๋ฒˆ๋งŒ ๋กœ๋”ฉํ•˜๋ฉด ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ผ๋•Œ๋„ ๋กœ๋”ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ ์„ ์ด์šฉํ•˜์—ฌ ์นดํŽ˜์ธก์—์„œ ๋ฉ”๋‰ดํŒ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์นดํŽ˜๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ”๋‰ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. ๊ฒฐ์ œ๋ชจ๋“ˆ ์ ์šฉ

    • 2๋ฒˆ์—์„œ ์†Œ๊ฐœํ•œ ๋ฉ”๋‰ดํŒ ํŽ˜์ด์ง€๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค๋ฉด ๋” ๋‚˜์•„๊ฐ€ ๊ฒฐ์ œ์‹œ์Šคํ…œ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์†๋‹˜๋“ค์ด ์นดํŽ˜์— ์ง์ ‘ ์™€์„œ ์–ด๋–ค ๋ฉ”๋‰ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋ญ˜ ๋จน์„์ง€ ๊ฒฐ์ •ํ•˜์—ฌ ์ฃผ๋ฌธ์„ ์™„๋ฃŒํ•˜๊ธฐ๊นŒ์ง€์˜ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์—…๋ฐ์ดํŠธ ์‹œ ์„ค์น˜ ํ•„์š” X

    • ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ๊ธฐ๋Šฅ ๋ฐ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ–ˆ์„ ์‹œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋“ค์ด ์˜จ๋ผ์ธ ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋กœ๋“œ๋งŒ ํ•ด์ฃผ๋ฉด ์ตœ์‹ ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ์ ํ™”๋œ ์‚ฌ์šฉ์žํ™˜๊ฒฝ์„ ์ง€์†์ ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Clone this wiki locally