본문 바로가기
CodeIt_Sprint/React로 데이터 다루기

(2)React로 데이터 다루기_2_프로젝트에 외부 데이터 컴포넌트에 넣어보기

by 코잼민 2024. 12. 26.

● 이론1_외부의 mock.json을 갖고와서, 컴포넌트에 호출하여, 넣어보기

○ 기본 세팅 :  처음 "npm init react-app ."을 터미널에 입력하여, React 프로젝트를 생성 후, 생성된 구성 파일들을 아래와 같이 삭제하여 구성해라.

 

 

○ 사이트에서 [mock.json]을 다운 받은 후, [src]폴더내에 배치한다. 

mock.json
0.04MB

[

  {
    "id": 1, //해당 영화 리뷰에 대한 고유한 넘버 속성
    "title": "결백", //영화 제목
    "imgUrl": "https://learn-codeit-kr-static.s3.ap-northeast-2.amazonaws.com/react-02/film-reviews/5f2ad6df-2660-4b41-ad8b-df218a404346.jpg",
    //영화 이미지 url 속성
    "rating": 2, //리뷰 평점 순서?
    "content": "유명 로펌의 에이스 변호사 ‘정인(신혜선)’은 아빠의 장례식장에서 농약 막걸리 살인사건이 일어났음을 알게 된다. 치매에 걸린 엄마 ‘화자(배종옥)’가 용의자로 지목되고, 그녀의 결백을 주장하기 위해 고향으로 내려가 직접 변호를 맡는다. 사건을 추적하던 중 시장 ‘추인회(허준호)’를 중심으로 한 마을 사람들의 조직적 은폐와 거짓 진술 등 수상한 정황을 포착한 ‘정인’. 그날의 기억을 모두 잃은 ‘화자’의 결백을 입증하기 위해 모든 사람들과 맞서기 시작하는데…! 파헤칠수록 커지는 의혹, 과연 진실은 무엇인가?",
    //리뷰 내용 
    "createdAt": 1591714800000,
    //리뷰 생성 날짜
    "updatedAt": 1591714800000
    //리뷰 최종 수정 날짜
  },
  
 ]

 

○ [src] 폴더 내에 [components]라는 폴더 생성한다. : 컴포넌트의 코드가 들어있는 폴더

 

○ [Components] 폴더 내에 ReviewList 컴포넌트 작성하기 //mock.json의 데이터 호출을 담당하는 컴포넌트

 - ReviewList.js

//import items from "../mock.json";
//외부 mock.json을 여기다 호출 X

function ReviewList({ items }) {
  console.log(items);//데이터가 정상적으로 호출되는지 console에 출력해보기

  return <ul></ul>;//일단 ul태그만
}

export default ReviewList;

 

[Components] 폴더 내에 최상위 컴포넌트인 App.js 작성

 - App.js

import ReviewList from "./ReviewList";
import items from "../mock.json";//외부 데이터 파일인 mock.json를 import

function App() {
  return (
    <div>
      <ReviewList items={items} />//컴포넌트 속성에 대입
    </div>
  );
}

export default App;

 

[index.js]에 App 컴포넌트만 딱 호출하여, 렌더링 한다.

 - index.js

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./components/App.js";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);

 

  출력 결과 :

"F12" 눌러, 브라우저의 개발자 도구의 console창을 눌러보면, 아래의 json 데이터들이 출력되는 것을 알수있음 => 정상적으로 데이터 불러오기 성공

 

● 이론2_외부의 데이터를 태그 , 형식 등을 구조화 해주는 컴포넌트 작성하기 //ReviewList 컴포넌트 작성

이전 ReviewList.js

function ReviewList({ items }) {
  console.log(items);

  return <ul></ul>;
}

export default ReviewList;

 

연습1_ 각 데이터의 title 속성값을 <li>태그에 textContent가 넣인 채로 반환하도록 작성해보기

사용 문법 : 

  • map() 메소드 //json의 객체 프로퍼티 메소드
  • map() 메소드 매개인자 내 콜백 메소드 + return (<li> + title 속성값)
function ReviewList({ items }) {
  return (
    <ul>
      {items.map((item) => {
        return <li>{item.title}</li>;
      })}
    </ul>
  );
}

export default ReviewList;

 

◎ 출력 결과 : 

 

 연습2_ json의 각 항목에 대한 데이터 출력을 컴포넌트로 작성해보기

 사용 문법 : 

  • formatDate() 메소드 : json의 데이터 중 날짜 형식을 알맞은 출력의 문자열로 반환 메소드
  • ★ReviewListItem 컴포넌트 : json의 각 데이터를 태그들을 추가하여, 알맞은 형식의 Dom구조로 반환하는 컴포넌트 //컴포넌트 내에서 또 다른 컴포넌트를 선언할 수 있다는 것을 처음 알았다.

- ReviewList.js

//json의 날짜 속성값을 => 문자열로 변환 반환 메소드드
function formatDate(value) {
  const date = new Date(value);

  return `${date.getFullYear()}. ${date.getMonth() + 1}. ${date.getDate()}`;
}

//json의 각 항목을 태그형식으로 반환 메소드
function ReviewListItem({ item }) {
  return (
    <div className="ReviewListItem">
      <img
        className="ReviewListItem-img"
        src={item.imgUrl}
        alt={item.title}
      ></img>
      <div>
        <h1>{item.title}</h1>
        <p>{item.rating}</p>
        <p>{formatDate(item.createdAt)}</p>
        <p>{item.content}</p>
      </div>
    </div>
  );
}

function ReviewList({ items }) {
  return (
    <ul>
      {items.map((item) => {
        return (
          <li>
            <ReviewListItem item={item} />
          </li>
        );
      })}
    </ul>
  );
}

export default ReviewList;

 

◎ 출력 결과 : 

여기서 css까지 적용하면 더 깔끔하게 출려된다.

- ReviewList.css

.ReviewListItem {
  display: flex;
  padding: 10px;
  align-items: center;
}

.ReviewListItem-img {
  width: 200px;
  height: 300px;
  object-fit: cover;
  margin-right: 20px;
}