[๋ฆฌ์•กํŠธ] ๋ฐฑ์—”๋“œ API ํ˜ธ์ถœ (feat. Get ์š”์ฒญ)

2025. 8. 11. 20:17ใ†React

ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š” ํ’€์Šคํƒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ธฐ์ดˆ ํ•™์Šต์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „๊นŒ์ง€๋Š” UI ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ–ˆ๊ณ  ์ด์ œ ๋ฐฑ์—”๋“œ์™€์˜ ์—ฐ๋™ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Fetch์™€ Axios ์ค‘ ๋‘˜์˜ ํŠน์ง•์„ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ Axios๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Axios๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

1. ์ž๋™ ์ง๋ ฌํ™” ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

  • JSON ๋ฐ์ดํ„ฐ ์ž๋™ ๋ณ€ํ™˜ ๋ฐ ์ž๋™ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋กœ ์ฝ”๋“œ ๊ธธ์ด๋ฅผ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

2. ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ง€์›

  • ์š”์ฒญ ํƒ€์ž„์•„์›ƒ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 
  • ์š”์ฒญ/์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํ†ตํ•ด ์š”์ฒญ ์ „ ํ›„๋กœ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

3. ํ•™์Šต ๋‹จ๊ณ„์— ์ ํ•ฉ

  • ์„ค์น˜๋งŒ ํ•œ๋‹ค๋ฉด ๋ณต์žกํ•œ ์„ค์ • ์—†์ด๋„ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ ๊ตฌํ˜„๋œ ์ž๋™ํ™” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

Fetch vs Axios ์ƒ์„ธ ๋น„๊ต

์ž์„ธํ•œ ๋น„๊ต๋Š” ์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

[๋ฆฌ์•กํŠธ] fetch์™€ axios ์ฐจ์ด

Fetch๋ž€?Fetch API๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์œ„ํ•ด fetch()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €์— ๊ธฐ๋ณธ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ๋ณ„๋„์˜ ์„ค์น˜๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‰ฝ๊ฒŒ

clvl1022.tistory.com

 


Get ์š”์ฒญ ๋ณด๋‚ด๊ธฐ 

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด, ๋ฐฑ์—”๋“œ์—์„œ ์ง„๋ฃŒ๊ณผ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค.

์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ง„๋ฃŒ๊ณผ์™€ ์•„์ด์ฝ˜์„ ๋„์šด ์ƒํ™ฉ

 

 

  • ๋ฐ์ดํ„ฐ๋Š” ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋™์•ˆ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— useEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ๋™๊ธฐํ™”๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • API ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ state์— ์ €์žฅํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ๋ณ„๋„์˜ ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ๋™์ ์œผ๋กœ UI์— ๋ฐ˜์˜๋˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
function getDepartments() {
    const [departments, setDepartments] = useState([]);
    const token = "ํ† ํฐ ๊ฐ’"
    useEffect(() => {
        //์š”์ฒญ ๋ณด๋‚ด๋Š” ๋ถ€๋ถ„
        axios.get(
            "http://localhost:8080/api/clinics/departments", {
            headers: {
                "Authorization": `Bearer ${token}`,
            }
        }
        )
        .then((res) => 
             setDepartments(res.data.departments) //์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ departments์— ์ €์žฅ 
        )
        .catch(err => console.log(err));
    }, []);
    
    return departments;
 }

 

โš ๏ธ axios.get(, [ ]) [ ]๋ฅผ ๋„ฃ๋Š” ์ด์œ 

๋”๋ณด๊ธฐ

[ ]๋ฅผ ๋„ฃ์„ ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

[ ]๋ฅผ ๋„ฃ์ง€ ์•Š์œผ๋ฉด axios ์š”์ฒญ์ด ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜์–ด ์ค‘๋ณต์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.  

 

โžก๏ธ ์™ธ๋ถ€ API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ดˆ๊ธฐํ™” ์ƒํƒœ๋กœ ์„ธํŒ…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์š”์ฒญ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ง„๋ฃŒ๊ณผ ํ‘œ์‹œ ๋ถ€๋ถ„ ์ฝ”๋“œ

<div
  className="shadow-md rounded-lg p-10 flex gap-10 justify-center w-full overflow-x-auto scrollbar-hide"
>
  {getDepartments().map((department, index) => (
    <DepartmentIcon
      key={index}
      name={department.name}
      imageUrl={department.icon}
    />
  ))}
</div>

 

DepartmentIcon ์ปดํฌ๋„ŒํŠธ

function DepartmentIcon({ imageUrl, name }) {
    return (
        <div className="text-center bg-gray-200 px-10 py-7 rounded-lg shadow">
            <img
                src={imageUrl}
            />
            <p className="font-bold">{name}</p>
        </div>
    );
}

 

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

๋”๋ณด๊ธฐ