[React] ref란?

2025. 2. 16. 21:50·🖥️개발/🐋React

 

오늘은 ref에 대해 알아봅시다! 

 

1️⃣ ref의 기본 개념

 

ref(reference)는 특정 DOM 요소나 React 컴포넌트 인스턴스에 직접 접근하여 조작할 수 있도록 해주는 기능입니다. 

주로 사용되는 경우를 아래에서 알아볼까요!

 

  1. DOM 요소 조작
    • 입력 필드에 자동으로 포커스 설정
    • 특정 요소의 스크롤 위치 조정
    • 애니메이션 직접 제어
  2. 클래스형 컴포넌트 접근
    • 클래스형 컴포넌트의 메서드나 상태에 직접 접근
  3. 렌더링 없이 값 저장
    • 상태(state) 변경 없이 컴포넌트 내부에서 값 유지

 

- ref의 장점

  • 상태 업데이트 없이 요소를 조작할 수 있어 불필요한 리렌더링 방지
  • useState와 달리 값이 변경되어도 컴포넌트가 다시 렌더링되지 않음

따라서, 상태(state) 변경이 불필요한 요소 조작이 필요한 경우 ref를 많이 활용하게 됩니다!

 

📌 ref를 사용하는 주요 이유 정리

  1. DOM 요소 직접 조작 → document.querySelector() 없이 안전하게 DOM에 접근
  2. 클래스형 컴포넌트 접근 → 부모 컴포넌트가 자식 컴포넌트의 메서드를 호출 가능
  3. 렌더링 없이 값 저장 → useState 없이 변경 가능한 변수를 유지할 때 사용

 

2️⃣ ref의 기본 사용법

 

기본 개념을 익혔으니 이번에는 코드로 사용법을 알아볼까요!

 

1. DOM 요소에 ref 적용하기 (useRef 활용)

import { useRef } from "react";

function InputFocus() {
  const inputRef = useRef(null);

  const handleFocus = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} type="text" placeholder="여기에 입력하세요" />
      <button onClick={handleFocus}>포커스 이동</button>
    </div>
  );
}

 

✅ 코드 동작

  • useRef(null)로 inputRef를 생성하고, input 요소에 ref로 설정합니다.
  • 버튼 클릭 시 inputRef.current.focus()를 호출하여 input 요소에 포커스를 이동합니다.

 


2. 클래스형 컴포넌트에서 ref 사용하기 (createRef 활용)

import React, { Component, createRef } from "react";

class ChildComponent extends Component {
  showAlert() {
    alert("Hello from Child Component!");
  }
  render() {
    return <div>자식 컴포넌트입니다.</div>;
  }
}

class ParentComponent extends Component {
  constructor(props) {
    super(props);
    this.childRef = createRef();
  }

  handleClick = () => {
    this.childRef.current.showAlert();
  };

  render() {
    return (
      <div>
        <ChildComponent ref={this.childRef} />
        <button onClick={this.handleClick}>자식 컴포넌트 메서드 호출</button>
      </div>
    );
  }
}

 

✅ 코드 동작

  • createRef()로 this.childRef를 생성하고 ChildComponent에 ref로 설정합니다.
  • 부모 컴포넌트에서 ref.current.showAlert()을 호출하여 자식 컴포넌트의 메서드를 실행할 수 있습니다.

 


3. 렌더링 없이 값 저장하기 (useRef 활용)

import { useRef } from "react";

function Counter() {
  const countRef = useRef(0);

  const increment = () => {
    countRef.current += 1;
    console.log("현재 값:", countRef.current);
  };

  return <button onClick={increment}>클릭하면 값 증가</button>;
}

 

✅ 코드 동작

  • useRef(0)으로 countRef를 생성하면 current 값이 저장됩니다.
  • countRef.current += 1을 실행해도 리렌더링되지 않으며, 상태값과 다르게 값이 유지됩니다.

 


 

이런 ref 함수가 React 19에서 변화가 좀 있었죠! 그 부분을 간단히 알아보고 가겠습니다!

3️⃣ React 19에서 ref 함수의 변화

 

1. 함수형 컴포넌트에서 ref를 props로 직접 전달이 가능해짐!!

🚀 변경 전 (React 18 이하) → React.forwardRef 필요

const MyInput = React.forwardRef((props, ref) => (
  <input {...props} ref={ref} />
));

 

🚀 변경 후 (React 19) → forwardRef 없이 props로 직접 전달 가능

function MyInput({ ref, ...props }) {
  return <input {...props} ref={ref} />;
}

 

forwardRef 없이 ref를 props로 전달할 수 있게 되었습니다!! 이 전 코드보다 훨씬 간단하면서 직관적으로 코드를 짤 수 있게 되었죠ㅎㅎ

 

 

2. ref 콜백 함수에서 정리(cleanup) 함수 반환 지원

🚀 변경 전 (React 18 이하) → 언마운트 시 null 호출

<input ref={(node) => { myRef = node; }} />

🚀 변경 후 (React 19) → 정리(cleanup) 함수 반환 가능

<input
  ref={(node) => {
    if (node) {
      node.style.backgroundColor = "yellow";
    }
    return () => {
      if (node) {
        node.style.backgroundColor = "transparent";
      }
    };
  }}
/>

 

ref 콜백에서 null을 호출하는 방식보다 정리(cleanup) 함수를 직접 제공하는 방식으로 바뀌었습니다! null을 호출하는 방식 보다 좀 더 직관적으로 느껴져서 좋다고 생각하는데 여러분은 어떠신가요? 언마운트 시의 정리 작업이 좀 더 쉬워진 것 같습니다!

 


 

4️⃣ 마무리 및 결론

ref는 React에서 직접적인 DOM 조작이나 값 저장, 컴포넌트 접근 등의 용도로 사용되며, 특히 불필요한 리렌더링 없이 특정 요소를 조작하는데 유용한 기능입니다.

 

React 19에서는 ref를 props로 직접 전달할 수 있도록 개선되었으며, ref 콜백에서 정리 함수를 반환할 수 있는 기능이 추가되었습니다!

 

 

 

 

 

 

썸네일

저작자표시 비영리 (새창열림)

'🖥️개발 > 🐋React' 카테고리의 다른 글

[리액트] props  (0) 2025.03.08
[Zustand] Zustand란? 리액트에서 Zustand를 사용하는 이유  (0) 2025.02.23
[React] 리액트의 단방향 데이터 흐름 (One-way Data Flow)  (0) 2025.02.02
[React] <input>과 <label>은 함께 써요! with. React.useId Hook  (0) 2025.01.26
[React] 엄격 모드(StrictMode)를 사용하는 이유 with 순수 함수  (0) 2025.01.19
'🖥️개발/🐋React' 카테고리의 다른 글
  • [리액트] props
  • [Zustand] Zustand란? 리액트에서 Zustand를 사용하는 이유
  • [React] 리액트의 단방향 데이터 흐름 (One-way Data Flow)
  • [React] <input>과 <label>은 함께 써요! with. React.useId Hook
주_Y
주_Y
  • 주_Y
    인생은 온통 한바탕 꿈
    주_Y
  • 전체
    오늘
    어제
    • 🏠HOME (115)
      • 🔔공지사항 (1)
      • 🎨TIL (33)
        • 🐯2022 (15)
        • 🐰2023 (18)
      • ⏳습관 (36)
        • 🌞Good Morning (36)
      • 🎞️회고 (2)
        • 🦁부트캠프 (2)
      • 🖥️개발 (31)
        • 🐥JavaScript (9)
        • 🐋React (8)
        • 🧸Python (2)
        • 🖍️ Android Studio (2)
        • 🔍Baekjoon (4)
        • 🏵️JSP (1)
        • 🗂️Github (1)
        • 🎙️강연 (1)
        • 🛩️사이드 플젝 • 협업 (2)
        • 💚접근성 (1)
      • 🔧CS 공부 (1)
        • 🧭자료구조 (1)
      • 🦁부트캠프 (7)
        • 🐯 JS 수업 정리 (6)
        • 🐯JAVASCRIPT.INFO 글 읽기 (1)
      • ℹ️티스토리 (1)
      • 🥁와글와글 잡담 (1)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
주_Y
[React] ref란?
상단으로

티스토리툴바