Skip to Content
WebReactReact 중급01. 출발점 점검과 중급 로드맵

이번 편의 결과물: 코드 변경 없음 — bookshelf 폴더 구조와 상태 관리 방식을 이 과목 기준으로 점검합니다. · 다루는 개념: react_1 산출물 점검, 중급 로드맵, 실습 폴더 규칙

이 편에서 만드는 파일

bookshelf/ package.json vite.config.js index.html src/ main.jsx App.jsx components/ BookForm.jsx BookList.jsx BookCard.jsx ThemeToggle.jsx context/ ThemeContext.jsx reducers/ booksReducer.js App.css

새 파일은 없습니다. 위 구조가 지금 내 bookshelf 폴더와 같은지 확인만 합니다. 다르다면 파일명·폴더명을 이 구조에 맞춥니다.

개념 정리

지금 bookshelf가 하는 일

react_1을 마친 bookshelf는 페이지 하나에서 책 목록·추가 폼·필터·테마 전환을 모두 처리합니다.

상태관리 방식위치
books 배열useReducer(booksReducer)added/toggled/deleted 액션App.jsx
필터 값·입력 폼 필드useStateApp.jsx
테마(light/dark)useContext(ThemeContext)App.jsx, ThemeToggle.jsx
books 저장useEffectlocalStorage에 직접 쓰기App.jsx

각 책 객체는 id, title, author, status(wish|reading|done), rating, pages, coverColor, startedAt, finishedAt, memo 필드를 가집니다.

중급에서 달라지는 것

지금(react_1)중급(react_2)담당 편
페이지 1개목록·상세·추가 3개 라우트 + 중첩 라우트03–05
App.jsx에 저장 로직 인라인useLocalStorage, useDebounce 커스텀 훅으로 분리06, 07
검증 없이 즉시 추가제출 전 검증 + 인라인 에러 메시지08
리렌더 원인 미측정Profiler로 측정 후에만 memo/useMemo/useCallback09
오류 시 흰 화면Error Boundary + lazy + Suspense11
window.confirm으로 삭제 확인createPortal 모달 + 포커스 트랩12
배열 그대로 저장{ byId, allIds } 정규화13
전역 CSS 파일 하나*.module.css로 컴포넌트 단위 격리15
테스트 없음Vitest+RTL 컴포넌트 테스트 1개16

기존 문법(컴포넌트, JSX, useState/useEffect/useReducer/useRef, 이벤트·리스트 렌더링, Context)은 이미 다룰 수 있다고 가정하고 반복하지 않습니다.

실습 폴더 규칙

  • 편 번호가 바뀔 때마다 실제 코드는 같은 bookshelf/ 폴더 안에서 계속 이어집니다. 편마다 새 폴더를 만들지 않습니다.
  • 각 편 상단의 “이 편에서 만드는 파일” 트리에서 +는 새 파일, ~는 수정 파일입니다.
  • 한 편을 마칠 때마다 커밋을 하나 남기면 편 사이를 되짚기 쉽습니다. 이 과목 문서 자체는 커밋을 요구하지 않지만 권장합니다.

실습

1. 폴더 구조 확인

bookshelf 프로젝트 루트에서 구조를 확인합니다.

2. 명령 실행

npm ls react react-dom

3. 실행 결과 확인

node --version

4. 확인

  • react, react-dom 버전이 19.x인지 확인합니다.
  • src/App.jsx를 열어 위 표의 네 가지 상태(books, 필터·입력값, 테마, 저장)가 실제로 그 방식으로 구현되어 있는지 확인합니다.

확인

  • npm run dev 실행 후 브라우저에서 책 목록·추가 폼·테마 토글 버튼이 한 화면에 보입니다.
  • 폴더 구조가 위 트리와 다르면(예: reducers/ 대신 다른 위치에 있음) 02편부터 시작하기 전에 구조를 맞춥니다.

직접 해보기

  1. src/App.jsx를 읽고 books state가 어디서 초기화되는지(useReducer의 두 번째·세 번째 인자) 찾아봅니다.
  2. localStorage에 저장된 키 이름을 브라우저 개발자 도구의 Application 탭에서 확인해봅니다.

정답 보기

useReducer(booksReducer, undefined, initFn) 형태라면 initFnlocalStorage를 읽어 초기값을 만듭니다. 개발자 도구의 Application → Local Storage에서 bookshelf로 시작하는 키를 찾을 수 있습니다.

자주 하는 실수

증상원인고치는 법
npm run dev 실행 시 모듈을 찾을 수 없다는 오류node_modules가 없거나 오래됨npm install을 다시 실행한다
폴더 구조가 이 문서와 다름react_1을 다른 방식으로 정리함파일을 옮기거나 이름을 바꿔 위 구조에 맞춘다. 옮긴 뒤에는 반드시 npm run dev로 정상 동작을 확인한다
React 버전이 18 이하프로젝트 생성 시점이 오래됨npm install react@latest react-dom@latest로 올린다

확인 문제

문제 14지선다
react_1이 끝난 시점의 bookshelf에서 books 상태를 관리하는 방식은?
문제 24지선다
이 과목(react_2)이 다루지 않는 것은?
문제 34지선다
지금 bookshelf 페이지 수는?
문제 44지선다
이 과목에서 books를 localStorage에 저장하는 로직을 커스텀 훅으로 옮기는 편은?
문제 54지선다
'이 편에서 만드는 파일' 트리에서 물결표 없이 쓰이는 두 기호의 의미로 옳은 것은?

참고 자료

Last updated on