IKKIM

πŸ€– κ²½λΉ„λ‘œλ΄‡ μ—μŠ€μ½”νŠΈ μ‹ κΈ°λŠ₯ 개발

μ—μŠ€μ½”νŠΈ λͺ©μ μ§€ 선택 ν™”λ©΄
μ—μŠ€μ½”νŠΈ λͺ©μ μ§€ 선택 ν™”λ©΄
μ—μŠ€μ½”νŠΈ λͺ©μ μ§€ μ„€μ • ν™”λ©΄
μ—μŠ€μ½”νŠΈ λͺ©μ μ§€ μ„€μ • ν™”λ©΄
μ—μŠ€μ½”νŠΈ κΈΈμ•ˆλ‚΄ μ§„ν–‰ 쀑 ν™”λ©΄
μ—μŠ€μ½”νŠΈ κΈΈμ•ˆλ‚΄ μ§„ν–‰ 쀑 ν™”λ©΄
μ—μŠ€μ½”νŠΈ λͺ©μ μ§€ 도착 μ‹œ ν™”λ©΄
μ—μŠ€μ½”νŠΈ λͺ©μ μ§€ 도착 μ‹œ ν™”λ©΄
μ—μŠ€μ½”νŠΈ 운영 μ‹œκ°„ μ•ˆλ‚΄ λͺ¨λ‹¬
μ—μŠ€μ½”νŠΈ 운영 μ‹œκ°„ μ•ˆλ‚΄ λͺ¨λ‹¬
μ‹œμ„€ μ•ˆλ‚΄ νŽ˜μ΄μ§€ 연동
별도 μ‹œμ„€ μ•ˆλ‚΄ νŽ˜μ΄μ§€μ™€λ„ μ—°λ™λ˜μ–΄ μ ‘κ·Ό κ°€λŠ₯

πŸ“Œ ν”„λ‘œμ νŠΈ κ°œμš”

  • λ‘œλ΄‡μ΄ λͺ©μ μ§€κΉŒμ§€ κΈΈμ•ˆλ‚΄λ₯Ό ν•˜λ©°, λ‘œλ΄‡ μƒνƒœμ— 따라 μ‚¬μš©μžμ—κ²Œ μŒμ„± 및 ν™”λ©΄ μ•ˆλ‚΄λ₯Ό μ œκ³΅ν•˜λŠ” κ²½λΉ„ λ‘œλ΄‡ μ „μš© μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.
  • λŒ€κΈ°, 이동, 도착, 혼작, μΌμ‹œμ •μ§€, 경둜 μž₯μ•  λ“± λ‘œλ΄‡μ˜ μƒνƒœ λ³€ν™”λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ‹ ν•΄ 화면을 μ „ν™˜ν•˜κ³ ,
    상황에 λ§žλŠ” μŒμ„± μ•ˆλ‚΄λ₯Ό ν•¨κ»˜ μ œκ³΅ν•˜μ—¬ 보닀 λͺ…ν™•ν•œ μ—μŠ€μ½”νŠΈ κ²½ν—˜μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • λ‘œλ΄‡μ΄ μ—μŠ€μ½”νŠΈλ₯Ό μˆ˜ν–‰ 쀑일 λ•ŒλŠ” 메인 ν™”λ©΄ 이동 및 기타 μ½˜ν…μΈ  이용이 μ œν•œλ˜λ©°,
    μžλ™ 볡귀 이후에 μ •μƒμ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„ν•˜μ—¬ μ½˜ν…μΈ  μ•ˆμ •μ„±μ„ λ†’μ˜€μŠ΅λ‹ˆλ‹€.
  • 이동 μ‹œμž‘, μΌμ‹œ μ •μ§€, λͺ©μ μ§€ λ³€κ²½, μ›μœ„μΉ˜ 볡귀 λ“±μ˜ μƒνƒœλŠ” 미듀웨어와 ν•©μ˜ν•œ 규격으둜 μ£Όκ³ λ°›μœΌλ©°,
    UI μ „ν™˜λΏ μ•„λ‹ˆλΌ λ‘œλ΄‡ ν•˜λ“œμ›¨μ–΄μ˜ μ›€μ§μž„ μ œμ–΄μ™€λ„ μ—°κ²°λ©λ‹ˆλ‹€.
  • μ•ˆλ‚΄κ°€ λλ‚œ λ’€ λ‘œλ΄‡μ΄ μ›μœ„μΉ˜λ‘œ λŒμ•„κ°€λŠ” 볡귀 κ΅¬κ°„κΉŒμ§€ μƒνƒœλ₯Ό μ •μ˜ν•˜μ—¬,
    볡귀 쀑 μΌμ‹œμ •μ§€, 재개, 쀑단도 μ•ˆλ‚΄ ꡬ간과 λ™μΌν•˜κ²Œ μ²˜λ¦¬λ˜λ„λ‘ κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ§‘β€πŸ’» μ£Όμš” κΈ°μ—¬

  • μ—μŠ€μ½”νŠΈ κΈ°λŠ₯의 κΈ°νšμ— μ°Έμ—¬ν•˜κ³ , ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ λ‹¨λ…μœΌλ‘œ λ‹΄λ‹Ήν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • μ‹ κ·œ μ½˜ν…μΈ μ˜ 성곡적인 μ‹œμ—° 및 μƒμš©ν™”λ₯Ό μ΄λŒμ—ˆμŠ΅λ‹ˆλ‹€.
  • μ½˜ν…μΈ μ™€ 미듀웨어 μ‚¬μ΄μ˜ 톡신 κ·œκ²©μ„ 미듀웨어 νŒ€κ³Ό ν•¨κ»˜ μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    전달 λ³€μˆ˜, λ‘œλ΄‡ μ œμ–΄ λͺ…λ Ή, μƒνƒœ 전이 이벀트λ₯Ό μ‹œλ‚˜λ¦¬μ˜€ 규격 λ¬Έμ„œλ‘œ κ΄€λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
    • μ•ˆλ‚΄ 및 볡귀 ꡬ간에 걸친 μƒνƒœ 42μ’… 쀑, ν™”λ©΄ μ „ν™˜μ΄ ν•„μš”ν•œ 32쒅을 μ½˜ν…μΈ μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ λ‚˜λˆ„μ—ˆμŠ΅λ‹ˆλ‹€.
    • μ½˜ν…μΈ λŠ” iframe λ‚΄λΆ€μ—μ„œ λ™μž‘ν•˜λ©°, postMessage 기반 λ©”μ‹œμ§€ 규격으둜 λΆ€λͺ¨ μœˆλ„μš°μ™€ ν†΅μ‹ ν•˜κ³ 
      λΆ€λͺ¨κ°€ 이λ₯Ό JSON-RPC over WebSocket 호좜둜 λ³€ν™˜ν•˜λŠ” 2단 κ΅¬μ‘°μž…λ‹ˆλ‹€.
    • λͺ…λ Ή 전솑과 이벀트 μˆ˜μ‹ μ„ 각각 별도 κ³„μΈ΅μœΌλ‘œ 두어, ν™”λ©΄ μ½”λ“œκ°€ 전솑 방식에 직접 μ˜μ‘΄ν•˜μ§€ μ•Šλ„λ‘ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.
  • 상황에 λ§žλŠ” TTS (Text-to-Speech) μŒμ„± μ•ˆλ‚΄λ₯Ό μœ„ν•΄, μž¬μƒκ³Ό 쀑단을 규격의 μ•‘μ…˜μœΌλ‘œ μœ„μž„ν•˜κ³ 
    μ½˜ν…μΈ λŠ” μž¬μƒ μ™„λ£Œ 이벀트λ₯Ό λ°›μ•„ λ‹€μŒ ν™”λ©΄μœΌλ‘œ μ „ν™˜ν•˜λ„λ‘ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    λ¬Έμž₯ κΈΈμ΄λ‚˜ 언어에 관계없이 μ•ˆλ‚΄μ™€ 화면이 μ–΄κΈ‹λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ‘œλ΄‡μ΄ μ „μ†‘ν•˜λŠ” ν”½μ…€ μ’Œν‘œλ₯Ό WebSocket으둜 μˆ˜μ‹ ν•΄, 도면 이미지 μœ„ Canvas 2D λ ˆμ΄μ–΄μ—
    ν˜„μœ„μΉ˜μ™€ λͺ©μ μ§€ 마컀λ₯Ό 직접 λ Œλ”λ§ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • ν™”λ©΄λ³„λ‘œ 도면 이미지 크기가 달라, 두 μ΄λ―Έμ§€μ˜ κ°€λ‘œ, μ„Έλ‘œ λΉ„μœ¨μ„ 각각 μ’Œν‘œμ— μ μš©ν•΄ λ³΄μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  • λ‹€κ΅­μ–΄(ν•œ/영/쀑) UI ν…μŠ€νŠΈ, μŒμ„± μ•ˆλ‚΄, 이미지 λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” κ²½λΉ„ λ‘œλ΄‡ 사업이 ν™•μž₯λ˜λŠ” 계기가 λ˜μ—ˆμœΌλ©°,
    κΈ°μ‘΄ λˆ„μ  4곳이던 λ„μž…μ΄ 이후 2λ…„κ°„ 16개 κ³ κ°μ‚¬λ‘œ ν™•λŒ€λ˜μ–΄ λΉ„μ¦ˆλ‹ˆμŠ€ λͺ¨λΈλ‘œ μ•ˆμ°©ν•˜λŠ” 데 κΈ°μ—¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ”§ 기술 선택 및 섀계 κ³ λ―Ό

문제 상황

  • μ—μŠ€μ½”νŠΈ κΈ°λŠ₯은 λŒ€κΈ°, 이동, 혼작, 도착, μΌμ‹œμ •μ§€, 경둜 μž₯μ• , 볡귀 λ“± 40쒅이 λ„˜λŠ” μƒνƒœλ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.
    각 μƒνƒœλ§ˆλ‹€ UI ν™”λ©΄ ꡬ성, TTS μŒμ„± μ•ˆλ‚΄, 미듀웨어 μ œμ–΄ λͺ…령이 λͺ¨λ‘ λ‹¬λžκ³ ,
    μ΄ˆκΈ°μ—λŠ” μƒνƒœκ°’μ„ 단일 λ³€μˆ˜λ‘œ κ΄€λ¦¬ν•˜λ©° if-else λΆ„κΈ°λ‘œ μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

  • μƒνƒœκ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ λΆ„κΈ° 둜직이 λ³΅μž‘ν•΄μ‘Œκ³ , 같은 μƒνƒœ 확인 둜직이 UI, TTS, 미듀웨어 각각에 μ€‘λ³΅μœΌλ‘œ 흩어지기 μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.
    특히 타이머 기반 μ΄λ²€νŠΈκ°€ λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.
    λͺ©μ μ§€ 도착 ν›„ μžλ™ 볡귀, μž₯μ• λ¬Ό 감지 ν›„ TTS μ•ˆλ‚΄ -> λŒ€κΈ° -> λ³΅κ·€λ‘œ μ΄μ–΄μ§€λŠ” 둜직이
    μ„œλ‘œ μΆ©λŒν•˜λ©° μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘μ΄ λ°˜λ³΅λμŠ΅λ‹ˆλ‹€.

ν•΄κ²° 방법

  • μƒνƒœ μ–΄νœ˜λ₯Ό λ―Έλ“€μ›¨μ–΄μ™€μ˜ κ³„μ•½μœΌλ‘œ 보고, μ½˜ν…μΈ  편의둜 쀄이지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
    미듀웨어 μž…μž₯μ—μ„œ μ•ˆλ‚΄ 쀑 TTS와 볡귀 쀑 TTSλŠ” μ„œλ‘œ λ‹€λ₯Έ ν•˜λ“œμ›¨μ–΄ μƒνƒœμ΄λ―€λ‘œ
    λ³„κ°œ μ‹ ν˜Έμ—¬μ•Ό ν–ˆκ³ , κ·œκ²©μ„ μž„μ˜λ‘œ ν†΅ν•©ν•˜λ©΄ μƒλŒ€ μƒνƒœ 머신이 κΉ¨μ§€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

  • λŒ€μ‹  μ½˜ν…μΈ  μ•ˆμ—μ„œ λ‹€μŒκ³Ό 같이 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

    • μƒνƒœ μ „ν™˜μ˜ μ§„μž…μ μ„ ν•˜λ‚˜λ‘œ ν†΅ν•©ν•˜μ—¬, μ–΄λ–€ μƒνƒœκ°€ 듀어와도 같은 경둜둜 화면이 λ°”λ€Œλ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
    • μƒνƒœλ³„ 처리λ₯Ό κ°œλ³„ ν•Έλ“€λŸ¬λ‘œ 뢄리해, μƒνƒœ μΆ”κ°€ 및 μˆ˜μ •μ΄ λ‹€λ₯Έ μƒνƒœμ— 영ν–₯을 μ£Όμ§€ μ•Šλ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
    • ν™”λ©΄ λ™μž‘μ΄ λ™μΌν•œ μƒνƒœλŠ” ν•Έλ“€λŸ¬λ₯Ό κ³΅μœ ν•΄ 쀑볡 μ½”λ“œλ₯Ό μ—†μ•΄μŠ΅λ‹ˆλ‹€.
      (TTS 반볡 μ•ˆλ‚΄ 4μ’… -> ν•Έλ“€λŸ¬ 1개)
    • μ½˜ν…μΈ ->ν”Œλž«νΌ λͺ…λ Ήκ³Ό ν”Œλž«νΌ->μ½˜ν…μΈ  이벀트λ₯Ό 각각 별도 κ³„μΈ΅μœΌλ‘œ 두어,
      ν™”λ©΄ μ½”λ“œκ°€ 톡신 ν˜•μ‹μ— 직접 μ˜μ‘΄ν•˜μ§€ μ•Šλ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
  • 정리 이후 μˆ˜μ • λ²”μœ„κ°€ λͺ…ν™•ν•΄μ‘Œκ³ , 타이머 이벀트 κ°„ 좩돌 λ¬Έμ œλ„ ν•΄μ†Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.


πŸ”₯ νŠΈλŸ¬λΈ”μŠˆνŒ…

μƒνƒœ μ¦κ°€λ‘œ μΈν•œ 섀계 λΆ•κ΄΄ -> μž¬μ„€κ³„

  • 레퍼런슀 없이 μ²˜μŒλΆ€ν„° μ„€κ³„ν•˜λŠ” μ‹ κ·œ ν”„λ‘œμ νŠΈμ˜€μŠ΅λ‹ˆλ‹€.
    초기 κ΅¬μ‘°λ‘œλŠ” μƒνƒœκ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ μ—λŸ¬κ°€ 반볡됐고, κ²°κ΅­ 섀계 단계뢀터 λ‹€μ‹œ μž‘μ•„κ°€λŠ” 결정을 λ‚΄λ ΈμŠ΅λ‹ˆλ‹€.
    λ’€λŠ¦μ€ μž¬μ„€κ³„μ˜€μ§€λ§Œ, μƒνƒœ μ „ν™˜ 경둜λ₯Ό ν•˜λ‚˜λ‘œ λͺ¨μœΌκ³  λ‚˜μ„œ 이후 μƒνƒœ 좔가와 μˆ˜μ •μ΄ 훨씬 μˆ˜μ›”ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

μ•ˆλ‚΄μ™€ ν™”λ©΄μ˜ 어긋남

  • μŒμ„± μ•ˆλ‚΄κ°€ λλ‚˜κΈ° 전에 화면이 λ„˜μ–΄κ°€κ±°λ‚˜, μ•ˆλ‚΄κ°€ λλ‚¬λŠ”λ°λ„ 화면이 멈좰 μžˆλŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
    μž¬μƒ μ‹œκ°„μ„ νƒ€μ΄λ¨Έλ‘œ μΆ”μ •ν•˜λ©΄ λ¬Έμž₯ 길이와 μ–Έμ–΄(ν•œ/영/쀑)에 따라 μ‹€μ œ μž¬μƒ μ‹œκ°„μ΄ 달라져
    어긋남을 없앨 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
    μž¬μƒμ„ ν”Œλž«νΌμ— μœ„μž„ν•˜κ³  μ™„λ£Œ 이벀트λ₯Ό λ°›μ•„ λ‹€μŒ ν™”λ©΄μœΌλ‘œ λ„˜κΈ°λŠ” λ°©μ‹μœΌλ‘œ λ°”κΎΈμ–΄,
    λ¬Έμž₯ 길이와 λ¬΄κ΄€ν•˜κ²Œ 항상 λ§žμ•„λ–¨μ–΄μ§€λ„λ‘ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œ ν™˜κ²½κ³Ό ν…ŒμŠ€νŠΈ ν™˜κ²½μ˜ 차이

  • 본사 κ³΅κ°„λ§ŒμœΌλ‘œλŠ” λ‘œλ΄‡μ΄ μ‹€μ œλ‘œ μ΄λ™ν•˜λŠ” ν™˜κ²½μ„ μž¬ν˜„ν•˜κΈ° μ–΄λ €μ› μŠ΅λ‹ˆλ‹€.
    ν•˜λ“œμ›¨μ–΄ μ„€κ³„νŒ€μ΄ μžˆλŠ” 더 큰 건물 λ³΅λ„λ‘œ μΆœκ·Όν•΄ λ°€μƒ˜ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν–ˆκ³ , μ‹€μ œ λ„μž… ν˜„μž₯은 규λͺ¨κ°€ 훨씬 μ»€μ„œ 예기치 λͺ»ν•œ μ΄λ²€νŠΈκ°€ λ‹€μˆ˜ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
    μ‹œμ—° μ „λ‚ κΉŒμ§€ 반볡 ν…ŒμŠ€νŠΈμ™€ μˆ˜μ •μ„ 이어가며 μ•ˆμ •μ„±μ„ ν™•λ³΄ν–ˆκ³ , μ΅œμ’… μ‹œμ—°μ„ μ„±κ³΅μ μœΌλ‘œ λ§ˆμ³€μŠ΅λ‹ˆλ‹€.