๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ก์›น ํ”„๋กœ์ ํŠธ/(ํ”„๋ก ํŠธ์—”๋“œ) ๋งˆ์ผ“์ปฌ๋ฆฌ - ํด๋ก ์ฝ”๋”ฉ

์ฃผ์†Œ ์ž…๋ ฅ ๊ตฌํ˜„(daum ์ฃผ์†Œ api)

๊ณต์‹ API ํ™ˆํŽ˜์ด์ง€> http://postcode.map.daum.net/guide 

1. script์— postcode ์ถ”๊ฐ€

index.html์— ์•„๋ž˜์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€

<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>

 

2. ์ฃผ์†Œ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ ๊ตฌํ˜„ (pages/ShopBasketPage.vue)

  • ์ฃผ์†Œ ์ž…๋ ฅ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, showApi() ์‹คํ–‰
  • api์—์„œ ์ฃผ์†Œ ์„ ํƒํ•˜๋ฉด ์ƒ์„ธ ์ฃผ์†Œ ์ž…๋ ฅ ๋ชจ๋‹ฌ ์ฐฝ ๋‚˜ํƒ€๋‚ด๊ธฐ
  • ์ƒ์„ธ ์ฃผ์†Œ ์ž…๋ ฅ ํผ์—์„œ ์ €์žฅ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, setAddress() ์‹คํ–‰

 

2-1) ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ

<template>
  <div id="shopbasketpage">
    <div id="form">
      <div>
        <b-icon icon="geo-alt"></b-icon>๋ฐฐ์†ก์ง€
      </div>
      
      <-- ์ฃผ์†Œ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ -->
      <button class="button-style1" @click="showApi">์ฃผ์†Œ ๊ฒ€์ƒ‰</button>
      
      <-- ์ƒ์„ธ ์ฃผ์†Œ ์ž…๋ ฅ ํผ -->
      <div>
        <b-modal id="modal" ref="addr2-modal" hide-footer title="์ƒ์„ธ ์ฃผ์†Œ ์ž…๋ ฅ" centered>
          <div class="d-block">
            <div class="d-addr1">{{ addr.addr1 }}</div> 
            <div class="d-addr2">
              <input 
              type="text" 
              required 
              v-model="addr.addr2" 
              @keyup.enter="setAddress(addr)"
              placeholder="๋‚˜๋จธ์ง€ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"/>
            </div>
          </div>
          <div class="d-btns">
            <b-button type="reset" @click="addr.addr2 = '';">๋ฆฌ์…‹</b-button>
            <b-button type="submit" variant="primary" @click="setAddress(addr)">์ €์žฅ</b-button>
          </div> 
        </b-modal>
      </div>
      
    </div>
  </div>
</template>

 

2-2) ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ

<script>
export default {
  name: "ShopBasketPage",
  data() {
    return {
      addr: 
        {
          zip: '',
          addr1: '',
          addr2: '',
        }
    }
  },
  methods: {
    showApi() {
        new window.daum.Postcode({ 
            oncomplete: (data) => {
                let fullRoadAddr = data.roadAddress; // ๋„๋กœ๋ช… ์ฃผ์†Œ ๋ณ€์ˆ˜ 
                let extraRoadAddr = ''; // ๋„๋กœ๋ช… ์กฐํ•ฉํ˜• ์ฃผ์†Œ ๋ณ€์ˆ˜

                if(data.bname !== '' && /[๋™|๋กœ|๊ฐ€]$/g.test(data.bname)){
                    extraRoadAddr += data.bname; 
                }

                if(data.buildingName !== '' && data.apartment === 'Y'){ 
                    extraRoadAddr += (extraRoadAddr !== '' ? ', ' + data.buildingName : data.buildingName); 
                } // ๋„๋กœ๋ช…, ์ง€๋ฒˆ ์กฐํ•ฉํ˜• ์ฃผ์†Œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๊ด„ํ˜ธ๊นŒ์ง€ ์ถ”๊ฐ€ํ•œ ์ตœ์ข… ๋ฌธ์ž์—ด์„ ๋งŒ๋“ ๋‹ค. 

                if(extraRoadAddr !== ''){ 
                    extraRoadAddr = ' (' + extraRoadAddr + ')'; 
                } // ๋„๋กœ๋ช…, ์ง€๋ฒˆ ์ฃผ์†Œ์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ ํ•ด๋‹น ์กฐํ•ฉํ˜• ์ฃผ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 

                if(fullRoadAddr !== ''){ 
                    fullRoadAddr += extraRoadAddr; 
                } // ์šฐํŽธ๋ฒˆํ˜ธ์™€ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ํ•ด๋‹น ํ•„๋“œ์— ๋„ฃ๋Š”๋‹ค. 

                this.addr.zip = data.zonecode; //5์ž๋ฆฌ ์ƒˆ์šฐํŽธ๋ฒˆํ˜ธ ์‚ฌ์šฉ
                this.addr.addr1 = fullRoadAddr;
                
                
                this.$refs['addr2-modal'].show() //์ƒ์„ธ ์ฃผ์†Œ ์ž…๋ ฅ ๋ชจ๋‹ฌ ์ฐฝ ๋ณด์ด๊ธฐ
            }
        }).open()
    },
  },
};
</script>

 

3. ์ž…๋ ฅํ•œ ์ฃผ์†Œ vuex์— ์ €์žฅ (store/index.js)

export const store = new Vuex.Store({
    state: {
    	//ordersheet ์Šคํ…Œ์ดํŠธ ์ถ”๊ฐ€	
        ordersheet: {
            addr: '',
            orderProduct: '',
        }
    },
    actions: {
        setAddress({commit},addr) {
            commit("setAddress", addr);
        }

    },
    mutations: {
        setAddress(state, addr) {
            console.log("setAddress");
            console.log("addr ", addr);
            state.ordersheet.addr = addr;  //ordersheet ์Šคํ…Œ์ดํŠธ์˜ addr์˜ ๊ฐ’์„ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ์ €์žฅ
        },
    },
})