Project/23ideal

[23Ideal/React] 게시판 만들기 (2) - 게시물 목록 조회하기 (fetch, get API)

마이구미포포 2022. 7. 18. 11:49

앞에서 만든 게시판 테이블에 게시물 목록을 넣어줄 것이다.
앞 게시물은 게시물 제목, 작성자, 작성일을 직접 입력하였지만

이번에는 백엔드와 연결하여 게시판 목록 api 를 불러와 게시판 목록을 조회해보자

fetch 를 사용하였고, fetch method 중 "GET" 을 사용하면 API를 불러올 수 있다

 const [postData,setPostData]=useState([]);

  useEffect(()=>{
    fetch("url 경로", {
    // method:"GET",
      headers: {
        Authorization: `Bearer ${access_token}`,
      },
    })
      .then((res) => res.json())
      .then((response) => {
        setPostData(response.data);
      });
  },[]);

fetch method는 GET 외에도 POST, DELETE, PUT 등이 있다
하지만 디폴트는 get 이기 때문에 주석처리한 method:"GET" 을 꼭 써주지 않아도 method 가 GET 으로 작동한다

백엔드에서 검증된 토큰이 있어야 게시물을 조회할 수 있게끔 설정해놓았기 때문에
access_token 을 헤더에 담아 정보를 불러올 해당 백엔드 경로에 보내준다

정상적으로 API 를 불러오면, postData 에 불러온 data 값이 담길 것이다

return (
    <>
      <table className="common-table">
        <thead>
          <tr>
            {headersName.map((item, index) => {
              return (
                <td className="common-table-header-column" key={index}>
                  {item}
                </td>
              );
            })}
          </tr>
        </thead>
        <tbody >
          { postData.data.map((post, i) => {
            return (
              <tr>
                <td>{i + 1}</td>
                <Link to="/NoticeRead">
                  <td> {post.title}</td>
                </Link>
                <td>{post.createdDate.substring(0, 10)}</td>
                <td>{post.userName}</td>
              </tr>
            );
          })
        }
       </tbody>
     </table>
    </>
  );

그리고 앞 게시물에서 만들어던 게시판 테이블에 map 을 이용하여 postData 를 반복 렌더링 해주면 된다.

* 백엔드에서 api를 불러오면 createdDate 가 "2022-07-18T11:11:11" 이런 형태로 넘어오기 때문에 substring을 이용하여  2022-07-18 만 나타나게 하였다


헤맸던 점 & 해결 방법

postData 의 초기값이 [ ] 이기 때문에 map을 사용하여 렌더링할때 초기값이 null 이라 렌더링되지 않았다
api를 먼저 불러오고, postData의 값이 초기값에서 response.data 값으로 바뀐 후에야 렌더링이 되는 것이다

이 문제를 어떻게 해결할까 하다가 
postData 가 초기값이 아닐때 return 이 되게끔 (렌더링이 되게끔) JSX에 삼항연산자를 써주었다 (조건문)

length를 이용하였고 postData 가 초기값일때는 postData.length 가 0 이므로, 0이 아닐때 렌더링이 되게끔 해주면 된다

return (
    <>
      <table className="common-table">
        <thead>
          <tr>
            {headersName.map((item, index) => {
              return (
                <td className="common-table-header-column" key={index}>
                  {item}
                </td>
              );
            })}
          </tr>
        </thead>
        <tbody >
          { postData.length != 0 ? postData.data.map((post, i) => {
            return (
              <tr>
                <td>{i + 1}</td>
                <Link to="/NoticeRead">
                  <td> {post.title}</td>
                </Link>
                <td>{post.createdDate.substring(0, 10)}</td>
                <td>{post.userName}</td>
              </tr>
            );
          })
        : <div> loading... </div>
		}
        </tbody>
    </>
  );

그럼 postData 가 초기값일때는 loading... 이라는 문구가 뜨고 postData 값이 바뀌었을때 게시판 목록이 렌더링 된다!