Vue + Nuxt 날씨 서비스 만들기 – 3.Router와 Store 세팅

1.Router 세팅

페이지 이동을 담당하는 라우터를 세팅하겠습니다.
Nuxt에서는 폴더구조에 따라 자동으로 라우팅을 지원합니다
아래와 같이 폴더 구조를 만듭니다.

/pages
 └location
   _id.vue
 index.vue

간단한 구조지만 아래와 같은 라우팅을 선언한 것과 동일합니다.

routes: [
    {
        name: 'index',
        path: '/',
        component: 'pages/index.vue'
    },
    {
        name: 'location',
        path: '/location/:id?',
        component: 'pages/location/_id.vue'
    },
]

/(루트)로 접근시 index.vue 파일을 보여주고,
/location/지역명 으로 접근시 _id.vue 파일을 보여줍니다.

2.Store 세팅

서비스에서 상태관리 요소를 세팅하겠습니다.
일반 페이지에서 data로 사용할 수도 있지만 추후 기능 추가나 유지보수를 위해서 store로
관리하도록 하겠습니다.

state

state에서 관리할 요소는 크게 3가지입니다.

appid : Open API 호출에 사용할 App ID
currentLocation : 현재 지역 정보 (영문명, 한글명, 좌표)
locations : 사용할 지역 리스트 (서울,부산,광주,대전,강릉)

appid: '***',
currentLocation: {
    nameeng: 'Seoul',
        namekor: '서울',
        lat: '37.5683',
        lon: '126.9778'
},
locations: [
    {
        nameeng: 'Seoul',
        namekor: '서울',
        lat: '37.5683',
        lon: '126.9778'
    },
    {
        nameeng: 'BuSan',
        namekor: '부산',
        lat: '35.138311',
        lon: '129.0216844'
    },
    {
        nameeng: 'GwangJu',
        namekor: '광주',
        lat: '35.1594477',
        lon: '126.8446427'
    },
    {
        nameeng: 'DaeJeon',
        namekor: '대전',
        lat: '36.350461',
        lon: '127.3826247'
    },
    {
        nameeng: 'GangNeung',
        namekor: '강릉',
        lat: '37.7519967',
        lon: '128.8059146'
    },
]

getters

state를 가져오는 getters는 현재 지역 정보만 가져옵니다.

export const getters = {
    getCurrentLocation : state => {
        return state.currentLocation;
    }
}

mutations

state를 바꾸는 mutations는 현재 지역 정보만 변경합니다.

export const mutations = {
    setCurrentLocation(state, payload) {
        state.currentLocation = payloca;
    }
}

actions

actions에는 3가지 요소가 들어가며 api를 호출합니다.
날씨 정보, 대기 정보, 위치 정보 api를 사용합니다.
형태는 모두 비슷합니다.

async fetchWeatherData({commit, state}, geoInfo) {
    return new Promise((resolve, reject) => {
        const prm = {
            params: {
                lat: geoInfo.lat,
                lon: geoInfo.lon,
                exclude: '',
                appid: state.appid
            }
        }
        this.$axios.$get('https://api.openweathermap.org/data/2.5/onecall', prm)
            .then((result) => {
                resolve(result);
            })
            .catch(err => {
                reject(err);
            })
    })
}

라우터와 스토어 세팅이 끝났습니다.
스토어의 actions에서 가져온 api 정보를 바탕으로
이제 view 페이지에 데이터를 뿌려 보겠습니다.