πŸ₯³ typeorm을 μ΄μš©ν•œ FCM μ•Œλ¦Ό μ„œλΉ„μŠ€ - boostcampwm-2024/web17-juchumjuchum GitHub Wiki

λΆ„μ•Ό μž‘μ„±μž μž‘μ„±μΌ
BE κΉ€μ„±ν™˜ 24λ…„ 12μ›” 02일

λ°œλ‹¨

  • μ£ΌμΆ€μ£ΌμΆ€ μ„œλΉ„μŠ€λŠ” 초보자λ₯Ό μœ„ν•œ μ„œλΉ„μŠ€μ΄λ‹€.

    • μ•Œλ¦Όμ„ 처음 μ„€μ •ν•˜κ³  λ‚˜μ„œ μœ μ €λŠ” 신경을 μ“°μ§€ μ•Šμ•„λ„ μ„€μ •ν•œ 가격, κ±°λž˜λŸ‰μ— λ„λ‹¬ν•˜λ©΄ μ•Œλ¦Όμ„ 받을 수 있게 주식 μ„œλΉ„μŠ€λ₯Ό κ΅¬μ„±ν•˜κ³ μž ν–ˆλ‹€.
  • μ•Œλ¦Ό μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•  λ•Œ κ³ λ €ν•œ 뢀뢄은 크게 두가지이닀.

    • μ„œλ²„μ˜ λΆ€ν•˜ κ°€λŠ₯μ„±
      • μ±„νŒ…μ„œλ²„, 주식 데이터 μ„œλ²„ λ“±λ“± 이미 λΆ€ν•˜κ°€ μžˆλŠ” μƒν™©μ—μ„œ μ•Œλ¦ΌκΉŒμ§€ λΆ€ν•˜λ₯Ό κ°€ν•˜κΈ°μ—λŠ” 뢀담이 μžˆμ—ˆλ‹€.
      • ν˜„μž¬ μ„œλ²„ κ΅¬μ‘°λŠ” 각 ꡬ쑰가 λΆ„λ¦¬λ˜μ–΄ μžˆμ§€ μ•Šμ€ ν™˜κ²½μ΄λΌ λ”λ”μš± λΆ€ν•˜ κ°€λŠ₯성에 λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμ—ˆλ‹€.
    • μ˜€ν”„λΌμΈ ν™˜κ²½μ—μ„œλ„ μ œλŒ€λ‘œ μž‘λ™λ˜μ–΄μ•Ό 함.
      • μ΄ˆλ³΄μžμ—κ²Œ 주식을 μ§€μ†ν•΄μ„œ ν™•μΈν•˜λŠ” μƒν™©λ³΄λ‹€λŠ” 비ꡐ적 자유둭게 확인이 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.

μ•Œλ¦Ό μ„œλΉ„μŠ€ κ΅¬ν˜„ 방법

SSE (Server-Sent Events)

μ„œλ²„ λΆ€ν•˜ κ°€λŠ₯μ„±

  • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„ 지속적인 연결을 μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ, μ—°κ²° μˆ˜κ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ μ„œλ²„ μžμ›μ΄ μ†Œλͺ¨λœλ‹€.
  • λ§Žμ€ μ‚¬μš©μžλ₯Ό λ™μ‹œμ— μ§€μ›ν•˜λ €λ©΄ μ„œλ²„ ν™•μž₯이 ν•„μš”ν•  수 있으며, 특히 μ‹€μ‹œκ°„ 데이터 슀트리밍 μ„œλΉ„μŠ€μ—μ„œ λΆ€ν•˜ 관리가 μ–΄λ €μšΈ 수 μžˆλ‹€.

μ˜€ν”„λΌμΈ ν™˜κ²½ μž‘λ™

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ λΈŒλΌμš°μ € 탭을 λ‹«κ±°λ‚˜ λ„€νŠΈμ›Œν¬ 연결이 끊기면 μ•Œλ¦Όμ„ 받을 수 μ—†λ‹€.
  • 연결이 μœ μ§€λ˜λŠ” λ™μ•ˆμ—λŠ” μ‹€μ‹œκ°„μœΌλ‘œ 데이터λ₯Ό 받을 수 μžˆμ§€λ§Œ, μ˜€ν”„λΌμΈ ν™˜κ²½μ—μ„œλŠ” μ•Œλ¦Όμ΄ μ€‘λ‹¨λœλ‹€.

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

λ°œμƒν–ˆλ˜ 문제점

μ™ΈλΆ€μ„œλΉ„μŠ€ 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 ν™˜κ²½μ—μ„œ ν‘Έμ‹œ μ•Œλ¦Ό κ΅¬ν˜„ν•˜κΈ°