Skip to content

๐Ÿฅณ typeorm์„ ์ด์šฉํ•œ FCM ์•Œ๋ฆผ ์„œ๋น„์Šค

sunghwki edited this page Dec 3, 2024 · 2 revisions

๋ฐœ๋‹จ

  • ์ฃผ์ถค์ฃผ์ถค ์„œ๋น„์Šค๋Š” ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค์ด๋‹ค.

    • ์•Œ๋ฆผ์„ ์ฒ˜์Œ ์„ค์ •ํ•˜๊ณ  ๋‚˜์„œ ์œ ์ €๋Š” ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์•„๋„ ์„ค์ •ํ•œ ๊ฐ€๊ฒฉ, ๊ฑฐ๋ž˜๋Ÿ‰์— ๋„๋‹ฌํ•˜๋ฉด ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์ฃผ์‹ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ ์ž ํ–ˆ๋‹ค.
  • ์•Œ๋ฆผ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ณ ๋ คํ•œ ๋ถ€๋ถ„์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€์ด๋‹ค.

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

์•Œ๋ฆผ ์„œ๋น„์Šค ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

SSE (Server-Sent Events)

์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ€๋Šฅ์„ฑ

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์„œ๋ฒ„ ์ž์›์ด ์†Œ๋ชจ๋œ๋‹ค.
  • ๋งŽ์€ ์‚ฌ์šฉ์ž๋ฅผ ๋™์‹œ์— ์ง€์›ํ•˜๋ ค๋ฉด ์„œ๋ฒ„ ํ™•์žฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์—์„œ ๋ถ€ํ•˜ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
    • ํŠนํžˆ ํ•œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์ง€์›ํ•˜๋Š” SSE๋Š” HTTP 2.0 ๊ธฐ์ค€์œผ๋กœ 100๊ฐœ์— ๋ถˆ๊ณผํ•˜๋‹ค.

์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ ์ž‘๋™

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ํƒญ์„ ๋‹ซ๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋ฉด ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
  • ์—ฐ๊ฒฐ์ด ์œ ์ง€๋˜๋Š” ๋™์•ˆ์—๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ์•Œ๋ฆผ์ด ์ค‘๋‹จ๋œ๋‹ค.

Web Push

์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ€๋Šฅ์„ฑ

  • ์„œ๋ฒ„๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋ฏ€๋กœ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์ ๋‹ค.
  • ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€๋Š” ํ‘ธ์‹œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋ฏ€๋กœ, ์„œ๋ฒ„ ๋ถ€ํ•˜์˜ ๋Œ€๋ถ€๋ถ„์€ ํด๋ผ์ด์–ธํŠธ์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ํ‘ธ์‹œ ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ ์ž‘๋™

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—ฌ๋„, ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

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

  • ์ด๋Ÿฐ ์ ์—์„œ Web Push๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค.

์ด๋ฒคํŠธ ํ๋ฆ„๋„

  • typeorm์˜ afterInsert๋ฅผ ์ด์šฉํ•ด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค subscriber๊ฐ€ ์ž‘๋™๋  ์ˆ˜ ์žˆ๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์„ค๊ณ„ํ–ˆ๋‹ค.
graph
    A[OpenapiMinuteData] -->|insert| B[StockMinutely Table]
    B -.->|TypeORM event| C[AlarmSubscriber]
    C --> D[AlarmService.sendPushNotification]

    subgraph OpenapiScraperModule
        A
        B
    end

    subgraph AlarmModule
        C
        D
    end
Loading

๋ฐœ์ƒํ–ˆ๋˜ ๋ฌธ์ œ์ 

์™ธ๋ถ€์„œ๋น„์Šค API ์š”์ฒญ ์ œํ•œ ๋ฌธ์ œ

  • ์ฃผ์ถค์ฃผ์ถค ์„œ๋น„์Šค๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค์ธ ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ์˜ api๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ„๋‹จ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์˜จ๋‹ค.
  • ๋ฌธ์ œ๋Š” ํ˜„์žฌ api๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค๊ฐ€ ๋งŽ๊ณ , api์˜ ์ตœ๋Œ€ ์š”์ฒญ ํšŸ์ˆ˜๋Š” ์ดˆ๋‹น 20ํšŒ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ api๊ฐ€ 4๊ฐœ์—ฌ์„œ ์ตœ๋Œ€ 80๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • 1000๋ช…์ด ์•Œ๋ฆผ์„ 3๊ฐœ ๋“ฑ๋กํ•œ ์ƒํ™ฉ์—์„œ ๊ณตํ†ต๋œ ์•Œ๋ฆผ์˜ ๊ฒฝ์šฐ ์ œ์™ธํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค.

๋ฌธ์ œ ์ ‘๊ทผ ๋ฒ•

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์  ์ธก๋ฉด

    • ํ˜„์žฌ(2024๋…„ 12์›” 3์ผ) ๊ธฐ์ค€ ํ•œ๊ตญ์˜ ์ฝ”์Šคํ”ผ, ์ฝ”์Šค๋‹ฅ์— ์ƒ์žฅ๋˜์–ด ์žˆ๋Š” ์ฃผ์‹(ETN, ETF ๋“ฑ ํฌํ•จ)์€ ๋Œ€๋žต 4200๊ฐœ ์ •๋„์ด๋‹ค.
    • ๋ถ„๋‹จ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ„์— ํ•œ๋ฒˆ ๋ฐ›๊ณ , 1์ดˆ์— 80๊ฑด์˜ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•˜๋ฉด 4800๊ฑด์˜ ์š”์ฒญ์„ 1๋ถ„์— ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹ค๋งŒ, ๋‹ค๋ฅธ api ์š”์ฒญ์ด ์žˆ๊ณ , ์ด ์š”์ฒญ๋“ค์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ถ€ํ•˜๋ฅผ ์•„์ง ํ…Œ์ŠคํŠธํ•˜์ง€ ๋ชปํ•ด ์ผ๋‹จ ์•Œ๋ฆผ์„ ๋“ฑ๋กํ•œ ๊ฑด ์ค‘ ๋งŽ์€ ์ฃผ์‹ ๊ด€๋ จ ์•Œ๋ฆผ ์ƒ์œ„ 200๊ฑด์— ๋Œ€ํ•ด์„œ๋งŒ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.
  • ์„œ๋ฒ„ ๋ถ€ํ•˜์ ์ธ ์ธก๋ฉด

์ฐธ๊ณ  ์ž๋ฃŒ

SSE MDN Web Docs

Push API MDN Web Docs

npm web-push library

firebase transfer to v1

Sanha Ko - PWA ํ™˜๊ฒฝ์—์„œ ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ตฌํ˜„ํ•˜๊ธฐ

๐Ÿœ ํŒ€ ๊ฐœ๋ฏธ

๐Ÿ›๏ธ ํŒ€ ๋ฌธํ™”

๊ฐœ๋ฐœ ์œ„ํ‚ค

FE

BE

Infra

๐Ÿ—ฃ๏ธ ๋ฐœํ‘œ

๐Ÿ“š ํšŒ์˜๋ก

๐Ÿ”ด ์ธํ„ฐ๋ฏธ์…˜
๐ŸŸ  1์ฃผ์ฐจ
๐ŸŸก 2์ฃผ์ฐจ
๐ŸŸข 3์ฃผ์ฐจ
๐Ÿ”ต 4์ฃผ์ฐจ
๐ŸŸฃ 5์ฃผ์ฐจ
๐ŸŸค 6์ฃผ์ฐจ

๐Ÿ’ญ ํšŒ๊ณ 

๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ ๋ฉ˜ํ† ๋ง

Clone this wiki locally