[Vue.js] computed ์†์„ฑ

ํ† ๋ผ๋Š” ๊ฐœ๋ฐœ๊ฐœ๋ฐœยท2023๋…„ 7์›” 10์ผ
0

Vue.js

๋ชฉ๋ก ๋ณด๊ธฐ
3/19
post-thumbnail

๐Ÿ“Œ 1. computed

1-1. computed๋ž€?

ํ…œํ”Œ๋ฆฟ์˜ ๋ฐ์ดํ„ฐ ํ‘œํ˜„์„ ๋” ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ์†์„ฑ.

ํ…œํ”Œ๋ฆฟ ์•ˆ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

<p>๊ฐ•์˜๊ฐ€ ์กด์žฌ ํ•ฉ๋‹ˆ๊นŒ?:</p>
<span>{{ teacher.lectures.length > 0 ? 'Yes' : 'No' }}</span>

์œ„์™€ ๊ฐ™์ด ํ…œํ”Œ๋ฆฟ ํ‘œํ˜„์‹ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ, ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ณณ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ณ„์‚ฐ๋œ ์†์„ฑ(computed property) ์ด๋‹ค.
์œ„์˜ ์ฝ”๋“œ์—์„œ computed๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

<p>๊ฐ•์˜๊ฐ€ ์กด์žฌ ํ•ฉ๋‹ˆ๊นŒ?:</p>
<span>{{ hasLecture }}</span>
const hasLecture = computed(() => {
  return teacher.lectures.length > 0 ? 'Yes' : 'No'
})

template ํ‘œํ˜„์‹ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊น”๋”ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
๋˜ํ•œ, computed๋กœ ์ธํ•ด ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ computed๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด์„œ์ด๋‹ค.


1-2. computed ์†์„ฑ์˜ ์žฅ์ 

1) computed ์†์„ฑ์˜ ๋Œ€์ƒ์œผ๋กœ ์ •ํ•œ data ์†์„ฑ์ด ๋ณ€ํ–ˆ์„ ๋•Œ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์—ฐ์‚ฐํ•ด์ค€๋‹ค.
2) ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ

computed๋Š” ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์—ฐ์‚ฐํ•ด์ฃผ๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ, teacher.lectures.length ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์—ฐ์‚ฐํ•˜์—ฌ ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•ด ์ค„ ๊ฒƒ์ด๋‹ค.


1-3. computed ์ฃผ์˜์‚ฌํ•ญ

1) computed ์†์„ฑ์€ ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
2) HTTP ํ†ต์‹ ๊ณผ ๊ฐ™์ด ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•œ ๋กœ์ง์„ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

computed์†์„ฑ์€ ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

const hasLecture = computed((teacher.lectures.length ? ) => {
  return  teacher.lectures.length > 0 ? 'Yes' : 'No'
})

๋˜ํ•œ, httpํ†ต์‹  ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•œ๋‹ค.
computed ์†์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

axios๊ฐ™์€ ์ฝ”๋“œ๋Š” methods๋‚˜ watch์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค.



๐Ÿ“Œ 2. computed, methods, watch

2-1. computed VS methods

computed์†์„ฑ ๋Œ€์‹  ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

const hasLecture = computed(() => {
  return teacher.lectures.length > 0 ? 'Yes' : 'No'
})

function existLecture() {
  return teacher.lectures.length > 0 ? 'Yes' : 'No'
}

์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.
๊ทธ๋Ÿผ computed์™€ methods์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

๋ฐ”๋กœ, computed ์†์„ฑ์€ ์ข…์† ๋Œ€์ƒ์„ ๋”ฐ๋ผ ์ €์žฅ(์บ์‹ฑ)๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

computed ์†์„ฑ์€ ํ•ด๋‹น ์†์„ฑ์ด ์ข…์†๋œ ๋Œ€์ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ฆ‰ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ, computed ์†์„ฑ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์š”์ฒญํ•ด๋„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ ๊ณ„์‚ฐ๋˜์–ด ์žˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ Œ๋”๋ง์‹œ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“œ๋Š” ์…ˆ์ด๋‹ค.

์ด์— ๋น„ํ•ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ Œ๋”๋ง์„ ๋‹ค์‹œ ํ•  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

1) computed๋Š” ์บ์‹ฑ๋œ๋‹ค.
2) computed๋Š” ์บ์‹ฑ์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง์‹œ ๋น„์šฉ์ด ์ ๊ฒŒ๋“ ๋‹ค.
3) method๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.


2-2. computed VS watch

Vue๋Š” Vue ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๊ด€์ฐฐํ•˜๊ณ  ์ด์— ๋ฐ˜์‘ํ•˜๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ watch ์†์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

computed์™€ watch ๋ชจ๋‘ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.
๊ทธ๋Ÿผ computed์™€ watch์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ?

๋ฐ”๋กœ, computed๋Š” ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๊ณ , watch๋Š” ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
computed ์†์„ฑ์€ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๋ชฉํ‘œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๊ณ , watch๋Š” ๊ฐ์‹œํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์„ ์–ธํ•œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋ณด๋‹ค ์ฝ”๋“œ ๋ฐ˜๋ณต์ด ์ ์€ ๋“ฑ ์šฐ์ˆ˜ํ•˜๋‹ค๊ณ  ํ‰๊ฐ€ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ, ๋ณต์žกํ•œ ๋กœ์ง์ด๋‚˜ ๋ฌด๊ฑฐ์šด ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ watch๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์—ฐ์‚ฐ์ž‘์—…์€ computed๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ์—์„œ computed(์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์™€ watch(๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์˜ ์ฐจ์ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

const fullName = computed(() => {
      return firstName.value + ' ' + lastName.value
  }
watch(firstName, (cur, prev) => {
  fullName.value = cur + ' ' + lastName.value;
})

watch(lastName, (cur, prev) => {
  fullName.value = firstName.value +' ' + cur;
})


์ฐธ๊ณ ๋ฌธํ—Œ

https://v2.ko.vuejs.org/v2/guide/computed.html#computed-%EC%86%8D%EC%84%B1
์ธํ”„๋Ÿฐ - Vue3 ์™„๋ฒฝ ๋งˆ์Šคํ„ฐ: ๊ธฐ๋ณธํŽธ ์ง์ฝ”๋”ฉ

profile
ํ•˜์ด ์ด๊ฒƒ์€ ๋‚˜์˜ ๊นจ์ง€๊ณ  ๋ถ€์„œ์ง€๋Š” ์ƒ ์Šคํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€