ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [23Ideal/React] 게시판 만들기 (2) - 게시물 목록 조회하기 (fetch, get API)
    Project/23ideal 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 값이 바뀌었을때 게시판 목록이 렌더링 된다!

Designed by Tistory.