Skip to content

Gasree_Project_Blog

wisdomjhkwon edited this page Nov 6, 2017 · 42 revisions

์‹œ๊ฐ์žฅ์• ์ธ์„ ์œ„ํ•œ ์˜คํ”„๋ผ์ธ ์˜๋ฅ˜ ์‡ผํ•‘ ์†”๋ฃจ์…˜

๊ฐ€์Šค๋ฆฌ = { ๊ถŒ์ง€ํ˜œ, ๋ฏผ์ง€ํ˜ธ, ์‹ ์ง€ํ˜ธ, ์›์€์ง€ }


๋ชฉ์ฐจ

  1. ์„œ๋ก  | ๋ฌธ์ œ ์ •์˜ ๋ฐ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
  2. ๋ณธ๋ก  |
    1. ์‹œ์Šคํ…œ ๋ฐฐ๊ฒฝ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ 
    2. ์‚ฌ์šฉ ๊ธฐ์ˆ 
    3. ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
  3. ๊ฒฐ๋ก  | ์š”์•ฝ ๋ฐ ํ™•์žฅ

์„œ๋ก 

๋ฌธ์ œ ์ •์˜ ๋ฐ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

[๋ฌธ์ œ์ •์˜]
ํ•œ๊ตญ์ธ 5000๋งŒ๋ช… ์ค‘ 25๋งŒ๋ช…์ด ์‹œ๊ฐ ์žฅ์• ์ธ์ด๋‹ค. 84%๊ฐ€ ์ €์‹œ๋ ฅ์ž์ด๊ณ  16%๊ฐ€ ์ „๋งน์ธ์ด๋‹ค. ์ด์ค‘ 95.6%๊ฐ€ ์ƒํ›„ 1๋…„ ์ดํ›„์— ๋ฐœ์ƒํ•œ ํ›„์ฒœ์„ฑ ์žฅ์• ์ธ๋“ค์ด๋‹ค. ๋˜ํ•œ ํ›„์ฒœ์„ฑ ์žฅ์• ์˜ ์ ˆ๋ฐ˜์ด 40์„ธ ์ดํ›„์— ์ƒ๊ธด๋‹ค.

์ €์‹œ๋ ฅ์ž๋“ค์€ ์ž”์กด์‹œ๋ ฅ์— ์กฐ๊ธˆ์ด๋ผ๋„ ์˜์ง€ํ•  ์ˆ˜ ์žˆ์–ด, ์ž์‹ ์˜ ์žฅ์• ๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌด์—‡์ด๋“ ์ง€ ์Šค์Šค๋กœ ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค.

์‹œ๊ฐ์žฅ์• ์ธ์ด ์žฅ์• ๋กœ ์ธํ•˜์—ฌ ์ผ์ƒ ์ƒํ™œ์— ์—ฌ๋Ÿฌ ๋ถˆํŽธํ•จ์„ ๊ฒช๊ณ  ์žˆ๋‹ค. ํŠนํžˆ ์žฅ์• ๋กœ ์ธํ•ด ์†Œ๋น„ ํ™œ๋™์„ ๋Šฅ๋™์ ์œผ๋กœ ํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ๋Š” ๋Œ€๋Œ€๋ถ„์˜ ์‹œ๊ฐ์žฅ์• ์ธ์€ ๋™ํ–‰์ธ๊ณผ ํ•จ๊ป˜ ์‡ผํ•‘์„ ํ•˜๋Š” ํ˜•ํƒœ์ด๊ฑฐ๋‚˜ , ํ˜ผ์ž ์†Œ๋น„ํ™œ๋™์„ ํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†Œ๋น„ํ™œ๋™์„ ์›ํ•  ๋•Œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋™ํ–‰์ธ์ด ๋‹น์žฅ ์—†๊ฑฐ๋‚˜ ๋™ํ–‰์ธ์ด ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๋ชจ๋“  ํ™œ๋™์„ ๊ฐ™์ดํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฏธ์•ˆํ•จ๊ณผ ๋ถˆํŽธํ•จ์„ ๋А๋ผ๊ณ  ์žˆ๋‹ค.

-> ๋Œ€๋ถ€๋ถ„์ด ์˜คํ”„๋ผ์ธ ์‡ผํ•‘์— ์˜์กดํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์˜๋ฅ˜ ์ •๋ณด ํŒŒ์•…์— ์ทจ์•ฝ

์ตœ์ข…๋ชฉํ‘œ

  • ๋ชจ๋ฐ”์ผ ์•ฑ์„ ํ†ตํ•ด ์‹œ๊ฐ์žฅ์• ์ธ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‡ผํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • ์‡ผํ•‘์˜ ์ฆ๊ฑฐ์›€์„ ๋А๋‚„ ์ˆ˜ ์žˆ๋„๋ก ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

Objectives

  • ์‹œ๊ฐ์žฅ์• ์ธ๋“ค์ด ์‰ฝ๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณต๋ฐ›์•„์•ผ ํ•œ๋‹ค(์‹œ๊ฐ์žฅ์• ์ธ์„ ์œ„ํ•œ UI)
  • ์˜ท์œผ๋กœ ๊ฐ€๋Š” ์ •ํ™•ํ•œ ์œ„์น˜์™€ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค
  • ์˜ท ๊ฐ๊ฐ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค
  • ์˜ท์„ ์ถ”์ฒœํ•ด์•ผ ํ•œ๋‹ค
  • ์‡ผํ•‘์— ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค
  • ์‡ผํ•‘ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
  • ์žฅ์†Œ๋ฅผ ๋– ๋‚œ ์ดํ›„์—๋„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค
  • ์‚ฌ๋žŒ์ด ๋งŽ์€ ๊ณณ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
  • ๋น„์šฉ์€ ์ตœ์†Œ๋กœ ํ•œ๋‹ค

Constraint

  • ์Šค๋งˆํŠธํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค
  • ์ถ”๊ฐ€์  ํ•˜๋“œ์›จ์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค
  • ์‹ค๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค(์‹ค๋‚ด ์ธก์œ„)
  • ์†์ด ์ž์œ ๋กœ์›Œ์•ผ ํ•œ๋‹ค

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

Selction / Recommendation Module


์ฒ˜์Œ์—๋Š” Selection / Recommendation ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋จผ์ € 2๊ฐ€์ง€์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์œ ์ €์—๊ฒŒ ํŠน์ • ์นดํ…Œ๊ณ ๋ฆฌ์— ๋Œ€ํ•œ ๊ธฐ์ค€์„ ์ž…๋ ฅ ๋ฐ›์•„ ํ•ด๋‹น๋˜๋Š” ๋ฆฌ์ŠคํŠธ๋“ค๋ฅผ ๋‚˜์—ด
  2. ์œ ์ €๊ฐ€ ์˜ˆ์ „์— ๊ตฌ๋งค ํ–ˆ๋˜ ์˜ท๋“ค์ด๋‚˜ ํ˜„์žฌ ์‚ฐ ์˜ท๋“ค๊ณผ ์–ด์šธ๋ฆด๋งŒํ•œ ์˜ท๋“ค ์ถ”์ฒœ ๋‘๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์˜ท์˜ ๋ฆฌ์ŠคํŠธ์™€ ๊ทธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›๋Š”๋‹ค.

IndoorAtlas / Navigation Module


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

NFC Module


์˜ท ์ฃผ๋ณ€์— ๋„์ฐฉ ํ–ˆ์„ ๋•Œ ๋‚ด ์•ž์— ์žˆ๋Š” ์˜ท์ด ๊ทธ ์˜ท์ด ๋งž๋Š”์ง€ ์ฒดํฌํ•˜๊ฑฐ๋‚˜ ์„ธ๋ถ€ ์ •๋ณด์— ๋Œ€ํ•ด์„œ ๋” ๋“ฃ๊ธฐ๋ฅผ ์›ํ• ๋•Œ NFC ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋˜ํ•œ ๊ตฌ๋งคํ™•์ •์ธ ์˜ท๋“ค์ด๋‚˜ ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Server์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

์ „์ฒด ์‹œ์Šคํ…œ ๊ฐœ์š”๋„

์šฉ์–ด ์„ค๋ช…

Module, Library, Framework, SDK, API ๊ฐ„๋‹จ ์šฉ์–ด ์ •๋ฆฌ

Module(๋ชจ๋“ˆ)

  • ์ปดํฌ๋„ŒํŠธ(component), ๊ตฌ์„ฑ์š”์†Œ, ๋ถ€ํ’ˆ, ์„ฑ๋ถ„ ๊ฐœ๋…์œผ๋กœ ๋ณด๋ฉด ๋ ๊ฒƒ ๊ฐ™๋‹ค
  • ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Library(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

  • ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„ ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฒƒ์ด๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„๋ฅ˜
    • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • ๋™์  ๋กœ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

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

๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ๋„์ค‘ ํ•ด๋‹น ๋ชจ๋“ˆ์ด ํ•„์š”ํ•  ๋•Œ ํ˜ธ์ถœํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋“ˆ ์•ฑ์„ ๋นŒ๋“œํ•  ๋•Œ ์กด์žฌํ•˜์ง€ ์•Š๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•์‹์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ, ์„ค์น˜๊ฐ€ ๋”ฐ๋กœ ํ•„์š”ํ•˜๋‹ค.
  • ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹คํ–‰ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ฝ์–ด๋“ค์—ฌ ํ˜ธ์ถœ๊ด€๊ณ„๋ฅผ ์กฐ์ •ํ•œ ๋‹ค์Œ ์•ฑ์ด ์‹คํ–‰๋œ๋‹ค.
  • ๋™์  ๋กœ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹คํ–‰ํŒŒ์ผ ์‹คํ–‰ ์‹œ ์ฝ์–ด ๋“ค์ด์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ด์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Framework(ํ”„๋ ˆ์ž„์›Œํฌ)

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

API(Application Programming Interface)

  • ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™.
  • ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, ์šด์˜์ฒด์ œ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค.
  • ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค.
  • ์•ฑ ๊ฐ„์— ์—ฐ๋™์˜ ๊ฐœ๋…์ด ๋งŽ์•„์ง€์ž ์„œ๋กœ ๋‹ค๋ฅธ ์•ฑ ๊ฐ„ ๊ธฐ๋Šฅ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœํ•œ๋‹ค.
  • SDK์™€ ๊ฑฐ์˜ ๊ฐ™์€ ๋œป์œผ๋กœ ์“ฐ์ธ๋‹ค.

SDK(Software Development Kit)

  • ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋„๊ตฌ ๋ชจ์Œ
  • SDK ์•ˆ์—๋Š” ๊ฐœ๋ฐœ์— ๋„์›€์ด ๋  ๊ฐœ๋ฐœ ๋„๊ตฌ ํ”„๋กœ๊ทธ๋žจ, ๋””๋ฒ„๊น… ํ”„๋กœ๊ทธ๋žจ, ๋ฌธ์„œ, API ๋“ฑ์ด ์žˆ๋‹ค.

์ถœ์ฒ˜: http://waaan.tistory.com/16 [waaan]


๋ณธ๋ก 

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

1. ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ VS ์›น ์•ฑ VS ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ

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

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

์›น ์•ฑ์€ ์Šค๋งˆํŠธํฐ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ฐ”์ผ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์Šค๋งˆํŠธํฐ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ธํ„ฐ๋„ท ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ์•ฑ์€ ๋ชจ๋ฐ”์ผ ์›น ์•ฑ์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ HTML, CSS, JavaScript๋กœ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ์•ฑ์€ ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ์„ ์ง€์›ํ•˜๋ฉฐ ๊ฐœ๋ฐœ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“ ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์›น ์•ฑ์€ OS์™€ ์ง์ ‘ ์—ฐ๋™ํ•˜์—ฌ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๋‹ฌ๋ฆฌ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ทธ ์ž์ฒด๊ฐ€ OS API์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ด์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์›น ์•ฑ์ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” API์˜ ์ˆ˜์—๋Š” ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์€ ๋””๋ฐ”์ด์Šค์— ๋Œ€ํ•ด ์ „์ฒด ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–์ง€๋งŒ ์›น ์•ฑ์—์„œ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

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

์•„๋ž˜์˜ ์‚ฌ์ง„๋“ค์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์„ธ ๊ฐ€์ง€ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์š”์•ฝํ•œ ์‚ฌ์ง„์ž…๋‹ˆ๋‹ค.

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

2. ์•„์ด์˜ค๋‹‰์ด๋ž€?

์ž, ์ด์ œ ๊ทธ๋Ÿผ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์˜ ํ”„๋ ˆ์ž„ ์›Œํฌ์ธ ์•„์ด์˜ค๋‹‰์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์ด์˜ค๋‹‰2 framework๋Š” angular js 2, cordova๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋‹ค์–‘ํ•œ UI components, API๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์•„์ด์˜ค๋‹‰์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์•„๋ž˜์˜ ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ์ง€์‹์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์•ต๊ทค๋Ÿฌ
  2. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
  3. ์ฝ”๋„๋ฐ”

์ˆœ์„œ๋Œ€๋กœ ์„ค๋ช…ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์•ต๊ทค๋Ÿฌ๋ž€?

ํ˜„์žฌ ๊ตฌ๊ธ€์ด ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ชฝ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค.

  1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ž€?

๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์Šค์ผ€์ผ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€์ž…์ด ์ƒ๊ธด ์–ธ์–ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฝ”๋„๋ฐ”๋ž€?

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

์œ„์— ๊ทธ๋ฆผ์—์„œ ๋ณด์ด๋“ฏ์ด, ์ฝ”๋„๋ฐ”๋ฅผ ํ†ตํ•ด์„œ ๊ธฐ์ˆ ์„ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ธฐ์ˆ ์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ธ ์•ต๊ทค๋Ÿฌ๊ฐ€ ํ‹€์„ ๋งŒ๋“ค๊ณ  ์•„์ด์˜ค๋‹‰์ด ๊ทธ ํ‹€์„ ๊ฐ์‹ธ์„œ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•„์ด์˜ค๋‹‰์€ ์ฝ”๋„๋ฐ”์™€ ์•ต๊ทค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ๋“ค์„ ๋ฌถ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํŽธํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ด์˜ค๋‹‰ ๊ณต์‹ documents(https://ionicframework.com/docs/) ์—์„œ ๋‹ค์–‘ํ•œ UI components, API์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ด์˜ค๋‹‰์—์„œ๋Š” ion โ€“ slides ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ion - tag๋“ค์„ ์ œ๊ณตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค

Reference

์‚ฌ์šฉ ๊ธฐ์ˆ 

์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ ํ•œ ์ถ•์„ ๋‹ด๋‹นํ•˜๋Š” ์‹ค๋‚ด์ธก์œ„ ๊ธฐ์ˆ ์€ cordova plugin SDK๋กœ ๋œ ์•„์ด์˜ค๋‹‰ ์™ธ๋ถ€๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๋จผ์ € ionic framework์—์„œ cordova๋ฅผ ์ด์šฉํ•ด native ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋‚˜์•„๊ฐ€ SDK๋ฅผ ๋Œ์–ด์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ์‹ค๋‚ด ์ธก์œ„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. Native ๊ธฐ๋Šฅ ์‚ฌ์šฉํ•˜๊ธฐ

์•ž์„œ ์„ค๋ช… ๋“ค์œผ์‹  ๋Œ€๋กœ ionic framework ๋Š” ์›น์•ฑ๊ณผ ์Šค๋งˆํŠธํฐ๊ณผ์˜ ์ค‘๊ฐ„๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” cordova ์œ„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. Cordova๊ฐ€ ํ•˜๋Š” ์ฃผ๋œ ์—ญํ•  ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ์›น์•ฑ ํ”„๋กœ์ ํŠธ์—์„œ ์Šค๋งˆํŠธํฐ์˜ native๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ธ๋ฐ์š”. Cordova plugin์ด ๊ทธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
์œ„ ์„ค๋ช…๋Œ€๋กœ cordova plugin์€ ํ”Œ๋žซํผ๋ณ„ native ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด JavaScript๋กœ ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Cordova plugin์€ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ณ , ๋ˆ„๊ตฐ๊ฐ€ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ์„ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” cordova plugin์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” indooratlas SDK, NFC, TTS, STT ๋“ฑ์˜ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Cordova plugin์„ ionic ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. Ionic2 ๋ถ€ํ„ฐ๋Š” javascript๊ฐ€ ์•„๋‹Œ typescript๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ์š”, typescript๋Š” javascript์— type์„ ๋งŒ๋“ค์–ด ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  javascript์˜ superset์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ javascript์™€ ๋™์ผํ•œ ์–ธ์–ด์ด์ง€๋งŒ ๋ฌธ๋ฒ•์ด ๋‹ฌ๋ผ cordova plugin์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ionic framework์—์„œ๋Š” โ€œionic-nativeโ€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Ionic-native๋Š” cordova plugin์„ typescript๋กœ ๊ฐ์‹ธ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ฆฌํ•ด๋ณด๋ฉด native ์ฝ”๋“œ๋ฅผ cordova๊ฐ€ javascript ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ์‹ธ๊ณ , ionic framework์—์„œ๋Š” ๊ทธ๊ฒƒ์„ typescript ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ์ด์ฃ . ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ ํ•œ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์™ธ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ ํ•œ ์ถ•์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” IndoorAtlas๋„ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ์˜€๋Š”๋ฐ์š”. ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2.์‹ค๋‚ด์ธก์œ„ IndoorAtlas

2.1. IndoorAtlas๋ž€

์ €ํฌ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ ์‹ค๋‚ด ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„์„ ์œ„ํ•ด ์‹ค๋‚ด์ธก์œ„ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ํ”ํžˆ ์•Œ๊ณ  ๊ณ„์‹œ๋Š” GPS๋Š” ๊ฑด๋ฌผ ๋‚ด์—์„œ๋Š” GPS๊ฐ€ ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด, ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋งŽ์€ ๊ธฐ์ˆ ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์‹ค๋‚ด์ธก์œ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ ์˜ˆ๋กœ Beacon์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, wifi๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์ค‘ ์ €ํฌ๊ฐ€ ์„ ํƒํ•œ ๊ธฐ์ˆ ์€ ์ž๊ธฐ์žฅ์˜ ์™œ๊ณก์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ ์ƒˆ๋“ค์ด ๊ธธ์„ ์ฐพ์„ ๋•Œ ์ง€๊ตฌ์˜ ์ž๊ธฐ์žฅ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์—์„œ ํžŒํŠธ๋ฅผ ์–ป์–ด ๋งŒ๋“  ๊ฒƒ์ธ๋ฐ์š”. ๋’ค์—์„œ ์„ค๋ช… ํ•˜๊ฒ ์ง€๋งŒ ์ฒ ์ƒˆ๊ฐ€ ์ž๊ธฐ์žฅ ์ง€๋„๋ฅผ ํ•™์Šตํ•˜๊ณ  ๊ธธ์„ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์ด ์ž๊ธฐ์žฅ ์‹ค๋‚ด์ธก์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋งค์šฐ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋‚ด์šฉ์€ ์•„๋‹ˆ์ง€๋งŒ ์‹ ๊ธฐํ•ด์„œโ€ฆ ๋ˆ„๊ฐ€ ํ–ˆ๋Š”์ง€ ์ฒ ์ƒˆ๋Š” ์ž˜ ์ฝ”๋”ฉ ๋˜์–ด์žˆ๊ตฐ์š”!


์•„๋ž˜ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ ์ž๊ธฐ์žฅ์ด ์‹ค๋‚ด ์ฒ ์ œ ๊ตฌ์กฐ๋ฌผ์„ ๋งŒ๋‚˜ ์™œ๊ณก๋˜๋ฉด, ๋งˆ์น˜ ์ง€๋ฌธ์ฒ˜๋Ÿผ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋‚˜ํƒ€๋‚œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์Šค๋งˆํŠธํฐ์— ์žˆ๋Š” ์ง€๊ตฌ์ž๊ธฐ์žฅ ์„ผ์„œ๋ฅผ ํ†ตํ•ด ๋งคํ•‘ํ•˜๊ณ  ๊ทธ๊ณณ์˜ ์ž๊ธฐ์žฅ์„ ํ•˜๋‚˜์˜ ์ขŒํ‘œ๋กœ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ง€์ž๊ธฐ๋ฅผ ์ด์šฉํ•œ ์‹ค๋‚ด์ธก์œ„์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.


์•„๋ž˜์˜ ๊ทธ๋ฆผ์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹ค๋‚ด์ธก์œ„ ๊ธฐ์ˆ ์„ ๋น„๊ตํ•œ ๊ฒƒ์ธ๋ฐ, ํ‘œ๋ฅผ ๋ณด์‹œ๋ฉด ์ž๊ธฐ์žฅ ์‹ค๋‚ด์ธก์œ„ ๋ฐฉ๋ฒ•์ด ๋น„๊ต์  ์ •ํ™•ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค!
http://www.indooratlas.com/wp-content/uploads/2016/03/magnetic_positioning_opus_jun2014.pdf

์ด๋Ÿฌํ•œ ์ž๊ธฐ์žฅ ์ธก์œ„๋ฒ•์„ ์ด์šฉํ•ด์„œ ์‹ค๋‚ด์ธก์œ„ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํšŒ์‚ฌ๊ฐ€ IndoorAtlas ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ง™๊ฒŒ๋„ SDK๋ฅผ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” Cordova Plugin์œผ๋กœ๋„ ์ œ๊ณต์„ ํ•ด์ค๋‹ˆ๋‹ค.

2.2.์‚ฌ์šฉ๋ฒ•

๋‹ค์Œ์œผ๋กœ indoorAtlas๋ฅผ ์ด์šฉํ•ด ionic framework๋กœ ์‹ค๋‚ด ์ธก์œ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ดํ”Œ์„ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. indoorAtlas ์ด์šฉํ•˜๋ ค๋ฉด ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1) ์‹ค๋‚ด์ธก์œ„๋ฅผ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฑด๋ฌผ์˜ ์œ„์น˜์™€ ์ธต๋ณ„ ์‹ค๋‚ด ์ง€๋„ ์ž…๋ ฅ ๋‹จ๊ณ„(floor plan)  

https://app.indooratlas.com/ ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด ์›ํ•˜๋Š” ์žฅ์†Œ์— ์›ํ•˜๋Š” ์ง€๋„๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Google Map์„ ํ†ตํ•ด ๋‰ดํ„ดํ™€์˜ ์œ„์น˜๋ฅผ ์ฐพ๊ณ , ๋‰ดํ„ดํ™€3์ธต์— ๋Œ€ํ•œ ์‹ค๋‚ด ์ง€๋„๋ฅผ ์ž…๋ ฅํ•œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ floor plan์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  2) ๊ณต๊ฐ„์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์‹ ํ˜ธ ์ •๋ณด๋ฅผ ๋ชจ์œผ๋Š” ๋‹จ๊ณ„  

Android์˜ Map creator ์–ดํ”Œ์„ ์ด์šฉํ•˜์—ฌ waypoint๋ฅผ ์„ค์ •ํ•˜๊ณ , waypoints ๊ฐ„์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฑธ์–ด๊ฐ€๋ฉด์„œ ๋งต์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค - calibration - waypoint ์„ค์ • ๋ฐ ๊ฒฝ๋กœ ์ €์žฅ
- positioning test
์‹ค์ œ๋กœ ๋งคํ•‘์„ ์™„๋ฃŒํ•œ ๋‰ดํ„ดํ™€ ๋ณต๋„์—์„œ ์›€์ง์—ฌ๋ณธ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ดˆ๋ก์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ๋ถ€๋ถ„์ด mapping์ด ์ž˜ ๋œ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  3) SDK๋ฅผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•ฉ์น˜๋Š” ๋‹จ๊ณ„  

๋งˆ์ง€๋ง‰์œผ๋กœ ionic ํ”„๋กœ์ ํŠธ์— cordova plugin์œผ๋กœ ๋œ SDK๋ฅผ ๋‹ค์šด๋ฐ›์•„ ๋„ฃ๊ณ  ์ฝ”๋”ฉ์„ ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
1. ์ปค๋งจ๋“œ์ฐฝ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ platform์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
cordova platform add android
cordova plugin add cordova-plugin-indooratlas


์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์œ„์™€ ๊ฐ™์ด ํ”„๋กœ์ ํŠธ์— ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ์‹ค์ œ๋กœ ์ €ํฌ๊ฐ€ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜๋“ค์€ jsํŒŒ์ผ์— ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ € ์ค‘์— IndoorAtlas ํŒŒ์ผ์„ ์—ด์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

IndoorAtlas๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ  ๊ทธ ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•จ์ˆ˜๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์ด module.exports๋กœ ์ด ํŒŒ์ผ ์™ธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด์žˆ๋„ค์š”.
3. ์ด์ œ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” typescript ํŒŒ์ผ์— ๊ฐ€์„œ ์„ ์–ธํ•œ ํ›„ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•œ initialize ํ•จ์ˆ˜๋Š” ์•„๊นŒ ์ž…๋ ฅํ•œ floorplan์˜ API key๋ฅผ ๋ฐ›์•„์™€์„œ โ€˜์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์‹ค๋‚ด์ธก์œ„๋ฅผ ์‹คํ–‰ํ•˜๊ฒ ๋‹คโ€™ ๋ผ๊ณ  ์ดˆ๊ธฐํ™”์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฐ–์˜ SDK ํ•จ์ˆ˜๋“ค์€ http://docs.indooratlas.com/develop/cordova/api/ ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

2.3. ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ์˜ ์—ญํ• , ํ–ฅํ›„ ๊ณผ์ œ

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

์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

์‹œ๊ฐ์žฅ์• ์ธ์„ ์ฃผ ์‚ฌ์šฉ์ž๋กœ ์„ค์ •ํ•œ ์ €ํฌ์˜ ์†”๋ฃจ์…˜์—์„œ User Interface๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ โ€˜์ธํ„ฐํŽ˜์ด์Šคโ€™๋ผ๊ณ  ํ•˜๋ฉด ๋– ์˜ฌ๋ฆฌ๋Š”, ๋ˆˆ์— ๋ณด์ด๋Š” ํ™”๋ฉด ๊ตฌ์„ฑ๊ณผ ๋™์‹œ์—, ๋ณด์ด์ง€ ์•Š๋Š” ๋ถ€๋ถ„์—์„œ์˜ interaction ๋˜ํ•œ ์š”๊ตฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์— ์ €ํฌ๋Š” ์ฝ˜ํ…์ธ ์œตํ•ฉ๋””์ž์ธํ•™๋ถ€์˜ โ€˜์ฃผ์—ฌโ€™ ํŒ€๊ณผ ํ˜‘์—…์„ ์ง„ํ–‰ํ•˜์—ฌ ํ™”๋ฉด ๊ตฌ์„ฑ ์™„์„ฑ๋„๋ฅผ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
์‹œ๊ฐ์žฅ์• ์ธ์˜ ๋ชจ๋ฐ”์ผ ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ €ํฌ๊ฐ€ ์‚ฌ์šฉํ•œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํฐ ๊ธ€์”จ, ์ œ์Šค์ฒ˜, TTS์ž…๋‹ˆ๋‹ค. ์ด ์žฅ์—์„œ๋Š”, UI์˜ ์ด๋ก ์ ์ธ ๋ถ€๋ถ„๋ณด๋‹ค๋Š” ์‹ค์ œ ๊ตฌํ˜„ ๋ถ€๋ถ„์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

1. ํฐ ๊ธ€์”จ

์ €ํฌ๋Š” ํฐ ๊ธ€์”จ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ํ™”๋ฉด ๊ตฌ์„ฑ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ๋ฌธ์ œ๋กœ ์ธํ•ด์„œ ํŠน์ • ํ”Œ๋žซํผ์— ํ•œ์ •ํ•œ ํ™”๋ฉด ๋””์ž์ธ์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๋ฅผ ํ”„๋กœ์ ํŠธ ๋‚ด ๊ฒฝ๋กœ์— ์ €์žฅํ•œ ํ›„, html ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<div [@nav1]="nav1State" class="cShadow"><img src="assets/t2img/Navigator1.png"></div>

css ํŒŒ์ผ์—์„œ ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ์œ„์น˜ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ณดํ†ต์€ ์ ˆ๋Œ€์œ„์น˜์ธ pt ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ €ํฌ๋Š” px ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ„์น˜ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

.cShadow{
    position:   absolute;
    padding:    0;
    border:     0;
    width:      765px;
    height:     765px;
    left:       -372px;
    top:        -7px;      
}

getdata

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž๋ฃŒ๋ฅผ ๋ฐ›์•„

outputscreen

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์–ด์š”!

2. ์ œ์Šค์ฒ˜

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

์ œ์Šค์ฒ˜์˜ ๊ฒฝ์šฐ native ๋‹จ์—์„œ ๊ตฌํ˜„์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋” ๋งŽ๊ณ  ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.1 ๊ธฐ๋ณธ ์ œ์Šค์ฒ˜

Angular์˜ Event binding์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ์ธ์‹ํ•˜๊ณ  ์ดํ›„ ํ–‰๋™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ธฐ๋ณธ ์ œ์Šค์ฒ˜๋Š” ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ น click์„ ํ–ˆ์„ ๋•Œ ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 <button (click)="onSave()">Save</button>

์ด ๊ฒฝ์šฐ, Save๋ผ ์ ํžŒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด (click ์ด๋ฒคํŠธ), onSave() method๊ฐ€ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์ด๋ฒคํŠธ ๋ชฉ๋ก์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”. https://coursetro.com/posts/code/59/Angular-4-Event-Binding

์œ ์ €๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด์— ๋”ฐ๋ฅธ ์‹œ์Šคํ…œ ๋ฐ˜์‘์ด ์žˆ๊ฒ ์ฃ ? ๊ฐ€๋ น, ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋ฐ”์ผ ์‚ฌ์šฉ ์‹œ ํ•˜๋Š” ํ–‰๋™๋“ค์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ„๋‹ค๋˜๊ฐ€, ํŠน์ • ํŒŒ์ผ์ด ์‹คํ–‰๋œ๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ์–ด๋–ค action์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ•ด๋‹น event์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’ ๋“ฑ์„ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด event object $event์ž…๋‹ˆ๋‹ค.

<button (click)="myEvent($event)">My Button</button>

๊ด„ํ˜ธ ์•ˆ์— $event object๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜์˜ parameter๋กœ ์ด๋ฒคํŠธ ๋ณ€์ˆ˜๋“ค์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.2 custom event ๊ตฌ์„ฑ

ํ™”๋ฉด ์ „์ฒด์—์„œ ์ž‘๋™ํ•˜๋Š” ์Šค์™€์ดํ”„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ €ํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

T4-to-right.ts(directive)

import { Directive, Input, ElementRef, Renderer, Output, EventEmitter } from '@angular/core';
import { DomController } from 'ionic-angular';

@Directive({
  selector: '[t4-to-right]' // Attribute selector
})

export class T4ToRightDirective {

  @Input('startLeft') startLeft: any;
  @Input('startTop') startTop: any;

  @Output() overDrag: any = new EventEmitter();
  @Output() aaa: number = 0;
  @Output() dighdigh: any = new EventEmitter();
  triggered: boolean = false;

  @Output()
  panpan: EventEmitter<any> = new EventEmitter();
  constructor(public element: ElementRef, public renderer: Renderer, public domCtrl: DomController ) {
  }
ngOnInit(){
   // this.renderer.setElementStyle(this.element.nativeElement, 'position', 'absolute');    
    let hammer = new window['Hammer'](this.element.nativeElement);
    hammer.get('pan').set({ direction: window['Hammer'].DIRECTION_ALL});
    hammer.on('pan', (ev) => {
      this.handlePan(ev);
      this.panpan.emit(ev);
    })
  }
 }

์ด directive ๋Š” ์ฝ”๋“œ ๋‚ด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

<ion-content t4-to-right (pan)="panEvent($event)" (click)="onLongPress($event)">

๋‹ค์Œ๊ณผ ๊ฐ™์ด html ํŒŒ์ผ ํ™”๋ฉด ์ „์ฒด์— directive๋ฅผ ์ •์˜ํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

<div class="interationCircle" [style.left] = "position + 'px'"> <img src="assets/t2img/navCircle2.png"></div>  

์ด๋ฒคํŠธ๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์ด ๋‹ค์‹œ ํ™”๋ฉด ๊ตฌ์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

constructor(public navCtrl: NavController, public navParams: NavParams, private tts: TextToSpeech) {
    this.triggered = false;
    this.position = this.defaultX;
  }  

constructor์—์„œ ํฌ์ง€์…˜ ์ •์˜๋ฅผ ํ•ด ์ค๋‹ˆ๋‹ค.

panEvent(e) {

          if (e.deltaX <= -140 && !this.triggered) {
            this.triggered = true;
            this.position = 66.5;
            //event ์‹คํ–‰
            this.navCtrl.push(T5Page, {}, { animate: false });
          }
          else if (this.position > 66.5) {
        this.position = this.defaultX + e.deltaX;
        if (e.isFinal == true) {
          this.position = this.defaultX;
          this.triggered = false;
        }
      }
    }  

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://drive.google.com/uc?id=0B1b8Ja-hvDJ2X2ZSSFF1WUJQRnc

3. TTS(Text To Speech)

์•„์ด์˜ค๋‹‰ ๊ณต์‹ documents(https://ionicframework.com/docs/) ์—์„œ ํ•„์š”ํ•œ Native plugin์˜ ์„ค๋ช…์„ ์ฝ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ Usage, Supported Platforms์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋จผ์ € ์ฝ์–ด๋ณด์‹  ํ›„ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ฐพ์•„ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…๋„ ๋ชจ๋‘ ์žˆ์–ด document๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ด ๋งค์šฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
Ionic ์—์„œ ์ง€์›ํ•˜๋Š” native plugin์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ๋กœ ๋‹ค์Œ์˜ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ €ํฌ๊ฐ€ ์‚ฌ์šฉํ•œ Text to speech ๊ธฐ๋Šฅ์„ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1) Cordova plugin์„ ์„ค์น˜ํ•œ๋‹ค.

๊ฐ€์žฅ ๋จผ์ € ์„ค์น˜ ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

$ ionic cordova plugin add cordova-plugin-tts
$ npm install --save @ionic-native/text-to-speech

๋Œ€๋ถ€๋ถ„์˜ native plugin์€ ์œ„์™€ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€๋ฅผ ์„ค์น˜ํ•˜๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ„ฐ๋ฏธ๋„ ๋“ฑ์—์„œ ์ž…๋ ฅํ•˜๋ฉด ์„ค์น˜๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

2) appโ€™s module์— ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•˜์—ฌ appโ€™s NgModule์— ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ๋กœ๋Š” ํ”„๋กœ์ ํŠธ์˜ /src/app/app.module.ts ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ import ํ•ด์ฃผ์„ธ์š”.

  import { TextToSpeech } from '@ionic-native/text-to-speech';

๊ทธ ํ›„ NgModule ๋‚ด์˜ providers์— ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@NgModule({
โ€ฆ
providers: [
โ€ฆ
TextToSpeech,
โ€ฆ
]})

์ด์ œ ๋ชจ๋“  ์‚ฌ์šฉ ์ค€๋น„๋ฅผ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค!

3) ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํŽ˜์ด์ง€์˜ .ts ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ์ผ ์ƒ๋‹จ import๋ฅผ 2)๊ณผ ๋™์ผํ•˜๊ฒŒ ํ•˜๊ณ ,

 import { TextToSpeech } from '@ionic-native/text-to-speech';

constructor์—์„œ ์ •์˜ํ•œ ํ›„์— ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

constructor(public navCtrl: NavController, public navParams: NavParams, private tts: TextToSpeech) {
 }

์ €ํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

async speak(line): Promise<any> {
try {
  await this.tts.speak({
    text: line,
    locale: 'ko-KR',
    rate: 1
  });
  console.log('speak function start!');
 }
catch (e) {
  console.log(e);
 }
}

์‹ค์ œ ์‚ฌ์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ ์‰ฝ์ฃ ?

this.speak(`์Šคํƒ€์ผ์ฒดํฌ๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”. ๋จผ์ € ์Œ์„ฑ์•ˆ๋‚ด๋ฅผ ๋ฐ›์•„, ์Šคํƒ€์ผ์ฒดํฌ ๋ธ”๋ก ์žฅํŒ์œผ๋กœ ์ด๋™ํ•ด ์ฃผ์„ธ์š”!
์Šคํƒ€์ผ์ฒดํฌ ๋ณผ๋ก ์žฅํŒ์— ๋ฐ”๋ฅด๊ฒŒ ์„œ๋ฉด ํšจ๊ณผ์Œ๊ณผ ํ•จ๊ป˜ ์Šคํƒ€์ผ์ฒดํฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๋„ค, ์Šคํƒ€์ผ ๋ณผ๋ก ์žฅํŒ์— ์„œ์…จ์–ด์š”. ๋‘๋ฒˆ ํƒญํ•˜์‹œ๋ฉด ์Šคํƒ€์ผ ์ฒดํฌ๊ฐ€ 5์ดˆ ํ›„์— ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.`);

`(backtick/backquote)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ์ค„์„ ๋™์‹œ์— string์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

ํ‰๊ฐ€

๋ณดํ†ต์˜ ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ์™€ ๋‹ค๋ฅด๊ฒŒ UI ์š”์†Œ์— ์ดˆ์ ์„ ๋งž์ถ”์–ด ๋จผ์ € ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— UI์  ๋ถ€๋ถ„์— ์žˆ์–ด์„œ๋Š” ๊ธฐ์—ฌ๋ฅผ ํ–ˆ์ง€๋งŒ, ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ ์ธ ๋ถ€๋ถ„์„ ๋จผ์ € ๊ตฌ์ถ•ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ด ์•„์‰ฌ์›€์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ๊ณผ์ œ

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

Clone this wiki locally