Frontend๐ŸŽจ/Vue3.js๐Ÿ€

toValue()์™€ toRaw() (feat. MaybeRefOrGetter<T>, Proxy)

JanuDev 2025. 10. 2. 10:53

Vue๋Š” ์ง„์งœ ์›ฌ๋งŒํ•˜๋ฉด ๋‹ค ์ ์‘ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ์ด vue-query์ชฝ์ด๋ž‘ ๊ด€๋ จ๋œ๊ฒƒ๋“ค์€ ์•„์ง๋„ ๋„ˆ๋ฌด ์–ด๋ ค์›€...

์ •๋ฆฌํ•˜๊ธฐ ์ „์— MaybeRefOrGetter<T>์™€ Proxy๊ฐ€ ๋ญ”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

+ MaybeRefOrGetter<T>

ref๋“  ๊ฐ’์ด๋“  ํ•จ์ˆ˜๋“  ์•Œ์•„์„œ ๊บผ๋‚ด์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์œ ํ‹ธ ํƒ€์ž…

type MaybeRefOrGetter<T> = T | Ref<T> | (() => T)

์ด๋Ÿฐ ๋А๋‚Œ์ธ๋ฐ, 1๏ธโƒฃ ๊ทธ๋ƒฅ ๊ฐ’(T)์ผ์ˆ˜๋„ ์žˆ๊ณ , 2๏ธโƒฃ Ref(T)์ผ์ˆ˜๋„ ์žˆ๊ณ , 3๏ธโƒฃ getterํ•จ์ˆ˜(T)์ผ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๊ทธ ๊ฐ’์ด ๋ฌด์—‡์ด๋“  ์ด ์„ธ๊ฐ€์ง€๋ฅผ ์ „๋ถ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

+ Proxy

๋„“์€ ์˜๋ฏธ๋กœ ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” "๋Œ€๋ฆฌ์ธ" ์—ญํ• 

โžก๏ธ ์ผ๋ฐ˜์ ์ธ ๋„คํŠธ์›Œํฌ(์ธํ„ฐ๋„ท) : ํด๋ผ์ด์–ธํŠธ์˜ ์›น ๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ์„ ๋Œ€์‹  ๋ฐ›์•„์„œ ์„œ๋ฒ„์— ์ „๋‹ฌ, ์›น์‚ฌ์ดํŠธ์˜ ์‘๋‹ต์„ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋Š” ์ค‘๊ฐœ ์„œ๋ฒ„

โžก๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(Vue3 ๋“ฑ) : ์ฝ”๋“œ(ํด๋ผ์ด์–ธํŠธ)๊ฐ€ ๊ฐ์ฒด(์„œ๋ฒ„ ์—ญํ• )์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜(get) ์“ฐ๋Š”(set)ํ•˜๋Š” ๋™์ž‘์„ ๊ฐ€๋กœ์ฑ„์„œ(intercept)  ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•œ ์ถ”๊ฐ€ ์ž‘์—…(๊ฐ์ง€/๊ธฐ๋ก/์•Œ๋ฆผ, Handler)์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋Œ€๋ฆฌ ๊ฐ์ฒด)

๋”๋ณด๊ธฐ

์ง€ํ”ผํ‹ฐ ์„ค๋ช… ๐Ÿ‘ฝ

 

1๏ธโƒฃ ๋„คํŠธ์›Œํฌ Proxy

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์š”์ฒญ/์‘๋‹ต์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์ค‘๊ฐœ์ž.
  • ์˜ˆ: ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์ง์ ‘ ์š”์ฒญํ•˜๋Š” ๋Œ€์‹  Proxy ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ์„œ ์š”์ฒญ → ์„œ๋ฒ„ ์‘๋‹ต → ๋ธŒ๋ผ์šฐ์ € ์ „๋‹ฌ.

2๏ธโƒฃ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Proxy

  • Proxy ๊ฐ์ฒด๋Š” JS์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ๊ฐ์ฒด.
  • ์—ญํ•  = "๋Œ€๋ฆฌ์ธ"
    • ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜(get) ์“ฐ๋Š”(set) ๋™์ž‘์„ ๊ฐ€๋กœ์ฑ„(intercept)
    • ์ถ”๊ฐ€ ์ž‘์—… ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ: ๊ฐ์ง€, ๊ธฐ๋ก, ์•Œ๋ฆผ, ๋ฐ˜์‘ํ˜• ์—…๋ฐ์ดํŠธ ๋“ฑ
  • Vue 3์˜ reactive()๋‚˜ ref()๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ Proxy๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ ๊ตฌํ˜„
Vue3์˜ ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ์ด๋‹ค

 

Vue3์—์„œ reactive()๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Proxy๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ทธ๋ž˜์„œ reactive(obj)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Vue๋Š” obj์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ/๋ฐ”๊ฟ€ ๋•Œ ๊ฐ์ง€ํ•ด์„œ ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ(reactivity)์— ๊ธฐ๋กํ•œ๋‹ค.

 

์ด๊ฒŒ ์ดํ•ด๊ฐ€ ๋ฌ๋‹ค๋Š” ์ „์ œ ํ•˜์—

 

1. toValue()

๊ทธ ์–ด๋– ํ•œ ๊ฐ’์ด ๋“ค์–ด์˜ค๋“  ์‹ค์ œ ๊ฐ’๋งŒ ๋ฝ‘์•„์„œ T(์‹ค์ œ ๊ฐ’)๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

ref๋กœ ๋“ค์–ด์˜ค๋“ , ์ผ๋ฐ˜ ๊ฐ’์ด ๋“ค์–ด์˜ค๋“ , ํ•จ์ˆ˜๋กœ ๋“ค์–ด์˜ค๋“  ์ „๋ถ€ ์ƒ๊ด€ ์—†์ด ์‹ค์ œ ๊ฐ’๋งŒ ์ถœ๋ ฅํ•œ๋‹ค. 

const a = ref(10)
const b = () => 20
const c = 30

console.log(toValue(a)) // 10 (ref๋ผ์„œ .value ๊บผ๋‚ด์คŒ)
console.log(toValue(b)) // 20 (ํ•จ์ˆ˜๋ผ์„œ ์‹คํ–‰ ๊ฒฐ๊ณผ ๊บผ๋ƒ„)
console.log(toValue(c)) // 30 (๊ทธ๋ƒฅ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜)

์ด๋Ÿฐ์‹์œผ๋กœ ํ•ญ์ƒ ์‹ค์ œ๊ฐ’(10, 20, 30)๋งŒ ์–ป๋Š”๋‹ค.

  • ๋ฌด์กฐ๊ฑด MaybeRefOrGetter<T>์ผ ํ•„์š”๋Š” ์—†๊ณ , reactive๋‚˜ ์›์‹œ๊ฐ’(primitive type)์ด์–ด๋„ ๊ทธ ์•ˆ์˜ ๊ฐ’์„ ํ•ญ์ƒ "๊ธฐ๋ณธ๊ฐ’"์œผ๋กœ ํ•ด์ค€๋‹ค.
  • ํ•ญ์ƒ ํ•ด๋‹น ๊ฐ’์˜ ๋ฐ˜์‘ํ˜• ๊ฐ’์„ ๊นŒ์„œ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์—(= ํ˜ธ์ถœ ์‹œ์ ์˜ ์‹ค์ œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—), ๋ฐ˜์‘ํ˜•์—์„œ ๊ฐ’์„ ํ™•์ธํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

ref๊ฐ€ ๋ฐ•์Šค๋ผ๋ฉด toValue๋Š” ๋ฐ•์Šค๋ฅผ ๊นŒ๊ณ  ๊ทธ ์•ˆ์˜ ๊ฐ’์„ ๋ฌด์กฐ๊ฑด ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜

 

2. toRaw()

Vue์—์„œ ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ์„ ์ œ๊ฑฐํ•˜๊ณ (= Proxy ๊ป๋ฐ๊ธฐ๋ฅผ ๋ฒ—๊ธฐ๊ณ ) ์ˆœ์ˆ˜ํ•œ ์›์‹œ ๊ฐ์ฒด๋‚˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ.

Vue์˜ ๋ฐ˜์‘ํ˜•์„ ์ œ๊ฑฐํ•œ๋‹ค.

1๏ธโƒฃ๋ฐ˜์‘ํ˜• ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์›์‹œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ

2๏ธโƒฃ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. "๋ฐ˜์‘ํ˜• ์ถ”์  ์ œ๊ฑฐ ์—ญํ• "

'Frontend๐ŸŽจ > Vue3.js๐Ÿ€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Vue] Vue-Query ์ด์ •๋ฆฌ  (0) 2025.01.05
[Vue] watch์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž  (0) 2024.12.29