Skip to content

Latest commit

ย 

History

History
173 lines (132 loc) ยท 6.15 KB

frontend-mission.md

File metadata and controls

173 lines (132 loc) ยท 6.15 KB

๐Ÿคนโ€โ™‚๏ธ ํ”„๋ก ํŠธ์—”๋“œ ๋ฏธ์…˜

ํ˜„์žฌ ์ง€ํ•˜์ฒ  ์•ฑ์˜ ํ”„๋ก ํŠธ์—”๋“œ๋Š” Vuejs ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธ‰์ฒด๋ฅผ ํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„์ด ๋น ๋ฅด๊ฒŒ api๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ฑ
๋‹คํ–‰ํžˆ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌธ์˜ํ•ด๋ณธ ๊ฒฐ๊ณผ, Vuejs๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ ์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค”


๐Ÿš€ Getting Started

cd frontend
npm install
npm start
  • frontend ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • localhost:8081 ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ์š”๊ตฌ์‚ฌํ•ญ

  • 1. ๋ฐฑ์—”๋“œ ์š”๊ธˆ ์กฐํšŒ api๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์—ฐ๋™
  • 2. ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•ด ํ˜„์žฌ ์‹œ๊ฐ„์„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ธฐ ํŽธํ•œ ํ˜•์‹์œผ๋กœ ๋ฌธ์ž์—ด ๋ Œ๋”๋ง
  • 3. validator๋ฅผ ๊ตฌํ˜„ํ•ด, form์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌ
  • 4. ๊ธธ์ฐพ๊ธฐ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์„ ์ด์šฉํ•ด ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„

๐Ÿ“‘ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ์ƒ์„ธ ์„ค๋ช…

1. ์š”๊ธˆ ์กฐํšŒ api๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์—ฐ๋™

๋ฐฑ์—”๋“œ์—์„œ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์š”๊ธˆ์กฐํšŒ์˜ api๋ฅผ ์ง์ ‘ ํ”„๋ก ํŠธ์—”๋“œ์— ์—ฐ๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • frontend/src/api/modules/path.js ์— ๋ฐฑ์—”๋“œ์—์„œ ๊ตฌํ˜„ํ•œ path ๊ฒ€์ƒ‰ api์˜ endpoint๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
const PathService = {
  get() {
    return ApiService.get(``)
  }
}
  • ์œ„ apiService๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์€ frontend/src/store/modules/path.js ์ž…๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๋ถ„์ด api๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ ํ•  ๋ถ€๋ถ„์€ actions์˜ PathService.get() ๋ถ€๋ถ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค.
const actions = {
  async searchPath({ commit }, {}) {
    return PathService.get().then(({ data }) => {
      commit('setPath', data)
    })
  }
}
  • api ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด, ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ํ™•์ธํ•˜๊ณ , ๋ Œ๋”๋ง์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

  • frontend/src/store/modules/path.js ์— ๊ตฌํ˜„๋œ ๊ฐ์ฒด๋“ค์˜ ์—ญํ• ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • actions - api ๋น„๋™๊ธฐ ์š”์ฒญ
    • mutations - ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ƒํƒœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
    • getters - ์ปดํฌ๋„ŒํŠธ๋“ค์—์„œ ํŠน์ • ์ƒํƒœ๊ฐ’์„ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” getter


2. validator ๊ตฌํ˜„

  • path์™€ departureTime form์˜ validation์„ ๊ตฌํ˜„ํ•˜๊ธฐ
  • ๊ณตํ†ต์ ์œผ๋กœ๋Š” ๋นˆ ๊ฐ’์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • path form์—์„œ ํ•„์š”ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
    • source: ์œ ํšจํ•œ Id ๊ฐ’์ธ์ง€ ๊ฒ€์‚ฌ (์˜ˆ๋ฅผ ๋“ค๋ฉด, ์–‘์˜ ์ •์ˆ˜, ์ž์—ฐ์ˆ˜ ๋“ฑ)
    • target: ์œ ํšจํ•œ Id ๊ฐ’์ธ์ง€ ๊ฒ€์‚ฌ (์˜ˆ๋ฅผ ๋“ค๋ฉด, ์–‘์˜ ์ •์ˆ˜, ์ž์—ฐ์ˆ˜ ๋“ฑ)
  • departureTime form์—์„œ ํ•„์š”ํ•œ ๊ฒ€์‚ฌ
    • dayTime: '์˜ค์ „' or '์˜คํ›„'์ธ์ง€ ๊ฒ€์‚ฌ
    • hour: ์ˆซ์ž ํƒ€์ž…, 1~12 ์‚ฌ์ด์˜ ์ •์ˆ˜์ธ์ง€ ๊ฒ€์‚ฌ
    • minute: ์ˆซ์ž ํƒ€์ž…, 0~60 ์‚ฌ์ด์˜ ์ •์ˆ˜์ธ์ง€ ๊ฒ€์‚ฌ

  • ํ˜„์žฌ ๋‹ค๋ฅธ ํŽ˜์ด์ง€ form๋“ค์˜ validation์ด frontend/src/utils/validator.js ๊ตฌํ˜„๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  • path ๊ฒ€์ƒ‰์„ ์œ„ํ•œ form๊ณผ, departureTime form์˜ validation์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • validation์€ Array์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ value๋ฅผ checkํ•  ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
stationName: [(v) => !!v || '์ด๋ฆ„ ์ž…๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.', (v) => v.length > 0 || '์ด๋ฆ„์€ 1๊ธ€์ž ์ด์ƒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.'],
  • path, departureTime form ๋ชจ๋‘ validator๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ ์šฉ๋˜๊ฒŒ๋” ์„ค์ •๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ validator๋งŒ ๊ตฌํ˜„ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
const validator = {
  path: {
    source: [],
    target: []
  },
  departureTime: {
    dayTime: [],
    hour: [],
    minute: []
  }
}


3. ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ฃผ๋Š” getCurrentTime ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  • ํ˜„์žฌ์‹œ๊ฐ„์„ ์•„๋ž˜ format์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก, frontend/src/views/path/pathPage.vue ์˜ 208line์— ์žˆ๋Š” getCurrentTime์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์„ธ์š”.
  • ์‚ฌ์šฉ์˜ˆ์‹œ
getCurrentTime() {
   //ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์™€, ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์„ธ์š”.
  return '์˜คํ›„ 17:08'
}


4. ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” onSearchResult ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  • ์š”๊ธˆ์กฐํšŒ๋ฅผ ์œ„ํ•ด ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • frontend/src/views/path/PathPage.vue์—์„œ onSearchResult()๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • onSearchResult() ๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์€ ๊ฐ’์„ ์ด์šฉํ•ด ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ณ , response๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
  • try ~ catch ๋ฌธ์—์„œ try ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • api ์š”์ฒญํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” this.searchPath() ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ถœ๋ฐœ์—ญ, ๋„์ฐฉ์—ญ์˜ ๊ฐ’์€ ์ž๋™์œผ๋กœ this.path ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
// this.path๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
path: {
  source: sourceId,
  target: targetId,
  type: PATH_TYPE
}

// this.PATH_TYPE์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
PATH_TYPE: {
  DISTANCE: 'DISTANCE',
  DURATION: 'DURATION',
  ARRIVAL_TIME: 'ARRIVAL_TIME'
}
  • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์€ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ๊ฐ’์€ this.departureTimeView ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ๋น ๋ฅธ ๋„์ฐฉ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ YYYYMMDDHHmm ํ˜•ํƒœ๋กœ time์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณด๋‚ด์ฃผ์„ธ์š”.
  • ์‚ฌ์šฉ์˜ˆ์‹œ
const hour = this.departureTimeView.hour
const minute = this.departureTimeView.minute
const time = YYYYMMDDHHmm

//์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋˜๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ
this.searchPath({ ...this.path })

// ๋น ๋ฅธ ๋„์ฐฉ์„ ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ
this.searchPath({ ...this.path, time })

์ฐธ๊ณ 

  • ...์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋ฒ•์€ Spread Operator๋ผ๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.