ref의 정체와 .value의 필연성
ref의 정체는 무엇이며, 왜 .value로 접근해야하는 경우가 있을까?
ref는 전달받은 인자를 받아 .value 속성을 가진 **반응형 객체(RefImpl)**로 감싸서 반환하는 함수
왜 ref를 사용하는가?
JS의 기본 자료형은 참조 타입이 아닌 값 자체로 전달되므로 값이 변경되어도 Vue가 이를 추적할 방법이 없음
이를 해결하기 위해 Vue는 기본 타입을 객체로 래핑하여 메모리상의 동일한 주소를 참조함
또한 Vue는 ref의 value 속성이 바뀔 때마다 반응형 시스템이 이를 감지함
스크립트 vs 템플릿의 차이
setup 에서는 실제 객체인 ref 인스턴스에 접근하므로 .value를 명시 필요
template 에서는 Vue가 내부적으로 Unwrapping 과정을 거치므로 변수명만 사용 가능
ref인지 확인하고 자동으로 .value를 추출하여 보여줌
ref, reactive... 등 종류가 많던데?
반응형 상태 관리는 결국 ref와 reactive라는 두 줄기에서 시작되는것!
나머지는 상황에 따른 최적화나 조작을 위한 변주에 불과함!!!
ref (모든 타입의 반응성)
.value, 템플릿 변수명만으로 접근reactive (객체/배열 전용 반응성)
.value 없이 속성에 직접 접근할 수 있어 코드가 간결shallowRef (얕은 반응성 관리)
.value 자체가 통째로 교체될 때만 UI를 업데이트isRef / isReactive (상태 확인)
ref인지, 혹은 프록시 형태의 reactive인지 판별하여 boolean 값을 반환unref (안전한 값 추출)
ref라면 .value를, 일반 값이라면 대상 자체를 반환ref와 일반 값을 모두 수용해야 하는 유틸리티 함수를 작성할 때 로직의 범용성 높여줌toRaw (순수 객체 복구)
markRaw (반응성 제외 표시)
ref를 사용reactive를 고려shallowRef가 성능 면에서 유리JSON.stringify를 수행하거나 외부 라이브러리와 통신할 때는 toRaw나 unref를 통해 Raw Data로 변환해 에러 방지ref와 일반 값 모두를 수용하고 싶다면?unref를 사용하자!싱글톤 기반의 스마트 포인터 처럼 작동하며, 원본 데이터를 감시하는 막이 씌워진 상태대부분의 라이브러리(axios 등)나 JSON.stringify()는 객체를 직렬화할 때 프록시 구조를 해석하려다 의도치 않은 결과를 초래하거나, 순환 참조 등의 에러를 발생시킬 수 있다. 특히 데이터의 규모가 크거나 복잡하게 중첩된 경우, 반응형 객체 그대로를 JSON으로 변환하는 것은 위험하다.
toRaw()의 활용
reactive 객체를 순수 JSON 객체로 변환할 때 가장 확실한 방법markRaw()의 활용