๐Ÿ”„ 36. React Native์—์„œ API ์—ฐ๊ฒฐํ•˜๊ธฐ โ€” fetch, useEffect, FlatList ๊ธฐ์ดˆ

JM_Devยท2025๋…„ 5์›” 14์ผ
0
post-thumbnail

React Native ์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด
์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ™”๋ฉด์— ๋ฟŒ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ •๋ง ๋งŽ๋‹ค.
๊ทธ๋Ÿด ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. API ์š”์ฒญ (fetch, axios ๋“ฑ)
  2. ์ƒํƒœ ๊ด€๋ฆฌ (useState, useEffect)
  3. ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง (FlatList)

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์œ„ 3๊ฐ€์ง€ ์š”์†Œ๋ฅผ ํ™œ์šฉํ•ด์„œ
"๋‰ด์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์˜ˆ์ œ"๋ฅผ ํ†ตํ•ด ์‹ค์ „์ฒ˜๋Ÿผ ์ •๋ฆฌํ•ด๋ดค๋‹ค.


๐Ÿ“ฆ ์‚ฌ์šฉํ•  ๋„๊ตฌ๋“ค

import { useEffect, useState } from 'react';
import { FlatList, View, Text, ActivityIndicator } from 'react-native';
  • useEffect: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ API ์š”์ฒญ
  • useState: ๋กœ๋”ฉ ์ƒํƒœ, ๋ฐ์ดํ„ฐ ์ƒํƒœ ์ €์žฅ
  • FlatList: ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ปดํฌ๋„ŒํŠธ

โœ… ๊ธฐ๋ณธ API ํ˜ธ์ถœ ์˜ˆ์ œ

function NewsList() {
  const [articles, setArticles] = useState([]);
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    fetch('https://example.com/api/news')
      .then(res => res.json())
      .then(data => {
        setArticles(data.articles);
        setIsLoading(false);
      })
      .catch(err => {
        console.error(err);
        setIsLoading(false);
      });
  }, []);

  if (isLoading) {
    return <ActivityIndicator size="large" />;
  }

  return (
    <FlatList
      data={articles}
      keyExtractor={(item) => item.id.toString()}
      renderItem={({ item }) => (
        <View style={{ padding: 12 }}>
          <Text style={{ fontSize: 16 }}>{item.title}</Text>
        </View>
      )}
    />
  );
}

๐Ÿง  FlatList๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ScrollView๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋ง
  • FlatList๋Š” ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ Œ๋”๋งํ•ด์„œ ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ์ข‹์Œ
  • ํ•„์ˆ˜ ์†์„ฑ: data, renderItem, keyExtractor

๐Ÿ’ก ์‹ค์ „ ํŒ

ํ•ญ๋ชฉ๋‚ด์šฉ
ActivityIndicator๋กœ๋”ฉ ์ƒํƒœ ์ฒ˜๋ฆฌ์— ์œ ์šฉ
error state ์ถ”๊ฐ€์„œ๋ฒ„ ์˜ค๋ฅ˜, ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์‹œ ์ฒ˜๋ฆฌ
useCallback ์‚ฌ์šฉ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”
axiosfetch๋ณด๋‹ค ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ์ธํ„ฐ์…‰ํ„ฐ ๋“ฑ ํŽธ๋ฆฌํ•จ

โš ๏ธ API ํ˜ธ์ถœ ์œ„์น˜ ์ฃผ์˜

  • useEffect(() => {...}, []) ์•ˆ์—๋งŒ ํ˜ธ์ถœ
    โ†’ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— [] ๋„ฃ๋Š” ๊ฑธ ์žŠ์ง€ ๋ง๊ธฐ!

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์›น์—์„œ๋Š” fetch, React Query ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ํŒจ์นญ์„ ํ•ด๋ดค์ง€๋งŒ,
React Native์—์„  FlatList๋ผ๋Š” ๊ตฌ์กฐ ๋•๋ถ„์—
๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์ฒ˜์Œ ๋А๊ผˆ๋‹ค.

์ง€๊ธˆ์€ ์ƒํƒœ๋Š” useState, ๋ฐ์ดํ„ฐ๋Š” FlatList,
๋น„๋™๊ธฐ๋Š” useEffect๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ๊ฑธ ๊ธฐ๋ณธ ํ๋ฆ„์œผ๋กœ ์‚ผ๊ณ  ์žˆ๋‹ค.


๐Ÿ”„ โ€œ๋ชจ๋ฐ”์ผ์—์„œ ๋ฐ์ดํ„ฐ ํŒจ์นญ์€ ๋‹จ์ˆœํžˆ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ํšจ์œจ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.โ€


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€