5์์ ์ฒซ ๊ฒ์๊ธ์ด๋ค!! ๋ฉ์์ด์ฌ์์ฒ๋ผ ์ธ์ ์ ์งํํด๋ณด๋ฉด์ API์ ๋ํ ์ค๋ช ์ ๋ค์ ์ ์์๋๋ฐ, ์ด ๋ ๋๋ ์กธํ์์ fetch๋ฅผ ์ด์ฉํ ํต์ ์ React์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ๋ฆฌํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐ์ด ๋ค์ด ์ด๋ฅผ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. API๋ ๋ฐ๋์!! ์ค์ํ ๊ฐ๋ ์ด๋ฉด์ ์ด API๋ฅผ ์์ผ๋ก๋ ํต์ ํ๋ ๊ฒ์ด ๋์ ์ญํ ์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ค์ํ๊ฒ ์ง๊ณ ๋์ด๊ฐ์ผํ ์ ์ธ ๊ฒ ๊ฐ๋ค. ์ด๋ฅผ ์ ๋ฆฌํด๋ณด๊ณ ์ถํ์ ๋ด๊ฐ ํท๊ฐ๋ฆฌ๊ฑฐ๋ ๊ฐ๋ ์ ์ ๋ฆฌํ๊ณ ์ถ์ ๋ ์ด ๊ธ์ ์ฐพ์์์ ๋์์ ์ฐพ๊ณ ์ ์์ฑํด๋ณด๋ ค๊ณ ํ๋ค!!
๐ ๋ฉ์์ด ์ฌ์์ฒ๋ผ ์ธ์
์๋ฃ
๐ https://meetup.toast.com/posts/92 (Rest API)
๐ https://studyandwrite.tistory.com/368 (React fetch())
๋จผ์ API๊ฐ ๋ฌด์์ผ๊น??
๊ฐ๋จํ ์๋ก ์ ์ฌ์ง์ ๋ค ์ ์์ํ ๋ฐ ์ ์์ด ๊ณ ๊ฐ์๊ฒ ๋ฉ๋ด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ด๋ฅผ ์ฃผ๋ฌธ๋ฐ์ ์ฃผ๋ฐฉ์ ์ ๋ฌํ๋ค. ๋ค์ ์ ์์ ๋์จ ๋ฉ๋ด๋ฅผ ๊ณ ๊ฐ์๊ฒ ์ ๋ฌํ๋ ๊ณผ์ ์ด ์์ ๊ฒ์ด๋ค. ์ด ๋ ์ ์์ด ๋ฐ๋ก API ๋ค!!
Application Programming Interface์ ์ค์ธ๋ง์ธ API๋ ํ๋ก๊ทธ๋จ์ด ์๋ก ์ํธ์์ฉํ ์ ์๋๋ก ๋์์ ์ฃผ๋ ๋งค๊ฐ์ฒด์ด๋ค. ๋ง์ฝ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ์ฌ์ด์ ํต์ ์ ์ด์ผ๊ธฐํ๋ค๋ฉด ์ด๋ ํ๋ก ํธ์๋๋ API๋ก ๋ถํฐ ์ ๋ณด๋ฅผ ๋ฐ๊ฑฐ๋ ๋ณด๋ผ ์ ์์ผ๋ฉฐ ๋ฐฑ์๋๋ API๋ฅผ ์ ๋ณด๋ฅผ ๋ฐ์ ์ด๋ฅผ ๋ค์ ๋ณด๋ด์ค ์ ์๋ ๊ตฌ์กฐ์ธ ๊ฒ์ด๋ค!!
๊ทธ๋ ๋ค๋ฉด API๋ ๋๊ตฌ๋ ์ง ์ธ ์ ์์๊น??
์์ ๊ฐ์ด API์๋ ์ข ๋ฅ๊ฐ ๋ค์ํ๋ค ๋จ์ด ๋ป ๊ทธ๋๋ก ๊ณต๊ฐ๋์ด ์๊ฑฐ๋, ๊ทธ๋ ์ง ์๊ฑฐ๋, ํน์ ์ฌ๋์๊ฒ ๊ถํ์ ์ฃผ๋ API๋ค์ด ์กด์ฌํ๋ค. ๋์ฒด๋ก Open API๋ค์ ์ด์ฉํ์ฌ ์ฐ๋ฆฌ๋ค์ ๋ค์ด๋ฒ, ์นด์นด์ค ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์์ ์ ๊ณตํ๋ ์ ๋ณด๋ค์ ํ์ฉํ์ฌ ์ํ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ ์๋ ์๋ค!!
API๋ฅผ ์ค๋ช ํ์๋ค๋ฉด Rest API๋ผ๋ ๊ฒ๋ ์ง๋๊ฐ๋ค ๋ค์์ ์ ์๋๋ฐ ์ด๋ Representational State Transfer์ ์ฝ์๋ก ๋คํธ์ํฌ๋ฅผ ํตํด์ ์ปดํจํฐ๋ค๋ผ๋ฆฌ ํต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ํคํ ์ฒ ์คํ์ผ์ด๋ค!! ์ด๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ๋ก ๊ตฌ์ฑ๋์์์ ์๋ ค์ฃผ๋ฉฐ ์ ๋ฌํ๋ ค๋ ๋ด์ฉ๋ค์ด ๋ ์ง์ ๋ค์ ์๋ณตํ์ฌ ํต์ ํ ์ ์๋ ๊ตฌ์กฐ์ด๋ค!!
๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค.
์์ ๊ฐ์ด Rest API์์ ์ค์ํ ์ ์
์ฒซ ๋ฒ์งธ, URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค.
๋ ๋ฒ์งธ, ์์์ ๋ํ ํ์๋ HTTP Method(GET, POST, PUT, DELETE)๋ก ํํํ๋ค.
์ฝ๊ฒ ์ค๋ช
ํ์๋ฉด ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์์ ๋ฐฉ์์ผ๋ก ํต์ ์ ํ๊ณ ์ ํ๋์ง์ ๊ฐ์ ธ์ค๋ ์ ๋ณด๋ฅผ ํํํ๋ ๊ฒ์ด Rest API์ ๊ท์น์ด๋ค!!
์๋ฅผ ๋ค๋ฉด
GET /members/delete/1
์ ๊ฐ์ด delete์ ๋ํ ์์์ ํ์๊ฐ ์ ๋ณด๋ก ๋ค์ด๊ฐ๋ฉด ์๋๊ตฌ
DELETE /members/1
์ด๋ฐ ์์ผ๋ก ์์์ด ์ด๋ค ์์ผ๋ก ํต์ ํ ์ง ํ์๋ฅผ DELETE์ ๊ฐ์ method๋ฅผ ์ฌ์ฉํด์ ํํํด์ค๋ค!!
๋ ์ถ๊ฐ๋ก Rest API๋ ๋จ์ผํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฌํ ์ ๋๋ฌธ์ย ํด๋น API๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ด ๋์ผํ ๊ฒฝ๋ก๋ฅผ ํตํด์ ์ ์ํด์ผ ํ๊ณ , ๊ทธ ๋ฐฉ์์ด ๋จ์ํ๊ฒ ๋๋ค.ย
Rest๋ ์น์ ์ต์ ํ๋์ด์๊ณ , ์ฃผ์ ๋ฐ์ดํฐ ํฌ๋งท์ด jsonํ์์ด๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์ ํ๋ React์์ ํธํ์ฑ์ด ๊ต์ฅํ ์ข๊ตฌ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ด ์ข๋ค!!
์ฃผ์ Rest์ ์ ๋ณด๋ฅผ ์ ๋ฆฌํด๋ณด์๋ฉด
๋ก ์ ๋ฆฌํ ์ ์๊ฒ ๋ค!!!
์์ API์ ๋ํด์ ์ ๋ฆฌํด๋ณด์๋ค!! ๊ทธ๋ ๋ค๋ฉด React์์ ๋ด๊ฐ ์ฌ์ฉํ์๋ ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉํ๊ฒ๋ fetch๊ฐ ๋ฌด์์ธ์ง ์์๋ณด์!!
fetch๋ HTTP ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ์์ฒญ๊ณผ ์๋ต ๋ฑ์ ์์๋ฅผ JavaScript์์ ์ ๊ทผํ๊ณ ์กฐ์ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ค!! fetch๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ๋ ๊ฒ์ ๊ต์ฅํ ๊ฐํธํ๊ณ ์ฌ์ธ ๋ฟ๋ง ์๋๋ผ json ํ์์ ๊ฐ์ ธ์ค๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๊ธฐ๋ ์ฝ๋ค!! ์ด๋ฅผ ์ด์ฉํ์ฌ fetch๋ฅผ ๋ด๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉํ์๋์ง์ ์ฌ์ฉํ ์์๋ฅผ ์ดํด๋ณด์.
fetch(url)
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(JSON.stringify(myJson));
});
์๋ fetch๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ค.
url์ ๊ณง ๊ฐ์ ธ์ค๊ณ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฃผ์์ง ์ด๋ฉฐ ์ฌ๊ธฐ์ ํต์ ํด์ ์ฐ๋ฆฌ๊ฐ response๋ฅผ ํตํด jsonํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ์ฌ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค!!
์ฌ๊ธฐ์ default๋ก method๋ GET์ผ๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ method๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด GET/POST/HEAD/PUT/DELETE/OPTION/PATH ๋ฑ๋ฑ ๋ค์ํ Method๋ฅผ ํ์ฉํ ์ ์๋ค!!
๋ํ headers๋ Request Header๋ฅผ ์ง์ ํ๋ ์ธํฐํ์ด์ค๋, body ๊ฐ์ HTTP Request์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํ์ฌ ์ฌ๋ฌ๊ฐ์ง ํ์ ์ ๋ฃ๊ณ ๊ฐ์ฒด ํ์ (json)ํ์์ผ๋ก ๋ณด๋ด๋ ์ธํฐํ์ด์ค๊ฐ ์๋ค.
fetch(url, {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
headers: {
'Content-Type': 'application/json',
// 'Content-Type': 'application/x-www-form-urlencoded',
},
body: JSON.stringify(data),
})
.then(response => response.json());
์์ ๊ฐ์ ์์์ด๋ค!!
๊ทธ๋ฌ๋ฉด ๊ฐ๋จํ๊ฒ ๋ด๊ฐ ์ด๋ค ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํต์ ํ๋์ง ์กธํ์์ ์ฌ์ฉํ fetchํจ์๋ฅผ ํตํด ํ์ธํ๊ณ ์ ํ๋ค!!
const [content, setContent] = useState([]);
.
.
.
useEffect(() => {
fetch(url).then(
response=>{
return response.json();
}
).then(data=>{
setContent(data);
}
);
.
.
.
return(
.
.
<h2 className={style.question}>Q{question}. {content.content} </h2>
.
.
);
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด content๋ผ๋ jsonํ์์ ๋ฐ์ ๋ฐฐ์ด์ useState๋ฅผ ํตํด ์ ์ธํด ์ค๋ค. ์ด๋ฅผ useEffect๋ฅผ ํตํด ๋ฐ์์จ ์ ๋ณด๋ฅผ ๋ฐ๋ก ๋ ๋๋ง ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ useEffect()๋ฅผ ์ด์ฉํ์ฌ ๊ทธ ์์ fetchํจ์๋ฅผ ์คํ์์ผ์ฃผ์๋ค.
url์ ์์ฑ๋์ด์๋ json ํ์์ ๋ฐ์ดํฐ ๊ฐ์ด๋ฉฐ ์ด๋ฅผ fetch๋ฅผ ํตํด response๋ฅผ ์ด์ฉํ์ฌ jsonํ์์ ๊ฐ์ฒด๋ฅผ ๋ฐ์์จ๋ค!! ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ .then ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋น๋๊ธฐ ํจ์์ธ fetch๋ฅผ ๋๊ธฐํจ์์ธ .then์ ํ์ฉํ์ฌ ๋ฐ์์จ ๊ฐ์ฒด์ ๊ฐ์ setState()๋ฅผ ์ด์ฉํ์ฌ ์๊น ์ ์ธํ content ๋ฐฐ์ด์ ์ ์ฅ์์ผ ์ฃผ๋ ๊ฒ์ด๋ค!!
์ด๋ฅผ ์คํํ๋ฉด API ํต์ ์ ๋ง์ณ ๊ฐ์ ๊ฐ์ ธ์์ผ๋ฉฐ ์ด๋ฅผ ํ์ฉํ ๋ ค๋ฉด ์๊น ์ ์ฅํ content์์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๋๋ค!! ์ด ๋ content๋ผ๋ ํญ๋ชฉ์ ๊ฐ์ ๋ถ๋ฌ์์ ๋ ๋๋งํ ๊ฒ์ด๋ฏ๋ก content.content๋ฅผ {}๋ก ๊ฐ์ธ์ฃผ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์๋ค. ์คํํ ๊ฒฐ๊ณผ๋ ๋ค์์ฒ๋ผ ๋ณผ ์ ์๋ค!!(๋๊ทธ๋ผ๋ฏธ ์น๊ฒ ๋ฐ์ดํฐ ๋ฐ์์จ๊ฑฐ)
ํด ์ด๋ ๊ฒ API๊ฐ ๋ฌด์์ธ์ง, React์์ API ํต์ ์ ์ํ fetch์ ๋ํด์ ์ ๋ฆฌํด๋ณด์๋ค!! ์กธํ๋ฅผ ์งํํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ ์ฌ๋ผ์จ ์ธํด ๊ณต๊ณ ๋ค์ ํ์ธํด๋ณด๋ฉด์ Restful API๋ API ํต์ ๊ณผ์ ์ ๋ํด์ ์ ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ๋๊ผ์๋๋ฐ, ๋ฉ์์ด์ฌ์์ฒ๋ผ ์ธ์
๊ณผ ํจ๊ป ๊ทธ๋ฆฌ๊ณ ๊ตฌ๊ธ๋ง๊ณผ ์กธํ๋ฅผ ์งํํ๋ฉด์ ์ ๋ฆฌํ ์ ์์ด์ ์ข์๋ค!!
์์ ๋๋ฌด๋๋ฌด ๋ฐ์๊ธฐ๋ํ๊ณ ์ด๋ป๊ฒ ํ๋ฉด ๋ด ํฌํธํด๋ฆฌ์ค๋ฅผ ์๊ณ ํ๋ก ํธ์๋ ๊ณต๋ถ๋ฅผ ์งํํ ์ ์์์ง ๊ณ ๋ฏผ์ ๋ง์ดํ์๋๋ฐ ์คํ๋ ค ๊ณต๊ณ ๋ค์ ๋ณด๋ฉด์ ๋ด๊ฐ ๋ฌด์์ ๊ณต๋ถํด์ผ ๊ฒ ๊ตฌ๋๋ฅผ ์กฐ๊ธ ์ ์ ์์๋ ๊ฒ ๊ฐ๋ค. ๋ฐ์๋ฉด์ ๋ด๊ฐ ํด์ผํ ๋ฐฉํฅ์ฑ์ ์ฐพ๊ณ ์๋ ๊ฒ ๊ฐ์์ ์กฐ๊ธ์ด๋๋ง ๋คํ์ด๋ผ๊ณ ์๊ฐํ๋ค!!
์์ผ๋ก๋ React์ ๋ํ ์ฌํ ๊ณผ์ ์ ๊ณต๋ถํด๋ณผ ๋ฟ๋ง์๋๋ผ javascript, typescript์ ๋ํ ๋ฌธ๋ฒ์ ํํํ ๋ค์ง๋๋ก ๊ณต๋ถํด๋ณด๊ตฌ, vue.js์ ์๋ฒ ์ฌ์ด๋๋ ๋๋ง์ SSR(Next.js, Nuxt.js), ๊ทธ๋ฆฌ๊ณ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Redux๊ฐ ๋ญ์ง๋ ์ฐจ์ฐจ ๊ณต๋ถํด๋๊ฐ๋ณด๋๋ก ํ์!!
๋ถ๊ณผ ๊ฑฐ์ 6๊ฐ์๋ง์ ์ด๋งํผ์ด๋ ํด๋๋ค. ๋ค์ 6๊ฐ์์ด ์ง๋๋ฉด ์ผ๋ง๋ ๋ง์ด ํก์ํด ์์์ง ๊ธฐ๋ํด๋ณด๊ณ ๋ ๋ง์ด ์๊ทน๋ฐ๋๋ก ํ์.
ํ์ดํ !!