React-Native(RN)

React Native에서 상태 관리하기 (useState, useEffect 활용법)

rn-guide 2025. 2. 5. 12:59

안녕하세요! 이번 글에서는 React Native에서 상태(state)를 관리하는 방법을 다뤄보겠습니다.

앱을 만들다 보면 사용자의 입력을 저장하거나, API에서 데이터를 불러와 화면에 반영해야 하는 경우가 많습니다.
처음 React Native를 사용할 때는 그냥 변수에 값을 저장하면 될 거라고 생각했는데, 화면이 제대로 업데이트되지 않더라고요.
이게 바로 React의 핵심 개념인 "상태 관리" 때문이었습니다.

이 글에서는 React Native에서 상태(state)를 관리하는 기본적인 방법인 useState와 useEffect를 활용하는 법을 정리해보겠습니다.


1. 상태(state)란? 왜 필요한가?

📌 **상태(state)**는 컴포넌트의 데이터를 저장하고, 값이 변경될 때 자동으로 화면을 업데이트해주는 역할을 합니다.
👉 단순 변수(let count = 0;)를 사용하면 값은 바뀌지만, 화면이 다시 렌더링되지 않음.
👉 React에서 상태 관리는 화면을 자동으로 업데이트하는 데 필수적임.

예를 들어, 버튼을 눌러 카운터 값을 증가시키는 기능을 만들 때, useState를 사용하지 않으면 화면이 바뀌지 않습니다.


2. useState를 사용한 상태 관리

📌 **useState는 가장 기본적인 상태 관리 훅(Hook)**으로, 컴포넌트가 값을 저장하고 변경할 수 있도록 도와줍니다.
먼저, 간단한 카운터 예제를 만들어볼게요.

import React, { useState } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <View style={styles.container}>
      <Text style={styles.text}>카운트: {count}</Text>
      <Button title="증가" onPress={() => setCount(count + 1)} />
    </View>
  );
};

const styles = StyleSheet.create({
  container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
  text: { fontSize: 20, marginBottom: 10 },
});

export default Counter;

📌 코드 설명

  • useState(0) → 초기값을 0으로 설정
  • count → 현재 카운트 값을 저장
  • setCount(count + 1) → 버튼을 누르면 count 값이 증가하고 화면이 다시 렌더링됨

👉 이전에는 그냥 let count = 0;으로 했는데, 그 방식으로 하면 버튼을 눌러도 화면이 바뀌지 않음.
👉 React에서는 useState를 사용해야 값이 변경될 때 자동으로 화면이 업데이트됨.


3. useEffect로 상태 변화 감지하기

📌 useEffect는 특정 값이 변경될 때 실행되는 함수입니다.
예를 들어, API 요청을 하거나, 특정 값이 변할 때 로그를 남기는 등의 작업을 할 수 있습니다.

아래 코드를 보면, 카운트 값이 변경될 때마다 console.log가 실행됩니다.

import React, { useState, useEffect } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';

const CounterWithEffect = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log(`카운트 값이 변경됨: ${count}`);
  }, [count]); // count 값이 바뀔 때마다 실행됨

  return (
    <View style={styles.container}>
      <Text style={styles.text}>카운트: {count}</Text>
      <Button title="증가" onPress={() => setCount(count + 1)} />
    </View>
  );
};

const styles = StyleSheet.create({
  container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
  text: { fontSize: 20, marginBottom: 10 },
});

export default CounterWithEffect;

📌 코드 설명

  • useEffect(() => { ... }, [count]) → count 값이 변경될 때마다 실행됨.
  • 콘솔 로그를 보면 버튼을 누를 때마다 카운트 값이 변경됨: 1, 카운트 값이 변경됨: 2 이런 식으로 출력됨.
  • API 요청, 로컬 스토리지 저장, 애니메이션 트리거 등 다양한 곳에서 활용 가능!

👉 실제 앱에서는 API 데이터를 불러올 때 useEffect를 많이 사용함.
👉 예: 화면이 처음 렌더링될 때 API 요청을 실행하고, 데이터를 상태로 저장하기.


4. useState + useEffect로 API 데이터 불러오기

📌 실제로 API에서 데이터를 불러와 상태에 저장하는 예제를 만들어볼게요.
(이후 API 관련 글에서 더 자세히 다루겠지만, 미리 기본적인 흐름을 알아두면 좋음!)

import React, { useState, useEffect } from 'react';
import { View, Text, ActivityIndicator, FlatList } from 'react-native';

const DataFetchExample = () => {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch('https://jsonplaceholder.typicode.com/posts')
      .then((response) => response.json())
      .then((json) => {
        setData(json);
        setLoading(false);
      })
      .catch((error) => console.error(error));
  }, []);

  return (
    <View style={{ flex: 1, padding: 20 }}>
      {loading ? (
        <ActivityIndicator size="large" color="blue" />
      ) : (
        <FlatList
          data={data}
          keyExtractor={(item) => item.id.toString()}
          renderItem={({ item }) => <Text>{item.title}</Text>}
        />
      )}
    </View>
  );
};

export default DataFetchExample;

📌 코드 설명

  • useState([]) → 데이터를 저장할 상태 생성
  • useState(true) → API 요청 중 로딩 상태 관리
  • fetch() → API에서 데이터 가져오기
  • useEffect → 컴포넌트가 처음 렌더링될 때 한 번 실행됨
  • setData(json) → 가져온 데이터를 data 상태에 저장
  • FlatList → 리스트 형태로 데이터를 화면에 표시

👉 이렇게 하면 앱을 실행하면 API에서 데이터를 가져와 리스트로 표시할 수 있음!
👉 실제 프로젝트에서 API 요청을 할 때도 useEffect + useState 조합을 많이 사용함.


5. 정리 및 다음 단계

useState로 상태를 관리하고, setState를 사용해 값을 변경할 수 있음.
useEffect를 활용하면 특정 값이 변경될 때 실행되는 동작을 설정할 수 있음.
API 데이터를 가져와 상태로 저장하는 방법도 useState + useEffect로 구현 가능.

 

📌 출처 및 참고 자료

 

📌 다음 글 예고: React Native에서 API 요청하고 데이터 가져오기
📌 (fetch, axios 활용법 + 상태 업데이트까지 포함!)

 

React Native 상태 관리를 이해하면 앱 개발이 훨씬 쉬워집니다! 😊
다음 글도 기대해주세요! 🚀