๋ชฉ์ฐจ
[React] REST API, AXIOS๋ก ๋ฐ์์จ Array ๊ฐ์ฒด๋ฅผ mapํจ์ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ ๋
์ด ๊ธ์์๋ React๋ฅผ ์ฌ์ฉํ์ฌ REST API๋ก๋ถํฐ Axios๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋ ๋ฐ์ํ๋ ๋ฐฐ์ด(Array) ๊ฐ์ฒด์ map ํจ์ ํธ์ถ ์ค๋ฅ์ ๋ํด ์์ธํ ์ค๋ช ํ๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๋ ๊ฐ๋จํ๋ฉด์๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์ ํฉ๋๋ค. ํนํ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ด๋ จํ์ฌ Promise ๊ฐ์ฒด๊ฐ ํด๊ฒฐ๋๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋์ด ๋ฐ์ํ๋ ์ค๋ฅ์ ์์ธ๊ณผ ํด๊ฒฐ์ฑ ์ ์ค์ ์ ์ผ๋ก ๋ค๋ฃจ๋ฉฐ, ๋ก๋ฉ ์ํ ๊ด๋ฆฌ ๋ฐ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํ์ฉํ ์ ๊ทผ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค.
๋์ ๋ถ
React๋ฅผ ์ฌ์ฉํ๋ฉด์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ ๋๋งํ๋ ๊ณผ์ ์ ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค. ๋ง์ ๊ฐ๋ฐ์๋ค์ด Axios๋ฅผ ์ฌ์ฉํ์ฌ REST API์ ํต์ ํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ฐ, ์ด ๋ ์ข
์ข
๊ฒช๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ๋ก "map ํจ์ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ๋ค"๋ ์๋ฌ์
๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ฐฐ์ด์ด์ด์ผ ํ๋๋ฐ, ์ปดํฌ๋ํธ ๋ด๋ถ์์ ํด๋น ๋ฐฐ์ด์ ๋ํด map ํจ์๋ฅผ ํธ์ถํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ์์ง ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ค์ผ ๋ ํด๋น ๋ณ์์ ๊ฐ์ด null ๋๋ Promise ๊ฐ์ฒด๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ ๊ฐ ์ฒ์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋, formdata๊ฐ ์ ์์ ์ผ๋ก ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ์ง๋ง, div ์์์ ํด๋น ๊ฐ์ฒด๋ฅผ ๊บผ๋ด ์ฐ๋ ค๋ map ํจ์ ํธ์ถ ์ “Cannot read property 'map' of null” ํน์ “map is not a function”๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ์์ง ์์ ํ ๋ก๋๋๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋์ด ๋ฐ์ดํฐ ํ์ ์ด ์์๊ณผ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ๋ฌธ์ ์์ต๋๋ค.
์ค์ ๋ก, API ํธ์ถ์ ์ํ Axios ์์ฒญ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ์ ์์ต๋๋ค. ์ด๋, ๋ง์ฝ ๋ฐ์ดํฐ๊ฐ null์ด๊ฑฐ๋ ์์ง Promise ๊ฐ์ฒด๋ก ๋จ์์๋ค๋ฉด, JavaScript์์ ์ ๊ณตํ๋ Array.prototype.map ํจ์๋ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, ๋ก๋ฉ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ์ต๋๋ค. ์ ๋ ์ด์ ๋ํด ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ ์๊ฐํด๋์ต๋๋ค. ๋ฐ๋ก, ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ก๋ฉ ์ํ๋ฅผ ๋ํ๋ด๋ state ๋ณ์๋ฅผ ์์ฑํ๊ณ , API ํธ์ถ์ด ์๋ฃ๋๋ฉด ํด๋น state๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ๊ตฌํํ๋ ๋ฐฉ์์ ๋๋ค.
๋ฌธ์ ์ํฉ๊ณผ ์์ธ ๋ถ์
React์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋๋ค:
- ์ปดํฌ๋ํธ ๋ง์ดํธ ์ ๋ฐ์ดํฐ ์์ฒญ
์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋, useEffect ํ ์ ์ฌ์ฉํ์ฌ Axios๋ฅผ ํตํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์ด ๋, Axios๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. - ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๋น๋๊ธฐ ํจ์(async/await)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ฉด, ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ฐ์์ง๊ธฐ ์ ๊น์ง๋ ํด๋น ๋ณ์์ ์ด๊ธฐ๊ฐ(null ๋๋ ๋น ๋ฐฐ์ด ๋ฑ)์ด ํ ๋น๋ฉ๋๋ค. ๋ง์ฝ ์ด๊ธฐ๊ฐ์ด null์ด๋ผ๋ฉด, map ํจ์๋ฅผ ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. - ๋ ๋๋ง ์์ ๋ฌธ์
๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ก๋๋๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋์ด, ์์ง ๊ฐ์ด ํ ๋น๋์ง ์์ ์ํ์ ๋ณ์์ ๋ํด map ํจ์๋ฅผ ํธ์ถํ๋ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ ์ฝ๋ ๋ถ์
์๋๋ ๋ฌธ์ ์ํฉ์ ์ฌํํ ๊ฐ๋จํ ์์ ์ฝ๋์ ๋๋ค:
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function DataList() {
const [data, setData] = useState(null);
useEffect(() => {
async function fetchData() {
try {
const response = await axios.get('https://api.example.com/data');
setData(response.data); // response.data๊ฐ ๋ฐฐ์ด์ด๋ผ๊ณ ๊ฐ์
} catch (error) {
console.error('๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ค ์ค๋ฅ ๋ฐ์:', error);
}
}
fetchData();
}, []);
return (
<div>
{/* data๊ฐ null์ธ ๊ฒฝ์ฐ map ํจ์๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก ์๋ฌ ๋ฐ์ */}
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
}
export default DataList;
์ ์ฝ๋์์๋ ์ด๊ธฐ ์ํ๋ก data
๋ฅผ null
๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์, ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋ data.map()
์ ํธ์ถํ๋ ค๊ณ ํ๋ฉด “Cannot read property 'map' of null” ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ก๋๋๊ธฐ ์ ๊น์ง ์ ์ ํ ๋ก๋ฉ ์ํ๋ฅผ ํ์ธํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ: ๋ก๋ฉ ์ํ ๊ด๋ฆฌ์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ณ๋์ state ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ก๋๋ ์ดํ์๋ง map ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ ๋๋งํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
๋ก๋ฉ ์ํ ๋ณ์ ์ถ๊ฐ
๋จผ์ , ๋ก๋ฉ ์ํ๋ฅผ ๋ํ๋ด๋ showList
๋ผ๋ state ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ธฐ๊ฐ์ false
๋ก ์ค์ ํฉ๋๋ค.
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function DataList() {
const [data, setData] = useState([]);
const [showList, setShowList] = useState(false);
useEffect(() => {
async function fetchData() {
try {
const response = await axios.get('https://api.example.com/data');
setData(response.data); // response.data๊ฐ ๋ฐฐ์ด์ด์ด์ผ ํจ
setShowList(true); // ๋ฐ์ดํฐ ๋ก๋ฉ์ด ์๋ฃ๋์์์ ๋ํ๋
} catch (error) {
console.error('๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ค ์ค๋ฅ ๋ฐ์:', error);
}
}
fetchData();
}, []);
return (
<div>
{/* ๋ก๋ฉ ์ํ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ๋ ๋๋ง */}
{showList ? (
data.map(item => (
<div key={item.id}>{item.name}</div>
))
) : (
<div>๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ค์
๋๋ค...</div>
)}
</div>
);
}
export default DataList;
์ด ์ฝ๋์์๋ ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์์ง๋ฉด setShowList(true)
๋ฅผ ํธ์ถํ์ฌ ๋ก๋ฉ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. HTML ๋ถ๋ถ์์๋ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ, showList
๊ฐ true
์ผ ๋๋ง ๋ฐฐ์ด ๋ฐ์ดํฐ์ map ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ “๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ค์
๋๋ค...”๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค.
๊ฐ์ ์ฌํญ ๋ฐ ์ถ๊ฐ ๊ณ ๋ ค์ฌํญ
- ์ด๊ธฐ๊ฐ ์ค์
๋ฐฐ์ด ๋ฐ์ดํฐ์ ์ด๊ธฐ๊ฐ์null
๋์ ๋น ๋ฐฐ์ด([]
)๋ก ์ค์ ํ๋ฉด, ์กฐ๊ฑด๋ถ ๋ ๋๋ง ์์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก map ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๊ฐ ๋น์ด ์์ ๋ ์ฌ์ฉ์์๊ฒ ๋ก๋ฉ ์ํ๋ฅผ ๋ช ํํ ์ ๋ฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. - ์๋ฌ ํธ๋ค๋ง
API ํธ์ถ์ด ์คํจํ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์๋ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ state ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ ์ข์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. - ๋ก๋ฉ ์ปดํฌ๋ํธ ํ์ฉ
๋จ์ํ ํ ์คํธ ๋์ ์คํผ๋(spinner)๋ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ก๋ฉ ์ํ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณ๋์ ๋ก๋ฉ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ์กฐ๊ฑด๋ถ ๋ ๋๋งํ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์๋๋ ๊ฐ์ ๋ ์์ ์ฝ๋์ ๋๋ค:
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import Spinner from './Spinner'; // ๋ก๋ฉ ์ปดํฌ๋ํธ ์์
function DataList() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchData() {
try {
const response = await axios.get('https://api.example.com/data');
setData(response.data); // response.data๋ ๋ฐฐ์ด์ด์ด์ผ ํจ
} catch (error) {
setError(error);
console.error('๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ค ์ค๋ฅ ๋ฐ์:', error);
} finally {
setLoading(false); // API ํธ์ถ์ด ๋๋๋ฉด ๋ก๋ฉ ์ํ๋ฅผ false๋ก ๋ณ๊ฒฝ
}
}
fetchData();
}, []);
if (loading) {
return <Spinner />; // ๋ก๋ฉ ์ค์ธ ๊ฒฝ์ฐ ์คํผ๋๋ฅผ ๋ ๋๋ง
}
if (error) {
return <div>๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋๋ฐ ์คํจํ์ต๋๋ค. ๋ค์ ์๋ํด ์ฃผ์ธ์.</div>;
}
return (
<div>
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
}
export default DataList;
์ด์ ๊ฐ์ด ๋ก๋ฉ, ์๋ฌ, ๋ฐ์ดํฐ ์ํ๋ฅผ ์ธ๋ถํํ์ฌ ๊ด๋ฆฌํ๋ฉด, ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ ๋๋ง ๊ฐ์ ํ์ด๋ฐ ๋ฌธ์ ๋ก ์ธํ ์ค๋ฅ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ์ Promise ๊ฐ์ฒด ์ดํดํ๊ธฐ
React์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋ ํํ ๊ฒช๋ ๋ฌธ์ ๋ ๋ฐ๋ก Promise ๊ฐ์ฒด์ ๊ด๋ จ๋ ๊ฒ์ ๋๋ค. Axios์ ๊ฐ์ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ API ํธ์ถ ์ Promise๋ฅผ ๋ฐํํฉ๋๋ค. Promise๋ ๋น๋๊ธฐ ์์ ์ ์๋ฃ๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด๋ก, ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋์ฐฉํ๊ธฐ ์ ์ ํด๋น ๊ฐ์ฒด๊ฐ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
Promise ๊ฐ์ฒด์ ํน์ง
- ๋๊ธฐ ์ํ(Pending)
Promise๊ฐ ์์ฑ๋ ์งํ์๋ ์์ง ๊ฐ์ด ๊ฒฐ์ ๋์ง ์์ ์ํ์ ๋๋ค. ์ด ๋๋ null ํน์ undefined์ ์ ์ฌํ ์ํ๋ก ๊ฐ์ฃผํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์ด ์์ง ์์ต๋๋ค. - ์ดํ ์ํ(Fulfilled)
API ํธ์ถ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด, Promise๋ ์ดํ ์ํ๊ฐ ๋์ด ์ค์ ๋ฐ์ดํฐ ๊ฐ์ ๋ฐํํฉ๋๋ค. - ๊ฑฐ๋ถ ์ํ(Rejected)
API ํธ์ถ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, Promise๋ ๊ฑฐ๋ถ ์ํ๊ฐ ๋์ด ์๋ฌ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
์ด๋ฌํ Promise์ ๋น๋๊ธฐ ํน์ฑ ๋๋ฌธ์, ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ฐ์์ง๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ด๊ธฐ๊ฐ์ด null์ด๊ฑฐ๋ ๋น์ด ์๋ ๋ฐฐ์ด์ผ ๊ฒฝ์ฐ, map ํจ์์ ๊ฐ์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
๋ฐ๋ผ์, ๋ฐ์ดํฐ๊ฐ ์์ ํ ์ดํ๋์์์ ๋ณด์ฅํ๋ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ๊ฐ ํ์์ ์ ๋๋ค. ์์์ ์๊ฐํ ๋ฐฉ๋ฒ์ฒ๋ผ, API ํธ์ถ์ ์๋ฃ ์์ ์ ์ฒดํฌํ๊ณ , ์ด์ ๋ฐ๋ผ ๋ ๋๋ง์ ์ ์ดํ๋ ๊ฒ์ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ์ค์ํ ํจํด์ ๋๋ค.
์ถ๊ฐ ํ: ์ต์ ๋ ์ฒด์ด๋(Optional Chaining) ํ์ฉ
์ต๊ทผ JavaScript์์๋ ์ต์
๋ ์ฒด์ด๋(Optional Chaining) ์ฐ์ฐ์(?.
)๋ฅผ ์ง์ํจ์ ๋ฐ๋ผ, ๋ฐ์ดํฐ๊ฐ null ๋๋ undefined์ผ ๋ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ ๊ณต๋๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:
return (
<div>
{data?.map(item => (
<div key={item.id}>{item.name}</div>
)) || <div>๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.</div>}
</div>
);
์ด ์ฝ๋๋ data
๊ฐ ์กด์ฌํ ๋๋ง map ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด “๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.”๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๋ค๋ง, ์ต์
๋ ์ฒด์ด๋์ ๋ฐ์ดํฐ์ ๋ก๋ฉ ์ํ๋ฅผ ๋ช
ํํ๊ฒ ํํํด์ฃผ์ง๋ ์์ผ๋ฏ๋ก, ์ฌ์ ํ ๋ก๋ฉ ์ํ์ ์๋ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ณ๋์ ๋ก์ง์ด ํ์ํฉ๋๋ค.
์ต์ข ์ ๋ฆฌ ๋ฐ ๊ฒฐ๋ก
React์์ Axios๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ฉด์ map ํจ์ ํธ์ถ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์ฃผ๋ก ๋ฐ์ดํฐ๊ฐ ์์ง Promise ๊ฐ์ฒด๋ก ๋จ์์๊ฑฐ๋ ์ด๊ธฐ๊ฐ์ด null์ธ ์ํ์์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ํ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค:
- ๋ฐ์ดํฐ์ ์ด๊ธฐ๊ฐ ์ค์
๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ด๊ธฐ๊ฐ์ null์ด ์๋ ๋น ๋ฐฐ์ด([])๋ก ์ค์ ํ์ฌ, ๊ธฐ๋ณธ์ ์ธ map ํธ์ถ์ด ๊ฐ๋ฅํ๋๋ก ํฉ๋๋ค. - ๋ก๋ฉ ์ํ ๊ด๋ฆฌ
๋ณ๋์ state ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ก๋ฉ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , API ํธ์ถ์ด ์๋ฃ๋์์ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ด๋ฅผ ํตํด Promise ๊ฐ์ฒด๊ฐ ํด๊ฒฐ๋๊ธฐ ์ ์ ๋ ๋๋ง๋๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. - ์กฐ๊ฑด๋ถ ๋ ๋๋ง ํ์ฉ
์ผํญ ์ฐ์ฐ์๋ ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ, ๋ฐ์ดํฐ ๋ก๋ฉ ์ค, ์๋ฌ ๋ฐ์, ๋ฐ์ดํฐ ์ ์ ๋ก๋ฉ ๋ฑ ๊ฐ ์ํ์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. - ์ต์
๋ ์ฒด์ด๋ ๊ณ ๋ ค
์ต์ ๋ ์ฒด์ด๋์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์์ ๋ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์์ง๋ง, ๋ก๋ฉ ์ํ์ ์๋ฌ ์ํ๋ ๋ณ๋๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
React ์ ํ๋ฆฌ์ผ์ด์
์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ๋ํ๋๋ "map ํจ์ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ๋ค"๋ ์ค๋ฅ๋ ๋ฐ์ดํฐ์ ์ด๊ธฐ ์ํ์ Promise ๊ฐ์ฒด์ ํน์ฑ์์ ๊ธฐ์ธํฉ๋๋ค. ๊ฐ๋จํ๊ฒ ๋งํด, ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ก๋๋์ง ์์์ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ฉฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ก๋ฉ ์ํ๋ฅผ ๋ํ๋ด๋ state ๋ณ์๋ฅผ ์์ฑํ๊ณ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์ ์ฉํ๋ ๋ฐฉ์์ด ํจ๊ณผ์ ์
๋๋ค.
์ค์ ๊ฐ๋ฐ ํ์ฅ์์๋ ๋ฐ์ดํฐ์ ์ดํ ์ํ๋ฅผ ๋ฉด๋ฐํ ํ์
ํ๊ณ , ์ฌ์ฉ์์๊ฒ ์ ์ ํ ํผ๋๋ฐฑ(๋ก๋ฉ ์คํผ๋, ์๋ฌ ๋ฉ์์ง ๋ฑ)์ ์ ๊ณตํ๋ ๊ฒ์ด ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ํฅ์์ํค๋ ํต์ฌ ์์์์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
์์์ ์ ์ํ ๋ฐฉ๋ฒ ์ธ์๋, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ์ํด ์ปค์คํ ํ (Custom Hook)์ ๋ง๋ค์ด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํจ์นญ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ํ ์ปดํฌ๋ํธ์์ ๊ณตํต๋ ํจํด์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ์์ฒญ, ๋ก๋ฉ, ์๋ฌ ์ฒ๋ฆฌ ๋ก์ง์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ค ๋ช ํํ๊ฒ ์ดํดํ๊ณ , Promise์ ์ํ ๋ณํ์ ๋ฐ๋ฅธ ์ ์ ํ ์ฒ๋ฆฌ๊ฐ ์ผ๋ง๋ ์ค์ํ์ง ๋ค์ ํ ๋ฒ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. React์ Axios, ๊ทธ๋ฆฌ๊ณ REST API๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ ์ด๋ฌํ ์ ์ ์ ๋ ํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด, ๋น์ทํ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๊ณ ๋ณด๋ค ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์ ๊ฒ์ ๋๋ค.
์ด์์ผ๋ก, [React] REST API, AXIOS๋ก ๋ฐ์์จ Array ๊ฐ์ฒด์ map ํจ์ ํธ์ถ ์ค๋ฅ์ ๊ทธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ ์ด ๋ด์ฉ์ด ๋์์ด ๋๊ธธ ๋ฐ๋ผ๋ฉฐ, ์ถ๊ฐ์ ์ธ ์ง๋ฌธ์ด๋ ์๊ฒฌ์ด ์๋ค๋ฉด ๋๊ธ์ ํตํด ๊ณต์ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
Happy Coding!
๋๊ธ