이번 편의 결과물: 코드 변경 없음 — 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 |
| 필터 값·입력 폼 필드 | useState | App.jsx |
| 테마(light/dark) | useContext(ThemeContext) | App.jsx, ThemeToggle.jsx |
books 저장 | useEffect로 localStorage에 직접 쓰기 | 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/useCallback | 09 |
| 오류 시 흰 화면 | Error Boundary + lazy + Suspense | 11 |
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-dom3. 실행 결과 확인
node --version4. 확인
react,react-dom버전이 19.x인지 확인합니다.src/App.jsx를 열어 위 표의 네 가지 상태(books, 필터·입력값, 테마, 저장)가 실제로 그 방식으로 구현되어 있는지 확인합니다.
확인
npm run dev실행 후 브라우저에서 책 목록·추가 폼·테마 토글 버튼이 한 화면에 보입니다.- 폴더 구조가 위 트리와 다르면(예:
reducers/대신 다른 위치에 있음) 02편부터 시작하기 전에 구조를 맞춥니다.
직접 해보기
src/App.jsx를 읽고booksstate가 어디서 초기화되는지(useReducer의 두 번째·세 번째 인자) 찾아봅니다.localStorage에 저장된 키 이름을 브라우저 개발자 도구의 Application 탭에서 확인해봅니다.
정답 보기
useReducer(booksReducer, undefined, initFn) 형태라면 initFn이 localStorage를 읽어 초기값을 만듭니다. 개발자 도구의 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