책과 산책하는 시간 — AI 표지 생성 기능을 갖춘 도서 관리 웹 서비스
Walking Library는 도서를 등록·조회·수정·삭제하고, OpenAI 이미지 API를 활용해 AI 표지를 자동 생성할 수 있는 웹 애플리케이션입니다.
| 분류 | 기술 |
|---|---|
| Frontend | React 19, React Router DOM 7, React Toastify |
| Build | Vite 8 |
| Backend | json-server 0.17 |
| AI | OpenAI Images API (gpt-image-1 등) |
| Lint | ESLint 10 |
- 도서 목록 조회 — 홈 화면에서 4열 그리드로 등록된 도서를 한눈에 확인
- 이달의 추천 도서 — 무작위로 선정된 도서를 홈 상단에 강조 표시
- 실시간 검색 — 제목·저자로 400ms 디바운싱 검색
- 도서 등록 — 제목, 저자, 줄거리 입력 및 AI 표지 또는 직접 이미지 업로드
- AI 표지 생성 — 장르·스타일을 선택하면 OpenAI API로 맞춤 표지 자동 생성
- 마이 페이지 — 내 도서 목록 관리, 수정·삭제 기능
- 토스트 알림 — 주요 액션(등록, 수정, 삭제 등)에 대한 피드백 알림
mini-project4-library/
├── db.json # json-server 데이터베이스
├── package.json
└── walking-library/ # React 앱
├── index.html
└── src/
├── main.jsx
├── App.jsx # 전역 상태 및 라우팅 관리
├── index.css
├── components/
│ ├── Header.jsx # 내비게이션 헤더 + 검색바
│ ├── BookForm.jsx # 도서 등록/수정 폼 + AI 표지 생성
│ ├── BookDetail.jsx # 도서 상세 조회 / 마이페이지 편집 뷰
│ ├── BookList.jsx # 도서 목록 (세로/가로 레이아웃)
│ ├── SearchBar.jsx # 검색 입력 컴포넌트
│ └── BookRecommend.jsx # 추천 도서 컴포넌트
└── pages/
├── MyPage.jsx # 마이 페이지
└── RegisterPage.jsx # 도서 등록 페이지
- Node.js 18+
- OpenAI API Key (AI 표지 생성 기능 사용 시)
# 의존성 설치
1. npm install로 의존성 설치
2. npm run dev로 vite 페이지 실행
3. npm install json-server@0.17.4로 json서버 의존성 설치
4. npx json-server --watch db.json으로 json 서버 실행
5. npm install react-toastify react-dropzone lucide-react motion으로 UI 라이브러리 의존성 설치
이후 터미널 2개를 열어 각각 실행합니다.
# 터미널 1 — JSON Server (포트 3000)
npx json-server --watch ../db.json
# 터미널 2 — Vite 개발 서버 (포트 5173)
npm run dev| 서비스 | 주소 |
|---|---|
| 프론트엔드 | http://localhost:5173 |
| JSON Server API | http://localhost:3000/books |
- 도서 등록 화면에서 제목·저자·줄거리를 입력합니다.
- 장르와 표지 스타일을 선택합니다.
- OpenAI API 설정에서 발급받은 API Key를 입력합니다.
- AI 표지 생성 버튼을 클릭하면 자동으로 표지 이미지가 생성됩니다.
- 마음에 들지 않으면 재생성 버튼으로 다시 생성할 수 있습니다.
API Key는 브라우저 메모리에만 저장되며 서버로 전송되지 않습니다.
| Method | URL | 설명 |
|---|---|---|
| GET | /books |
전체 도서 조회 |
| GET | /books/:id |
단일 도서 조회 |
| POST | /books |
도서 등록 |
| PUT | /books/:id |
도서 전체 수정 |
| DELETE | /books/:id |
도서 삭제 |
{
"id": "string",
"title": "string",
"author": "string",
"content": "string",
"genre": "string",
"style": "string",
"coverImageUrl": "string (base64 or URL)",
"imageModel": "string",
"imageSize": "string",
"imageQuality": "string",
"outputFormat": "string",
"createdAt": "ISO 8601",
"updatedAt": "ISO 8601"
}