📌 오늘 학습한 주제
- React 18
ReactDOM.createRoot를 통한 엔트리 포인트 설정 및 렌더링 (index.js)
- React JSX 내 데이터 가공 (
filter(), map()) 및 리스트 동적 출력 (LibraryPage.jsx)
- React 자식 컴포넌트 생성 및 Props를 통한 데이터 전달 (
Book.jsx)
💡 오늘 배운 것 — 나만의 언어로
① 오늘의 목표
- React 프로젝트의 진입점 구조를 이해하고, 상위 컴포넌트에서 배열 데이터를 가공하여 하위 컴포넌트로 Props를 전달하는 전체적인 렌더링 흐름 완성하기
② 학습할 내용
- 엔트리 포인트 연동 (
index.js): ReactDOM.createRoot(document.getElementById('root'))를 사용하여 메인 HTML 노드에 <LibraryPage /> 컴포넌트를 마운트시켰다.
- 데이터 필터링 및 매핑 (
LibraryPage.jsx): 도서 목록 배열 중 특정 카테고리(category === 'lang')에 해당하는 데이터만 filter()로 선별한 후, map()을 이용해 <Book /> 컴포넌트 배열로 변환했다.
- Props 수신 및 출력 (
Book.jsx): 자식 컴포넌트인 Book에서 파라미터로 props를 받아 {props.bookName} 형태로 화면에 동적으로 출력했다.
💻 오늘 핵심 코드
1. 진입점 렌더링 (index.js)
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import LibraryPage from './pages/smaple/LibraryPage';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<LibraryPage />
);
reportWebVitals();
2. 상위 컴포넌트 및 데이터 가공 (LibraryPage.jsx)
import Book from "../../components/sample/Book";
const LibraryPage = () => {
const books = [
{ category: 'it', bookName: 'java', price: '10,000원' },
{ category: 'it', bookName: 'java', price: '10,000원' },
{ category: 'lang', bookName: 'kor', price: '10,000원' },
{ category: 'lang', bookName: 'eng', price: '10,000원' },
{ category: 'essay', bookName: 'xxxx', price: '10,000원' },
{ category: 'essay', bookName: 'xxxx', price: '10,000원' },
];
return (
<div>
{
books
.filter(book => book.category === 'lang')
.map((book, idx) => {
return <Book key={idx} bookName={book.bookName} />;
})
}
</div>
);
}
export default LibraryPage;
3. 하위 컴포넌트 및 Props 수신 (Book.jsx)
const Book = (props) => {
return (
<div>
<div>
<span>책이름 : {props.bookName} </span>
</div>
</div>
);
}
export default Book;
✨ 이해한 점
index.js에서 호출한 상위 컴포넌트(LibraryPage)가 자식 컴포넌트(Book)에 속성(bookName={...})을 전달하고, 자식 컴포넌트에서 props.bookName으로 수신하는 단방향 데이터 흐름(Unidirectional Data Flow)을 이해했다.
- 중괄호
{} 표현식을 사용해 자바스크립트의 변수 및 Props 객체를 HTML UI 레이아웃 안으로 자연스럽게 합성할 수 있다.
🛠️ 실습 / 결과물 & 참고 자료
③ 실습 / 결과물
- 강의 실습코드:
index.js, LibraryPage.jsx, Book.jsx 코드를 조합하여, React 프로젝트 실행 시 'lang' 카테고리의 책 이름(kor, eng)이 컴포넌트를 거쳐 화면에 출력되는 결과물 구현.
④ 참고 자료
- w3schools / React Official Docs: React Components & Props 예제 참고
🔍 문제와 해결
- 막힌 부분: 자식 컴포넌트에서 Props를 수신할 때 전달받은 속성명과 받는 속성명이 일치하지 않거나,
map() 렌더링 시 고유 key 값이 누락되어 경고가 발생하는 현상 점검.
- 해결 방법: 상위 컴포넌트의
bookName={book.bookName}과 하위 컴포넌트의 {props.bookName} 이름을 바르게 맞추고, map((book, idx) => ...)에서 key={idx}를 추가하여 마운트를 완성함.
🎯 다음에 할 일