mock data는 백엔드 API를 모방하기에 실제 백엔드 API에서 응답값의 형태인 json 파일로 만들어줘야합니다.
commentData.json
파일 생성["안녕하세요", "반갑습니다", "맞팔해요"]
public
폴더 > data
폴더 > commentData.json
http://localhost:3000/data/commentData.json
주소를 입력하여 확인해볼 수 있습니다.http://localhost:3000/data/commentData.json
를 API 주소로 생각하고 http 요청을 통해서 API 요청을 보내고 응답을 받아보겠습니다.
Feed.js
import React, { useState, useEffect } from 'react';
...
const [comment, setComment] = useState('');
const commentInput = event => {
const { value } = event.target;
setComment(value);
};
const [commentArray, setCommentArray] = useState([]);
useEffect(() => {
fetch('http://localhost:3000/data/commentData.json', {
method: 'GET', //GET method는 기본값이라서 생략이 가능합니다.
})
.then(res => res.json())
.then(data => {
setCommentArray(data);
});
}, []);
...
javascript에서 http 요청을 보낼때는 fetch
함수를 사용합니다.
fetch
함수는 첫번째 인자로 http 요청을 보낼 API주소, 두번째 인자로 요청을 보낼때의 옵션들을 객체형태로 받습니다.
우리가 json 파일을 저장해 둔 주소를 API주소로, 그리고 데이터를 가져오기 위한 요청 GET
method를 활용해 요청을 보냈습니다.
데이터를 요청하는 시점을 특정해야하는데, 여기서는 useEffect 훅을 활용하여 컴포넌트가 렌더링 된 이후 데이터를 요청합니다. 요청이 성공적으로 완료되면 setCommentArray
함수를 사용하여 commentArray
state 를 응답 받은 값으로 바꿔줍니다.
여러개의 데이터 값을 입력하는 것이 아니라 1:1로 값이 입력되어 출력 되는 것이기 때문에 객체 생성이 아닌 배열로 생성 가능하다.
commentData.json
["안녕하세요", "반갑습니다", "맞팔해요"]
mock data 생성 전 어떤 소스들을 객체로 만들건지 판단하면 된다.
나는 피드안에서 프로필 사진, 아이디, 피드 사진, 게시 글로만 진행해봤다.
feedData.json
[
{
"id": 1,
"profileSrc": "/images/HaeYongLee/websta_circle.png",
"profileId": "hey.yong44",
"imgSrc": "/images/HaeYongLee/article1.jpg",
"feedScript": "저녁엔 피맥 한잔~"
},
{
"id": 2,
"profileSrc": "/images/HaeYongLee/websta_circle.png",
"profileId": "hey.yong44",
"imgSrc": "/images/HaeYongLee/JjangAh.jpg",
"feedScript": "잘자는 댕댕이 짱아"
},
{
"id": 3,
"profileSrc": "/images/HaeYongLee/websta_circle.png",
"profileId": "hey.yong44",
"imgSrc": "/images/HaeYongLee/cherry_blossom.jpg",
"feedScript": "봄에는 역시 벚꽃 구경"
}
]
id 값을 넣어줘야(데이터를 명확하게 정해줘야) 순서대로 진행 할 수 있고 순서에 맞게 댓글 삭제와 추가를 진행 가능하고 한다.
댓글에 구현했던 함수와 return 값을 모두 이동시키고 넣어줄 props 값을 추가 해준다.
feed.js
...
function Feed({ profileSrc, profileId, imgSrc, feedScript })
...
return (
...
<img alt="header profile" src={profileSrc} width="32px" />
...
<p>{profileId}</p>
...
<img alt="main feed" src={imgSrc} />
...
<p>{feedScript}</p>
...
main.js
...
const [feed, setFeed] = useState([]); // (3)
...
useEffect(() => {
fetch('http://localhost:3000/data/feedData.json', {
method: 'GET',
})
.then(res => res.json())
.then(data => {
setFeed(data); // 입력된 feed 값이 저장된 data
});
}, []); // (1)
...
return (
...
{feed.map(f => ( // f는 함수의 변수 값이기 때문에 아무 값이나 넣어주면 된다.
<Feed
key={f.id} // key 값이 컴포넌트 안에서 입력돠었고 feed 컴포넌트안에서는 사용되지 않기 때문에 feed 컴포넌트의 props로는 등록할 필요가 없다.
profileSrc={f.profileSrc}
profileId={f.profileId}
imgSrc={f.imgSrc}
feedScript={f.feedScript}
/>
))}
...
map 함수를 적용하는 방법이 어려워 다시 기본부터 공부를 해야할 것 같다는 생각이 들었다.
참고 및 출처
위코드 강의
WOW 이런 코드가 다 뇌에 들어있으시다니.. 최고의 개발자