# ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ(Destructuring)
๋์คํธ๋ญ์ฒ๋ง์ด๋ผ๊ณ ํ๋ ์ด ES6 ๋ฌธ๋ฒ์ ํ๊ธ๋ก ๋ฒ์ญํ๋ฉด ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ๋๋ค. ๊ตฌ์กฐ ๋ถํด(?)๋ผ๋ ์ต์ง์ค๋ฌ์ด ์ฉ์ด๋ฅผ ์ค๋ช ํ๊ธฐ ์ ์ ์ฌ๊ธฐ์ ๋งํ๋ '๊ตฌ์กฐ'๋ผ๋ ๋จ์ด๋ฅผ ๋จผ์ ํ์ ํด๋ณด๊ฒ ์ต๋๋ค.
# ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ์์์ '๊ตฌ์กฐ'
๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var arr = [1, 2, 3, 4];
var obj = {
a: 10,
b: 20,
c: 30
};
์ ์ฝ๋๋ ์ด์ํ ๊ฒ ์๋ ์ ํ์ ์ธ ๊ฐ์ฒด, ๋ฐฐ์ด ์ ์ธ ๋ฐฉ์์ ๋๋ค. ์ผ์ชฝ์ ๋ณ์ ์ด๋ฆ์ ๋ฃ๊ณ ์ค๋ฅธ์ชฝ์ ๋ฐ์ดํฐ ํ์ ์ ์ ์ธํ์ฃ . '๊ตฌ์กฐ'๋ผ๋ ๋จ์ด๋ ์ด๋ฌํ ์ ์ธ ํ์์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ผ '๊ตฌ์กฐ ๋ถํด'๋ ๋ฌด์์ผ๊น์? ๋ฐ๋ก ์ด๋ฌํ ๋ณ์ ์ ์ธ ํ์์ด ์๋์ ๊ฐ์ด ์์ ๋ก์์ง๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
var { a, b, c } = obj;
๋ณ์์ ์ค๊ดํธ๋ฅผ ์์ฐ๋ ๊ฒ ์์ฒด๊ฐ ์ด์ํ๊ณ ๋ฏ์ค๊ธฐ๋ง ํฉ๋๋ค. ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ๋ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ด๋ฟ์์ ํ ๋ฐ ์๋์ ๊ฐ์ด ์ฝ์์ ์ฐ์ด๋ณด๋ฉด ์ ๋๋ก ๋์ํฉ๋๋ค.
console.log(a); // 10
console.log(b); // 20
console.log(c); // 30
# ํน์ ๊ฐ์ฒด์ ๊ฐ์ ๊บผ๋ด์ค๋ ๋ฐฉ๋ฒ
์ ๊ธฐํ๋ค์. ์ ๊ทธ๋ผ ์ด๊ฑด ์ด๋๋ค๊ฐ ์จ๋จน์ด์ผ ๋๋ ๊ฑธ๊น์? ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ์์ ํน์ ๊ฐ์ฒด์ ๊ฐ์ ๊บผ๋ด์ฌ ๋ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ์์ต๋๋ค.
var josh = {
language: 'javascript',
position: 'front-end',
area: 'pangyo',
hobby: 'singing',
age: '102'
};
var language = josh.language;
var position = josh.position;
var area = josh.area;
var hobby = josh.hobby;
var age = josh.age;
์ฌ๊ธฐ์ ์ ์ ์๋ ์ ์ ๊ฐ์ฒด์ ํน์ ์์ฑ ๊ฐ์ ๊บผ๋ด์ฌ ๋๋ง๋ค ์ผ์ผ์ด ๋ณ์๋ฅผ ํ๋ ์์ฑํ๊ณ ๋ด์์ค์ผ ํ๋ค๋ ์ ์ ๋๋ค. ๊ทธ๋ผ ๊บผ๋ด์ผ ํ ์์ฑ์ด ๋ง์ผ๋ฉด ๋ง์์๋ก ์๋ก์ด ๋ณ์๋ฅผ ์์ฑํ๊ณ ๋์ ํ๋ ์์ ๋ฐ๋ณต ์์ ์ ๊ณ์ํด์ค์ผ๊ฒ ์ฃ . ์ ์ฝ๋๋ง ๋ด๋ 5๊ฐ ์์ฑ ๊ฐ์ ๊ฐ์ ธ์ค๋๋ฐ ๊ฐํ์ 4๋ฒ ํด์ผ ํ์ต๋๋ค.
์ฌ๊ธฐ์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ ์ฉํ๋ฉด ํจ์ฌ ๋ ๊ฐํธํ๊ฒ ๊บผ๋ด์ฌ ์ ์์ต๋๋ค.
var josh = {
language: 'javascript',
position: 'front-end',
area: 'pangyo',
hobby: 'singing',
age: '102'
};
var { language, position, area, hobby, age } = josh;
console.log(language); // javascript
console.log(position); // front-end
console.log(area); // pangyo
console.log(hobby); // singing
console.log(age); // 102
์ด๋ ๊ฒ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๋ผ์ธ ์ซ์๋ฅผ ์ค์ผ ์ ์๊ณ , ์ด ๋ฌธ๋ฒ์ด ์ต์ํด์ง๋ฉด ์ ์ฒด์ ์ผ๋ก ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง๋ ๊ฒ์ ๋๋ ์ ์์ต๋๋ค.
# ๋ทฐ์์ค์ ์ ์ฉํ๋ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ 1
๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ํ์ฉํ๊ธฐ ๊ฐ์ฅ ์ข์ ๊ณณ์ ๋ฐ๋ก ๋ทฐ์์ค์ actions ์์ฑ์ ๋๋ค. ๋ทฐ์์ค์ actions ์์ฑ๋ค์ ๋ชจ๋ context๋ผ๋ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ context์ commit API๋ฅผ ๋ฐ๋์ ํธ์ถํฉ๋๋ค.
actions: {
fetchData(context) {
context.commit('addProducts');
}
}
์ฌ๊ธฐ์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ๋ฐ๊ฟ ์ ์์ต๋๋ค.
actions: {
fetchData({ commit }) {
commit('addProducts');
}
}
์ด๋ป๊ฒ ์ด๋ ๊ฒ ์ ์ฉ๋ ๊ฑธ๊น์? ์ ๋ถํด ๊ณผ์ ์ ์ข ๋ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , ๋ฌธ๋ฒ์ ์ธ ๋ถ๋ถ์ ๋ ๋์ context๋ผ๋ ๊ฐ์ฒด์๋ ์ด๋ฏธ commit ์์ฑ์ด ์๋ค๋ ๊ฒ์ ํ์ธํ์์ต๋๋ค.
actions: {
fetchData(context) {
context.commit('addProducts');
}
}
๊ทธ๋ผ context ๊ฐ์ฒด๊ฐ ์๋์ ๊ฐ์ด ์ ์๋์ด ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
var context = {
commit: actionName => console.log(actionName +' has been committed!!')
};
์ฌ๊ธฐ์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
var { commit } = context;
commit('addProducts'); // addProducts has been committed!!
TIP
๋ทฐ์์ค๋ ๋ทฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Vuex ํํ ๋ฆฌ์ผ (opens new window)์ ์ฐธ๊ณ ํ์ธ์.
# ๋ทฐ์ ์ ์ฉํ๋ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ 1
๋ทฐ์์ data
, methods
๋ฑ์ ์ ๊ทผํ ๋ this
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง ๋๋๋ก ๋งค๋ฒ this
๋ฅผ ํ์ดํํด ์ ๊ทผํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฒ๊ฑฐ๋ก์์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ผ๋ก ์ ๊ทผํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
<script>
export default {
props: {
id: Number,
title: String,
created: String,
author: String,
},
methods: {
savePost(postId) {
// ..
},
submitForm() {
// ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ ๋ฏธ์ ์ฉ
this.savePost(this.id);
// ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ ์ ์ฉ
const { id, savePost } = this;
savePost(id);
},
},
}
</script>
์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด this
๋ฅผ ๋งค๋ฒ ์
๋ ฅํ์ง ์์๋ ๋๋ ์ด์ ์ด ์์ต๋๋ค. ๋ค๋ง, ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ฌ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ์ธ์ง, ์ธ๋ถ์์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋์ธ์ง ๊ตฌ๋ถ์ด ์ด๋ ค์์ง๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ ์ ํด์ง ์ปจ๋ฒค์
์ ๋ง์ถฐ ์ฃผ์ํด์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
# ๋ทฐ์ ์ ์ฉํ๋ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ 2
v-for ๋๋ ํฐ๋ธ (opens new window)๋ฅผ ์ฌ์ฉํ ๋๋ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ํ์ฉํ ์ ์์ต๋๋ค.
posts
๋ผ๋ ๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด v-for
๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด v-for
๋๋ ํฐ๋ธ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๋ถ๋ถ์ ๋งค๋ฒ ์๋ณ์ post
๋ฅผ ์
๋ ฅํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค. ์ด ๋ถ๋ถ๋ ์์ ๋์จ ๊ฒ์ฒ๋ผ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
<template>
<ul>
<li v-for="post in posts" :key="post.id">
{{ post.title }} - {{ post.author }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
posts: [
{ id: 1, title: "post 1", created: "2021-08-01", author: "Capt" },
{ id: 2, title: "post 2", created: "2021-08-02", author: "Capt" },
{ id: 3, title: "post 3", created: "2021-08-03", author: "Capt" },
],
};
},
}
</script>
๋ค์ ์ฝ๋๋ ์ ์ฝ๋์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ ์ฉํ ๋ชจ์ต์ ๋๋ค. ์ด์ ๋ณด๋ค ๊ฐ๊ฒฐํด์ง ๋ชจ์ต์ ๋๋ค. ์ด์ฒ๋ผ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ด๋ณด๋ค ์ฌ๋ฌ ์์ฑ์ ์ฐธ์กฐํด์ผ ํ๋ ๊ธด ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ๊ฐ๋จํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
<li v-for="{ title, author, id } in posts" :key="id">
{{ title }} - {{ author }}
</li>
โ Template Literal Promise โ