๐ ์ฑํฐ๋ถ (Chatterbook)
์นด์นด์คํก ๋ํ๋ฅผ ์
๋ก๋ํ๋ฉด ์ค๋ฌผ ํฌํ ๋ถ์ผ๋ก ์ ์ยท๋ฐฐ์กํด์ฃผ๋ ์น ์๋น์ค
์ฑํฐ๋ถ ์ ์นด์นด์คํก ๋ํ ๋ด๋ณด๋ด๊ธฐ ํ์ผ(.txt)์ ์
๋ก๋ํ๋ฉด, ๋ํ ๋ด์ฉ์ ์๋ ํ์ฑํ์ฌ Book Print API๋ฅผ ํตํด ์ค๋ฌผ ์ฑ
์ผ๋ก ์ ์ยท์ฃผ๋ฌธํ ์ ์๋ ์๋น์ค์
๋๋ค.
โถ YouTube์์ ๋ณด๊ธฐ
์ฐ์ธยท์น๊ตฌยท๊ฐ์กฑ ๊ฐ์ ์์คํ ๋ํ๋ฅผ ๋ฌผ๋ฆฌ์ ๊ธฐ๋
ํ์ผ๋ก ๊ฐ์งํ๊ณ ์ถ์ 20~30๋ MZ์ธ๋
์กธ์
, ๊ธฐ๋
์ผ, ์์ผ ๋ฑ ํน๋ณํ ๋ ์ ๊ฐ์ฑ์ ์ธ ์ ๋ฌผ ์ ์ฐพ๋ ์ฌ๋
๊ธฐ๋ฅ
์ค๋ช
๋ํ ์
๋ก๋
์นด์นด์คํก ๋ด๋ณด๋ด๊ธฐ .txt ํ์ผ์ ๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก ์
๋ก๋
๋ํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
ํ์ฑ๋ ๋ํ๋ฅผ ์ฑํ
๋ฒ๋ธ ํํ๋ก ์ค์๊ฐ ํ๋ฆฌ๋ทฐ
์๋ ์ฑ
์์ฑ
Book Print API๋ฅผ ํ์ฉํ ์๋ ํฌํ ๋ถ ์์ฑ (ํ์ง + ๋ด์ง)
ํ์ด์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ
์์ฑ๋ ์ฑ
์ ๊ฐ ํ์ด์ง๋ฅผ ์ธ๋ค์ผ๋ก ๋ฏธ๋ฆฌ ํ์ธ
์ฃผ๋ฌธยท๋ฐฐ์ก
๊ฒฌ์ ํ์ธ โ ๋ฐฐ์ก ์ ๋ณด ์
๋ ฅ โ ์ถฉ์ ๊ธ ๊ฒฐ์ โ ์ค๋ฌผ ๋ฐฐ์ก
๋ด ์ฑ
๊ด๋ฆฌ
์์ฑํ ์ฑ
๋ชฉ๋ก ์กฐํ, ์ํ ํ์ธ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์ญ์
์ฃผ๋ฌธ ๋ด์ญ
์ฃผ๋ฌธ ์กฐํ, ๋ฐฐ์ก ์ํ ํ์ธ, ์ฃผ๋ฌธ ์ทจ์
# 1. ์ ์ฅ์ ํด๋ก
git clone https://github.com/passtal/SWEETBOOK.git
cd SWEETBOOK
# 2. ํ๊ฒฝ๋ณ์ ์ค์ (ํ๋ก์ ํธ ๋ฃจํธ)
cp .env.example .env
# .env ํ์ผ์ ์ด์ด BOOKPRINT_API_KEY์ ๋ฐ๊ธ๋ฐ์ Sandbox API Key ์
๋ ฅ
# 3. ๋ฐฑ์๋ ์คํ
cd backend
./gradlew bootRun
# โ http://localhost:8080 ์์ ์คํ
# 4. ํ๋ก ํธ์๋ ์คํ (์ ํฐ๋ฏธ๋, ํ๋ก์ ํธ ๋ฃจํธ์์)
cd ../frontend
npm install
npm run dev
# โ http://localhost:5173 ์์ ์คํ
๋ธ๋ผ์ฐ์ ์์ http://localhost:5173 ์ ์
๋ง๋ค๊ธฐ ํด๋ฆญ โ data/dummy/kakao_sample.txt ํ์ผ ์
๋ก๋
๋ํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ์ธ ํ ๋ค์
์ฑ
์ ๋ชฉยทํํยทํ
ํ๋ฆฟ ์ ํ ํ ์ฑ
์์ฑ
์๋ฃ ํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ก ํ์ด์ง๋ณ ์ธ๋ค์ผ ํ์ธ
์ฃผ๋ฌธ ํ์ด์ง์์ ๋ฐฐ์ก ์ ๋ณด ์
๋ ฅ ๋ฐ ์ฃผ๋ฌธ
๋ฉ์๋
์๋ํฌ์ธํธ
์ฉ๋
GET
/book-specs
ํํ(์ฑ
๊ท๊ฒฉ) ๋ชฉ๋ก ์กฐํ
GET
/book-specs/{uid}
ํํ ์์ธ ์กฐํ (pageMin/pageMax/pageIncrement)
GET
/templates
ํ
ํ๋ฆฟ ๋ชฉ๋ก ์กฐํ (ํ์ง/๋ด์ง ํํฐ)
GET
/templates/{uid}
ํ
ํ๋ฆฟ ์์ธ ์กฐํ (ํ๋ผ๋ฏธํฐ ์ ์)
POST
/books
์ ์ฑ
์์ฑ (draft)
GET
/books
์ฑ
๋ชฉ๋ก ์กฐํ / ๋จ๊ฑด ์กฐํ (?bookUid=)
DELETE
/books/{bookUid}
์ฑ
์ญ์
POST
/books/{bookUid}/cover
ํ์ง ์์ฑ (ํ
ํ๋ฆฟ + ํ๋ผ๋ฏธํฐ + ์ด๋ฏธ์ง)
POST
/books/{bookUid}/contents
๋ด์ง ์ถ๊ฐ (๋ํ ํ
์คํธ + ์ด๋ฏธ์ง)
DELETE
/books/{bookUid}/contents
๋ด์ง ์ด๊ธฐํ
POST
/books/{bookUid}/finalize
์ฑ
์ต์ข
ํ
POST
/render/page-thumbnail
ํ์ด์ง ์ธ๋ค์ผ ๋ ๋๋ง ์์ฒญ
GET
/render/thumbnail/{bookUid}/{fileName}
๋ ๋๋ง๋ ์ธ๋ค์ผ ์ด๋ฏธ์ง ์กฐํ
POST
/orders/estimate
์ฃผ๋ฌธ ๊ฒฌ์ ์กฐํ
POST
/orders
์ฃผ๋ฌธ ์์ฑ (์ถฉ์ ๊ธ ๊ฒฐ์ )
GET
/orders
์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ
GET
/orders/{orderUid}
์ฃผ๋ฌธ ์์ธ ์กฐํ
POST
/orders/{orderUid}/cancel
์ฃผ๋ฌธ ์ทจ์
GET
/credits
์ถฉ์ ๊ธ ์์ก ์กฐํ
4. AI ๋๊ตฌ ์ฌ์ฉ ๋ด์ญ
AI ๋๊ตฌ
ํ์ฉ ๋ด์ฉ
GitHub Copilot (Claude Opus 4.6)
React + Spring Boot ํ๋ก์ ํธ ๊ตฌ์กฐ ์ค๊ณ, ๊ธฐ๋ฅ ๊ตฌํ, ์๋ฌ ์์
GitHub Copilot (Claude Sonnet 4.6)
๋ฐํ์ ์๋ฌ ์์ธ ๋ถ์ ๋ฐ ์์
Google Gemini (Gemini 3.1)
์นด์นด์คํก ๋๋ฏธ ๋ฐ์ดํฐ ์์ฑ (kakao_sample.txt)
Claude Code (Claude Opus 4.6)
UX/UI ๊ฐ์ โ TossยทSendy ์คํ์ผ ๋์์ธ ์ฐธ๊ณ ๋ฐ CSS ์์ฑ ๋ณด์กฐ
์ "๋ํ๋ฅผ ์ฑ
์ผ๋ก"์ธ๊ฐ?
๊ธฐ์กด ํฌํ ๋ถ ์๋น์ค๋ ์ฌ์ง ์ค์ฌ ์
๋๋ค. ํ์ง๋ง ์นด์นด์คํก ๋ํ์๋ ์ฌ์ง์ผ๋ก ๋ด์ ์ ์๋ ๊ฐ์ , ์ ๋จธ, ๋งฅ๋ฝ ์ด ๊ณ ์ค๋ํ ๋จ์์์ต๋๋ค. ์ฑํฐ๋ถ์ ์ด ํ
์คํธ ๊ธฐ๋ฐ ์ฝํ
์ธ ๋ฅผ ๋ฌผ๋ฆฌ์ ์ฑ
์ผ๋ก ๋ณํํ์ฌ, ๊ธฐ์กด ํฌํ ๋ถ๊ณผ๋ ์ฐจ๋ณํ๋ ๊ฐ์ฑ ๊ธฐ๋
ํ ์์ฅ์ ๊ณต๋ตํฉ๋๋ค.
์์ฅ : ์กธ์
์์ฆ, ๋ฐธ๋ฐํ์ธ๋ฐ์ด, ํฌ๋ฆฌ์ค๋ง์ค ๋ฑ ์ฐ๊ฐ ๋ฐ๋ณต๋๋ ์ ๋ฌผ ์์ ์ ๋ง๋ฌผ๋ฆผ
์ง์
์ฅ๋ฒฝ์ด ๋ฎ์ UX : ์นด์นด์คํก ๋ํ ๋ด๋ณด๋ด๊ธฐ โ ํ์ผ ์
๋ก๋ โ ์ฃผ๋ฌธ, ๋จ 3๋จ๊ณ๋ก ์๋ฃ
ํ์ฅ ๊ฐ๋ฅ : ์นด์นด์คํก ์ธ ์ธ์คํ DM, ๋์ค์ฝ๋, ๋ผ์ธ ๋ฑ ๋ค์ํ ๋ฉ์ ์ ๋ก ํ์ ํ์ฅ ๊ฐ๋ฅ
์์ต ๋ชจ๋ธ : Book Print API ์ ์ ๋จ๊ฐ์ ํ๋งค๊ฐ์ ๋ง์ง + ํ๋ฆฌ๋ฏธ์ ํ
ํ๋ฆฟ ์ต์
6. ๊ฐ๋ฐ ๊ณผ์ ์์์ ๊ฐ์ ์ฌํญ
๊ฐ๋ฐ ๊ณผ์ ์์ ์ด 18๊ฑด์ ์๋ฌ ์์ , 9๊ฑด์ UX ๊ฐ์ , 2๊ฑด์ ๋ฐ์ดํฐ ๊ฐ์ ์ ์งํํ์ต๋๋ค.
์์ธ ๋ด์ฉ์ developments.md ์ ๊ธฐ๋ก๋์ด ์์ต๋๋ค.
์ฃผ์ ์๋ฌ ์์ ์ฌ๋ก
#
์๋ฌ
์์ธ ์์ฝ
ํด๊ฒฐ
2
SSL PKIX ์ธ์ฆ์ ์ค๋ฅ
WebClient๊ฐ Sandbox SSL ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ์ง ๋ชปํจ
InsecureTrustManagerFactory ์ ์ฉ
5
ํ
ํ๋ฆฟ ํ๋ผ๋ฏธํฐ ๋ณ์๋ช
๋ถ์ผ์น
ํ๋์ฝ๋ฉ๋ ํ๋ผ๋ฏธํฐ๋ช
์ด ์ค์ API ์คํ๊ณผ ๋ค๋ฆ
ํ
ํ๋ฆฟ ์์ธ ์กฐํ ํ ๋์ ๋งคํ
10
์ฑ
๋จ๊ฑด ์กฐํ 405
GET /books/{uid} ๋ฏธ์ง์
๋ชฉ๋ก ์กฐํ ํ ํํฐ๋ง โ ์ดํ ๋จ๊ฑด ์กฐํ API ์ถ๊ฐ
16
๋ด์ง ๋น ํ์ด์ง
์๋ฆผ์ฅB์ ๋ณธ๋ฌธ ํ
์คํธ ํ๋ ์์
์ผ๊ธฐ์ฅB(diaryText ๋ณด์ ) ์๋ ์ ํ
#
๊ฐ์
์ค๋ช
1
์ฐํธ๋ฒํธ ๊ฒ์
Daum ์ฐํธ๋ฒํธ ์๋น์ค ์ฐ๋, ์ฃผ์ ์๋์
๋ ฅ
7
Toss/Sendy ์คํ์ผ ๋์์ธ
Pretendard ํฐํธ, ๊ธ๋์ค๋ชจํผ์ฆ ๋ค๋น, ๋ผ์ด๋ ์ปดํฌ๋ํธ
8
ํํ์ด์ง ์ ๋๋ฉ์ด์
ํ
์คํธ ๋กํ
์ด์
, ์ฌ๋ผ์ด๋ ๋ฐฐ๋, ์คํฌ๋กค ํ์ด๋์ธ, ์นด์ดํฐ
9
ํ์ด์ง ์ธ๋ค์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
๋ ๋๋ง API ์ฐ๋, ์ข์ฐ ํ์ดํ ๋ค๋น๊ฒ์ด์
, ์ธ๋ค์ผ ๊ทธ๋ฆฌ๋
7. ๋ ์๊ฐ์ด ์์๋ค๋ฉด
๋ํ ํ
์คํธ ์คํ์ผ๋ง
ํ์ฌ ๋ํ ๋ด์ฉ์ด ํ์ด์ง์ ๋จ์ ํ
์คํธ ๊ทธ๋๋ก ํ์๋ฉ๋๋ค. ๋ฐ์ ์ ์ด๋ฆ, ๋ฉ์์ง ๋ณธ๋ฌธ, ์๊ฐ์ด ๊ตฌ๋ถ ์์ด ์ผ๋ ฌ๋ก ๋์ด๋์ด ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ณ , ํฌํ ๋ถ์ผ๋ก์์ ๊ฐ์ฑ์ ์์ฑ๋๊ฐ ๋ถ์กฑํฉ๋๋ค.
์๊ฐ์ด ๋ ์์๋ค๋ฉด:
๋ฐ์ ์๋ณ ์ปฌ๋ฌ ๊ตฌ๋ถ โ ์ฐธ์ฌ์๋ง๋ค ๊ณ ์ ์์ ๋ถ์ฌ, ์ฑํ
์ฑ์ฒ๋ผ ์๊ฐ์ ๊ตฌ๋ถ
๋ฉ์์ง ๋ฒ๋ธ ๋ ์ด์์ โ ์ข/์ฐ ๋งํ์ ํํ๋ก ๋ํ ํ๋ฆ ์ฌํ
์ปค์คํ
ํฐํธ ์ ์ฉ โ ์๊ธ์จ ํฐํธ, ์ธ๋ฆฌํ/์ฐ์ธ๋ฆฌํ ์ ํ ์ต์
๋ ์ง ๊ตฌ๋ถ์ โ ๋ ์ง๊ฐ ๋ฐ๋ ๋ ์๊ฐ์ ๊ตฌ๋ถ์ ์ฝ์
์ด๋ชจ์ง/์ด๋ชจํฐ์ฝ ๋ ๋๋ง โ ํ
์คํธ ์ด๋ชจ์ง๋ฅผ ๊ทธ๋ํฝ์ผ๋ก ๋ณํํ์ฌ ์๊ฐ์ ํ์ฑํจ ์ถ๊ฐ
์ฌ์ง ๋ฉ์์ง ์ธ๋ผ์ธ ํ์ โ "์ฌ์ง" ํ
์คํธ ๋์ ์ค์ ์ด๋ฏธ์ง ์ฝ์
(์นด์นด์คํก ๋ฏธ๋์ด ํ์ผ ์ฐ๋)
๋ฉํฐ ๋ฉ์ ์ ์ง์ โ ์ธ์คํ DM, ๋ผ์ธ, ๋์ค์ฝ๋ ๋ํ ํ์ ์ถ๊ฐ
์ปค์คํ
ํ
ํ๋ฆฟ ๋น๋ โ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ด์ง ๋ ์ด์์ยท์์ยทํฐํธ๋ฅผ ์กฐํฉํ๋ ์๋ํฐ
๋ํ ํต๊ณ ๋์๋ณด๋ โ ๋ํ ์ฐธ์ฌ์๋ณ ๋ฉ์์ง ์, ์์ฃผ ์ด ๋จ์ด, ํ๋ ์๊ฐ๋ ๋ถ์ ํ์ด์ง
๋ง์กฑ๋ ํ๊ฐ ์์คํ
โ ์ฃผ๋ฌธ ์๋ฃ ํ ์ฌ์ฉ์ ๋ฆฌ๋ทฐยท๋ณ์ ์์ง (DB ๋์
ํ์)
์ฌ์ฉ์ ์ธ์ฆ โ ๋ก๊ทธ์ธ/ํ์๊ฐ์
์ผ๋ก ๊ฐ์ธ๋ณ ์ฑ
ยท์ฃผ๋ฌธ ๊ด๋ฆฌ
์์
๊ณต์ โ ์์ฑ๋ ์ฑ
๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋งํฌ๋ฅผ ์นด์นด์คํก/์ธ์คํ ์คํ ๋ฆฌ๋ก ๊ณต์
์์ญ
๊ธฐ์
Frontend
React 19 (Vite 8 + TypeScript), MUI v7, React Router v7, Axios
Backend
Spring Boot 3.4.4 (Java 23), WebClient (WebFlux), Gradle 8.12
API
SweetBook Book Print API (Sandbox)
๋์์ธ
Pretendard Variable ํฐํธ, Toss/Sendy ์คํ์ผ UI(๋ ํผ๋ฐ์ค)
SWEETBOOK/
โโโ frontend/ # React (Vite + TypeScript)
โ โโโ src/
โ โ โโโ components/ # UploadStep, PreviewStep, SettingsStep, CompleteStep, Layout
โ โ โโโ pages/ # HomePage, CreatePage, BooksPage, BookPreviewPage,
โ โ โ # OrderPage, OrdersPage
โ โ โโโ services/ # API ํด๋ผ์ด์ธํธ (api.ts)
โ โโโ package.json
โโโ backend/ # Spring Boot (Java)
โ โโโ src/main/java/.../chatterbook/
โ โ โโโ config/ # WebClient (SSL), CORS, GlobalExceptionHandler
โ โ โโโ controller/ # BookController, BookSpecController, ChatParserController,
โ โ โ # CreditController, OrderController, RenderController,
โ โ โ # TemplateController
โ โ โโโ service/ # BookPrintApiService (์ธ๋ถ API ์ฐ๋)
โ โ โโโ parser/ # ์นด์นด์คํก ๋ํ ํ์
โ โ โโโ dto/ # ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด
โ โโโ build.gradle
โโโ data/dummy/ # ๋๋ฏธ ๋ฐ์ดํฐ (์นด์นด์คํก ์ํ ๋ํ 303๊ฑด)
โโโ developments.md # ๊ฐ๋ฐ ๊ฐ์ ์ฌํญ ์์ธ ๊ธฐ๋ก (์๋ฌ 18๊ฑด, UX 9๊ฑด, ๋ฐ์ดํฐ 2๊ฑด)
โโโ .env # ํ๊ฒฝ๋ณ์ (API Key โ Git ๋ฏธํฌํจ)
โโโ README.md
[์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ]
โ
โโโ React SPA (Vite + TypeScript)
โ โโโ Axios โ /api/* (Vite ํ๋ก์ โ localhost:8080)
โ
[Spring Boot ์๋ฒ :8080]
โ
โโโ ChatParserController โ ์นด์นด์คํก ๋ํ ํ์ฑ
โโโ BookController โ ์ฑ
์์ฑยทํ์งยท๋ด์งยท์ต์ข
ํ
โโโ RenderController โ ํ์ด์ง ์ธ๋ค์ผ ๋ ๋๋งยท์กฐํ
โโโ OrderController โ ๊ฒฌ์ ยท์ฃผ๋ฌธยท์ทจ์
โโโ CreditController โ ์ถฉ์ ๊ธ ์กฐํ
โโโ BookSpecController โ ํํ ์กฐํ
โโโ TemplateController โ ํ
ํ๋ฆฟ ์กฐํ
โ
โโโ BookPrintApiService โ WebClient (SSL)
โ
[Book Print API (Sandbox)]
API Key๋ ๋ฃจํธ .env ํ์ผ์์ ๊ด๋ฆฌํ๋ฉฐ .gitignore์ ๋ฑ๋ก๋์ด Git์ ํฌํจ๋์ง ์์
spring-dotenv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐฑ์๋์์ ๋ก๋
ํ๋ก ํธ์๋๋ ๋ฐฑ์๋ ํ๋ก์(/api/*)๋ฅผ ํตํด์๋ง ์ธ๋ถ API์ ์ ๊ทผ
ํด๋ผ์ด์ธํธ ์ธก์ API Key๊ฐ ์ ๋ ๋
ธ์ถ๋์ง ์์