๐Ÿ’ฆ ํŽ˜์–ด ํ™œ๋™ ๊ธฐ๋ก_Day8 - boostcampwm-2022/web33-Mildo GitHub Wiki

1. AํŒ€(ํ•œ๋นˆ, ์ƒ์ค€)

1.1. ์ด์Šˆ ๋ถ„๋ฐฐ

  • ๋„ค์ด๋ฒ„ ์ง€๋„ API ์—ฐ๊ฒฐ
  • ์ง€๋„ ์ดˆ๊ธฐ ํ™”๋ฉด์„ ์„œ์šธ ์ค‘์‹ฌ์œผ๋กœ ์ถœ๋ ฅ

1.2. ๊ตฌํ˜„ ๋ชฉํ‘œ

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ๋„ค์ด๋ฒ„ ์ง€๋„ ํ™”๋ฉด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  • ๊ธฐ์กด ์ด์Šˆ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋‚˜๋ˆ ์„œ ์„ธ๋ถ€ ๋ชฉํ‘œ ์ž‘์„ฑ
  • branch name : feature/map

1.3 ์„ธ๋ถ€ ๋ชฉํ‘œ

1.3.1. Mildo์— ๋„ค์ด๋ฒ„ ์ง€๋„ API ๊ฐ€์ ธ์™€์„œ ๋ณด์—ฌ์ฃผ๊ธฐ

  • ๋„ค์ด๋ฒ„ ์ง€๋„ API ์‚ฌ์šฉ๋ฒ• ์ตํžˆ๊ธฐ
  • nCloud์—์„œ API ์ด์šฉ ์‹ ์ฒญํ•˜๊ณ  ํ”„๋กœ์ ํŠธ url ์ถ”๊ฐ€
    • ํ•œ๋นˆ์ด ์ด์ „์— ์‚ฌ์šฉํ•œ ์„œ๋น„์Šค๋ฅผ ์ ์šฉํ•˜์˜€๊ณ , ํ˜„์žฌ url์€ localhost
    • Web Dynamic Map ์‚ฌ์šฉ
  • Application Key์—์„œ Client ID ๊ฐ€์ ธ์˜ค๊ธฐ
  • url๊ณผ Client ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— API ์—ฐ๊ฒฐํ•˜๊ธฐ
    • public/index.html์˜ head์— script ํƒœ๊ทธ์˜ src ์†์„ฑ์— ํ•ด๋‹น ๋‚ด์šฉ ์ถ”๊ฐ€
  • typescript ํƒ€์ž… ์„ค์ •์„ ์œ„ํ•œ @types/navermaps ์„ค์น˜
  • ๋งต ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
    • ๋งต์„ ๊ทธ๋ฆด DOM ์š”์†Œ ์ƒ์„ฑ
    • map ์˜ต์…˜ ์„ค์ •ํ•˜๊ธฐ(์œ„์น˜, ์คŒ ๋“ฑ)
    • DOM์— ๋„ค์ด๋ฒ„ ์ง€๋„ ๊ทธ๋ ค์ฃผ๊ธฐ
  • ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ™•์ธ
  • ์ฐธ๊ณ  ์ž๋ฃŒ

1.4. ์˜์‚ฌ๊ฒฐ์ •

1.4.1. ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ์ง€๋„ ๋ฉ”์ธ ํ™”๋ฉด ๊ตฌ์„ฑ

  • Map ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  MainPage๋Š” ๋ณ„๋„๋กœ ์ƒ์„ฑ?
    • Map ๊ด€๋ จ ๋กœ์ง์ด ๋”ฐ๋กœ ์žˆ๋Š”์ง€?
  • ๋ฉ”์ธ ํ™”๋ฉด ๊ตฌ์„ฑ์ด ์ง€๋„ ์ž‘์—…์— ํฌํ•จ๋˜๋Š”๊ฐ€?
    • ๋ฉ”์ธ ํ™”๋ฉด : ์ง€๋„๋ฅผ ๋„์–ด์ฃผ๊ณ , ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ชจ๋ฐ”์ผ UI์— ๋งž๊ฒŒ ์„ค์ • (O)
    • ๋ฉ”์ธ ํ™”๋ฉด์˜ ๊ตฌ์„ฑ ์š”์†Œ : ๊ฒ€์ƒ‰๋ฐ”, ํ•„ํ„ฐ ๋“ฑ๋“ฑ (X)

1.4.2. ์˜๋…ผ ์‚ฌํ•ญ

  • mainPage๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์•ผ ํ• ๊นŒ?
    • ์–ด์ฐจํ”ผ spa ๊ตฌํ˜„์ด๋‹ˆ๊นŒ Map ์ปดํฌ๋„ŒํŠธ๋ฅผ mainPage์ฒ˜๋Ÿผ ์‚ฌ์šฉ?
    • ํ™•์žฅ์„ฑ ๊ณ ๋ คํ•ด์„œ Map, ๊ฒ€์ƒ‰๋ฐ”, ํ•„ํ„ฐ ๋“ฑ์„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ œ์ž‘ํ•˜๊ณ  mainPage๋ฅผ ๋ณ„๋„๋กœ ๊ตฌ์„ฑ?
    • ์šฐ์„  AํŒ€์—์„œ 2๋ฒˆ์งธ ์•ˆ์œผ๋กœ ์ž ์ • ๊ฒฐ์ •
  • ๋ชจ๋‹ฌ์ด ์ปดํฌ๋„ŒํŠธ์ธ๊ฐ€? โ†’ ๋ชจ๋‹ฌ์˜ ๋ ˆ์ด์•„์›ƒ(Wrapper)๊ณผ ๋ชจ๋‹ฌ์˜ ๋‚ด์šฉ๋ฌผ์„ ์„œ๋กœ ๋ถ„๋ฆฌํ•˜์ž!
    • ๋ชจ๋‹ฌ์˜ ๋‚ด๋ถ€์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋˜ ๋“ค์–ด๊ฐ€๋Š” ์ƒํ™ฉ์ด๋ฉด, ๋ชจ๋‹ฌ ์ž์ฒด๋ฅผ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‚˜?
      • components, pages, modals๊ฐ€ ๋‹ค ๋ณ„๋„๋กœ ์กด์žฌ?
  • Geocoding(์ค‘์š”๋„ : ํ•˜)
    • ์ฃผ์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ขŒํ‘œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
    • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

2. BํŒ€(ํ˜„์ •, ์œค์šฐ)

2.1. ์ด์Šˆ ๋ถ„๋ฐฐ

  • express ์„œ๋ฒ„ ์—ฐ๊ฒฐ
  • ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ API ์—ฐ๊ฒฐ
  • ์ฃผ์š” ์žฅ์†Œ 50๊ณณ์— ๋Œ€ํ•œ ์ธ๊ตฌ๋ฐ€๋„/์œ„๋„/๊ฒฝ๋„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

2.2. ๊ตฌํ˜„ ๋ชฉํ‘œ

  • ๋ฐฑ์—”๋“œ์—์„œ ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • branch name : feature/connect-seoul-api

2.3. ํ•  ์ผ

  • express ์„œ๋ฒ„ ์—ฐ๊ฒฐ
  • ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ API ์—ฐ๊ฒฐ
  • ์ฃผ์š” ์žฅ์†Œ 50๊ณณ์— ๋Œ€ํ•œ ์ธ๊ตฌ๋ฐ€๋„, ์žฅ์†Œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
    • ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ ์žฅ์†Œ, ์ธ๊ตฌ๋ฐ€๋„, ์œ„๋„/๊ฒฝ๋„X
    • ๋„ค์ด๋ฒ„ geocoding api ์œ„๋„/๊ฒฝ๋„
  • github secrets์—๋‹ค ๋ฐฐํฌ์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ •์˜

2.4. ์˜์‚ฌ๊ฒฐ์ •

2.4.1. xml2js

  • ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ API์—์„œ๋Š” xml ํ˜•์‹์œผ๋กœ๋งŒ ์‘๋‹ต์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Œ
    • ๊ณต์‹ ์‚ฌ์ดํŠธ์— json ํ˜•์‹์œผ๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€์žˆ์–ด ์‹œ๋„ํ•ด๋ดค์ง€๋งŒ xml ํ˜•์‹๋งŒ ์ง€์›ํ•œ๋‹ค๊ณ  ์‘๋‹ต
  • ํŒŒ์‹ฑ์ด ์ฃผ๋œ ๋ชฉํ‘œ๊ฐ€ ์•„๋‹ˆ์—ˆ๊ณ , ๋น ๋ฅด๊ฒŒ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด xml2js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ xmlํŒŒ์ผ์„ json ํ˜•์‹์œผ๋กœ ํŒŒ์‹ฑ

2.5. ๊ตฌํ˜„ ๋‚ด์šฉ

2.5.1. ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ ์ฃผ์š” 50๊ณณ ์‘๋‹ต ํ™•์ธ

  • ์„œ์šธ ์ฃผ์š” 50๊ณณ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” api ์š”์ฒญ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— 50๊ณณ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์š”์ฒญ์„ ํ•ด์•ผ๋จ
  • ์„œ์šธ ์ฃผ์š” 50๊ณณ์— ๋Œ€ํ•ด ์ƒ์ˆ˜๋กœ ๋ชจ๋‘ ์ž‘์„ฑ
  • ์„œ์šธ ์ฃผ์š” 50๊ณณ์— ๋Œ€ํ•ด api๊ฐ€ ์‘๋‹ต์„ ๋ชจ๋‘ ํ•˜๋Š”์ง€ ํ™•์ธ

2.5.2. ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ API ์‘๋‹ต ๊ฐ€๊ณต

  • ์„œ์šธ ๋„์‹œ ๋ฐ์ดํ„ฐ์˜ ์š”์ฒญ์œผ๋กœ json์ด ์•„๋‹Œ xml๋ฐ–์— ์‘๋‹ต๋ฐ›์„ ์ˆ˜ ์—†์–ด xml2js ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜์—ฌ ํŒŒ์‹ฑ

  • ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ API ์‘๋‹ต์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€๊ณตํ•˜์—ฌ res.send ํ•จ

  • ๊ฒฐ๊ณผ

    {
      "ok": true,
      "data": [
        {
          "areaName": [
            "๊ฒฝ๋ณต๊ถยท์„œ์ดŒ๋งˆ์„"
          ],
          "populationMin": [
            "6000"
          ],
          "populationMax": [
            "6500"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "๊ด‘ํ™”๋ฌธยท๋•์ˆ˜๊ถ"
          ],
          "populationMin": [
            "7500"
          ],
          "populationMax": [
            "8000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "์ฐฝ๋•๊ถยท์ข…๋ฌ˜"
          ],
          "populationMin": [
            "5000"
          ],
          "populationMax": [
            "5500"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "๊ฐ•๋‚จ MICE ๊ด€๊ด‘ํŠน๊ตฌ"
          ],
          "populationMin": [
            "2500"
          ],
          "populationMax": [
            "3000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "๋™๋Œ€๋ฌธ ๊ด€๊ด‘ํŠน๊ตฌ"
          ],
          "populationMin": [
            "18000"
          ],
          "populationMax": [
            "20000"
          ],
          "populationLevel": [
            "๋ณดํ†ต"
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "๋ช…๋™ ๊ด€๊ด‘ํŠน๊ตฌ"
          ],
          "populationMin": [
            "14000"
          ],
          "populationMax": [
            "16000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "์ดํƒœ์› ๊ด€๊ด‘ํŠน๊ตฌ"
          ],
          "populationMin": [
            "4500"
          ],
          "populationMax": [
            "5000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "์ž ์‹ค ๊ด€๊ด‘ํŠน๊ตฌ"
          ],
          "populationMin": [
            "22000"
          ],
          "populationMax": [
            "24000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "์ข…๋กœยท์ฒญ๊ณ„ ๊ด€๊ด‘ํŠน๊ตฌ"
          ],
          "populationMin": [
            "12000"
          ],
          "populationMax": [
            "14000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "ํ™๋Œ€ ๊ด€๊ด‘ํŠน๊ตฌ"
          ],
          "populationMin": [
            "38000"
          ],
          "populationMax": [
            "40000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "๊ตญ๋ฆฝ์ค‘์•™๋ฐ•๋ฌผ๊ด€ยท์šฉ์‚ฐ๊ฐ€์กฑ๊ณต์›"
          ],
          "populationMin": [
            "400"
          ],
          "populationMax": [
            "500"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "๋‚จ์‚ฐ๊ณต์›"
          ],
          "populationMin": [
            "7500"
          ],
          "populationMax": [
            "8000"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        {
          "areaName": [
            "๋š์„ฌํ•œ๊ฐ•๊ณต์›"
          ],
          "populationMin": [
            "2000"
          ],
          "populationMax": [
            "2500"
          ],
          "populationLevel": [
            "์—ฌ์œ "
          ],
          "updatedAt": [
            "2022-11-16 22:35"
          ]
        },
        ...
        ...
        ...
        ...
      ]
    }
    

2.6. Trouble Shooting

2.6.1. ๊ฐ์ฒด ์ˆœํšŒ, ๋ฐฐ์—ด ์ˆœํšŒ


for (const index in Array) {
	console.log(index); // index ์ถœ๋ ฅ
}

for (const value of Array) {
	console.log(value); // value ์ถœ๋ ฅ
}

for (const key in Object) {
	console.log(key); // key๊ฐ’ ์ถœ๋ ฅ
}
  • ๋ฌธ์ œ์  : ๋ฐฐ์—ด์— ์ง€์—ญ ์ด๋ฆ„(string)์ด ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”๋ฐ ์ˆซ์ž(number)๊ฐ€ push๋˜๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • ์›์ธ : ๊ฐ์ฒด ์ˆœํšŒ, ๋ฐฐ์—ด ์ˆœํšŒ๋ฅผ ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•˜๊ณ  ์žˆ์—ˆ์Œ
  • ํ•ด๊ฒฐ : 1๋ฒˆ ๋ฐฉ๋ฒ• โ†’ 3๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝ
  • 21, 33, 36, 39, 42๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ˆซ์ž๋“ค์€ ์šฐ์—ฐํžˆ ๊ฐ๊ฐ ๋‹ด๋‹นํ•˜๋Š” ์ง€์—ญ ์•„์ด๋””๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์–ด์„œ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ตํ•จ
  • 21, 33, 36, 39, 42๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ง€์—ญ์€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ API์—์„œ INFO-200 ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•จ
    • INFO-200 : ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

2.7. ๋‚ด์ผ ํ•  ์ผ

  • res.send โ†’ res.json ์œผ๋กœ ๋ณ€๊ฒฝ
  • ์„œ๋ฒ„ ์˜ค๋ฅ˜ ์ƒํƒœ ์ฝ”๋“œ ๋…ผ์˜
  • ๋„ค์ด๋ฒ„ geocoding api๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋…ผ์˜(ํ•œ ๋ฒˆ๋งŒ ๊ฐ€์ ธ์˜ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์Œ)
  • 50๊ณณ์— ๋Œ€ํ•ด ๋™๊ธฐ์ ์œผ๋กœ ๋ง๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ๋  ๊ฒƒ ๊ฐ™์Œ, promise.all