id, title, category, status, source_trust_level, verification_status, created_at, updated_at, tags, tech_stack, applied_in, aliases
| id |
title |
category |
status |
source_trust_level |
verification_status |
created_at |
updated_at |
tags |
tech_stack |
applied_in |
aliases |
| react-refs-patterns |
React Refs 사용 패턴 |
Coding |
draft |
B |
conceptual |
2026-05-09 |
2026-05-09 |
| react |
| refs |
| dom |
| vibe-coding |
|
| language |
applicable_to |
| TypeScript / React 18+ |
|
|
|
| useRef |
| forwardRef |
| callback ref |
|
React Refs 사용 패턴
ref 는 두 가지: (1) DOM 참조 — 측정/포커스/스크롤, (2) 렌더에 영향 안 주는 mutable 값 보관. ref.current 변경은 재렌더 trigger 안 함.
📖 핵심 개념
- DOM 또는 자식 imperative API 노출 (focus, play, scrollTo 등).
- 렌더 사이 보존하는 값 — previous value, timer id, mutable 카운터.
- ref 변경은 재렌더 안 함 (state 가 아님).
💻 코드 패턴
DOM 측정
Previous value
Imperative handle 노출
Callback ref (DOM 노드 변경 감지)
🤔 의사결정 기준
| 상황 |
useRef |
useState |
| DOM 참조 |
✅ |
❌ |
| 렌더에 반영해야 함 |
❌ |
✅ |
| 렌더와 무관한 mutable |
✅ |
❌ |
| timer/AbortController 핸들 |
✅ |
❌ |
| 자식 imperative 메서드 노출 |
useImperativeHandle |
❌ |
❌ 안티패턴
- ref.current 변경 후 화면 갱신 기대: ref 는 재렌더 trigger 안 함. forceUpdate 또는 state 사용.
- render 중 ref.current 읽기/쓰기: concurrent mode 에서 일관성 깨짐. effect 안에서.
- forwardRef 안 쓰고 props.ref 로 받기: React 18 에서 안 됨 (React 19 에서 ref prop 가능).
- 모든 mutable 데이터 ref 로: state 가 더 나음. ref 는 진짜 렌더 안 영향 줄 때.
- ref 가 callback 으로 받는 노드의 cleanup 안 함: callback ref 는 unmount 시 null 받음. 거기서 정리.
🤖 LLM 활용 힌트
- "DOM 측정/포커스/스크롤 = ref. 렌더 영향 = state" 강조.
- forwardRef 작성 시 imperative handle 의 메서드 시그니처 명확히.
🔗 관련 문서