1. νλ‘μ νΈ μκ°
μ΄ νλ‘μ νΈλ Spring Bootμ Reactλ‘ κ΅¬νν νμ€ν λ μ μ΅κ΄ κ΄λ¦¬ μλΉμ€μ λλ€. λ μ κΈ°λ‘κ³Ό λͺ©ν μ€μ , μ°¨νΈ κΈ°λ° μ§νλ₯ μκ°νλ₯Ό ν΅ν΄ μ¬μ©μκ° λ μ μ±κ³Όλ₯Ό κ°κ΄μ μΌλ‘ μΆμ νλλ‘ μ€κ³νμ΅λλ€. λ μ λ΄μ©μ 체κ³μ μΌλ‘ κΈ°λ‘ν΄ κΈ°μ΅μ κ°ννκ³ μ΅κ΄νλ₯Ό λλ μλΉμ€κ° νμνλ€κ³ νλ¨ν΄ μ£Όμ λ‘ μ μ νμ΅λλ€.

2. κΈ°μ μ€ν
Backend(Spring Boot)
| κ΅¬λΆ | κΈ°μ | λ²μ | μ©λ |
| νλ μμν¬ | Spring Boot | 3.3.0 | λ©μΈ λ°±μλ νλ μμν¬ |
| μΈμ΄ | Java | 17 | μλ² μ¬μ΄λ λ‘μ§ |
| ORM | Spring Data JPA (Hibernate) | - | λ°μ΄ν°λ² μ΄μ€ μ°λ |
| 보μ | Spring Security | - | μΈμ¦/μΈκ°, μΈμ κ΄λ¦¬ |
| ν νλ¦Ώ | Thymeleaf | - | μλ² μ¬μ΄λ λ λλ§ (SPA ν΄λ°±) |
| μνΈν | BCryptPasswordEncoder | - | λΉλ°λ²νΈ ν΄μ± |
| λΉλ λꡬ | Gradle | 8.12.1 | λΉλ λ° μμ‘΄μ± κ΄λ¦¬ |
| λͺ¨λν°λ§ | Spring Actuator | - | ν¬μ€μ²΄ν¬ (/actuator/health) |
Frontend(React)
| κ΅¬λΆ | κΈ°μ | λ²μ | μ©λ |
| νλ μμν¬ | React | 18.2.0 | UI λΌμ΄λΈλ¬λ¦¬ |
| μΈμ΄ | TypeScript | 4.9.5 | νμ μμ μ± |
| λΌμ°ν | React Router DOM | 7.2.0 | SPA λΌμ°ν |
| HTTP ν΄λΌμ΄μΈνΈ | Axios | 1.3.4 | API ν΅μ |
| μ°¨νΈ | Chart.js + react-chartjs-2 | 4.4.8 / 5.3.0 | λ°μ΄ν° μκ°ν |
| μ°¨νΈ νλ¬κ·ΈμΈ | chartjs-plugin-zoom | 2.2.0 | μ°¨νΈ μ€/ν¬ κΈ°λ₯ |
| CSS νλ μμν¬ | Tailwind CSS | 3.4.4 | μ νΈλ¦¬ν° κΈ°λ° μ€νμΌλ§ |
| λΉλ λꡬ | Create React App | 5.0.1 | React νλ‘μ νΈ μ€μ |
| ν°νΈ | Pretendard | - | νκΈ μΉν°νΈ |
Database
| νκ²½ | κΈ°μ | μ©λ |
| κ°λ° | H2 Database | νμΌ κΈ°λ° (./data/booktine) |
| μ΄μ | MySQL8 | Render λ°°ν¬ μ μ¬μ© |
DevOps & λ°°ν¬
| κ΅¬λΆ | κΈ°μ | μ©λ |
| 컨ν μ΄λν | Docker | λ©ν°μ€ν μ΄μ§ λΉλ |
| λ² μ΄μ€ μ΄λ―Έμ§ | gradle:8.7-jdk17 (λΉλ) / eclipse-temurin:17-jre (λ°νμ) | |
| λ°°ν¬ νλ«νΌ | Render (Free Tier) | λ°±μλ + μ μ νμΌ νΈμ€ν |
| λ²μ κ΄λ¦¬ | Git + GitHub | μμ€ μ½λ κ΄λ¦¬ |
3. μν€ν μ² κ΅¬μ‘°
3.1 μ 체 μν€ν μ²
μν€ν μ²λ₯Ό ν μ€λ‘ μμ½νλ©΄, λΈλΌμ°μ μμ λμκ°λ React SPAκ° HTTP(REST API)λ‘ Spring Boot λ°±μλμ μμ²νκ³ , λ°±μλλ 보μ(μΈμ ) → 컨νΈλ‘€λ¬ → μλΉμ€ → 리ν¬μ§ν 리(JPA) μμΌλ‘ μ²λ¦¬ν λ€ DB(H2/MySQL)μ μ°λν΄ κ²°κ³Όλ₯Ό λ€μ λ΄λ €μ£Όλ ꡬ쑰μ λλ€.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client (Browser) β
β React SPA (TypeScript) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ HTTP (REST API)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Spring Boot Server β
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
β β Controller β→ β Service β→ β Repository β β
β β Layer β β Layer β β (Spring Data JPA) β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Spring Security (Session) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Database (H2 / MySQL) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Client(Browser) – React SPA(TypeScript)
- μ¬μ©μκ° νλ©΄μμ νλνλ©΄(μ‘°ν/λ±λ‘/μμ λ±) SPAκ° API μμ²μ 보λ΄κ³ , μλ΅ λ°μ΄ν°λ₯Ό λ°μ νλ©΄μ λ€μ 그립λλ€. SPAλ κΈ°λ³Έμ μΌλ‘ λΈλΌμ°μ μμ JSλ‘ νλ©΄μ κ°±μ νλ λ°©μ(CSR)κ³Ό μ λ§μ΅λλ€.
- HTTP(REST API)
- νλ‘ νΈμ λ°±μλλ HTTPλ‘ ν΅μ νκ³ , REST μ€νμΌλ‘ "리μμ€μ λν μμ²/μλ΅" ννλ‘ APIλ₯Ό μ€κ³ν©λλ€ (μ€λ¬΄μμλ HTTP APIλ₯Ό νν REST APIλΌκ³ λΆλ¦ λλ€).
- Spring Boot Server λ΄λΆ: Security → Controller → Service → Repository
- Spring Security (Session)
- μμ²μ΄ 컨νΈλ‘€λ¬λ‘ λ€μ΄μ€κΈ° μ μ, Spring Securityκ° λ¨Όμ κ°μ ν΄μ μΈμ¦/μΈκ°λ₯Ό μ²λ¦¬ν©λλ€. μΈμ λ°©μμ΄λ©΄, λ‘κ·ΈμΈ ν μμ±λ μΈμ κ³Ό ν΄λΌμ΄μΈνΈ μΏ ν€(μΈμ μλ³μ)λ₯Ό κΈ°μ€μΌλ‘ “λꡬμ μμ²μΈμ§”λ₯Ό νμΈνκ³ μ κ·Ό κΆνμ μ μ©ν©λλ€.
- Controller Layer
- 컨νΈλ‘€λ¬λ “μ΄λ€ URL/HTTP λ©μλ μμ²μ μ΄λ€ λ©μλκ° μ²λ¦¬ν μ§”λ₯Ό λ§€ννκ³ , μμ²/μλ΅μ μ ꡬ μν μ ν©λλ€. (μ: @RequestMapping, @GetMapping λ±)
- Service Layer
- μλΉμ€λ λΉμ¦λμ€ λ‘μ§μ λͺ¨μμ μ²λ¦¬νλ κ³μΈ΅μ λλ€. λ³΄ν΅ “κ·μΉ μ μ©, κ²μ¦, νΈλμμ λ¨μμ μμ μ‘°ν©”μ΄ μ¬κΈ°μ μ΄λ£¨μ΄μ§κ³ , 컨νΈλ‘€λ¬λ μλΉμ€ νΈμΆμ μ§μ€ν΄μ μκ² μ μ§ν©λλ€.
- Repository (Spring Data JPA)
- 리ν¬μ§ν 리λ DB μ κ·Όμ λ΄λΉν©λλ€. Spring Data JPAμ Repository μΆμνλ λ°λ³΅μ μΈ λ°μ΄ν° μ κ·Ό 보μΌλ¬νλ μ΄νΈλ₯Ό μ€μ¬ CRUD μ€μ¬ μμ μ κ°λ¨νκ² λ§λ€κ³ , μ€μ SQL μ€νμ JPA ꡬν체(μ: Hibernate)κ° μνν©λλ€.
- Spring Security (Session)
- Database (H2 / MySQL)
- κ°λ° νκ²½μμλ H2, μ΄μμμλ MySQLμ²λΌ νκ²½μ λ°λΌ DBλ₯Ό λ¬λ¦¬ λκ³ , JPAλ₯Ό ν΅ν΄ κ°μ λλ©μΈ λͺ¨λΈ/리ν¬μ§ν 리 κ΅¬μ‘°λ‘ μ κ·Όνλ ννκ° νν©λλ€. (κ·Έλ§νΌ κ³μΈ΅ λΆλ¦¬κ° DB κ΅μ²΄μλ μ 리ν©λλ€.)
μ΄ κ΅¬μ‘°μ μλ
- κ΄μ¬μ¬ λΆλ¦¬: 보μ, μμ² μ²λ¦¬, λΉμ¦λμ€ λ‘μ§, DB μ κ·Όμ λΆλ¦¬ν΄μ λ³κ²½ μν₯ λ²μλ₯Ό μ€μ λλ€.
- μ μ§λ³΄μ/ν μ€νΈ μ©μ΄: 컨νΈλ‘€λ¬λ μ μΆλ ₯, μλΉμ€λ κ·μΉ, 리ν¬μ§ν 리λ λ°μ΄ν° μ κ·ΌμΌλ‘ μν μ΄ λͺ νν΄μ§λλ€.
- 보μμ κ³΅ν΅ κ΄λ¬Έ: λͺ¨λ μμ²μ΄ 컨νΈλ‘€λ¬ μ μ 보μ κ²μ¦μ κ±°μΉλλ‘ κ°μ ν μ μμ΅λλ€.
2.2 νλ‘μ νΈ λλ ν 리 ꡬ쑰
Booktine/
βββ frontend/ # React νλ‘ νΈμλ
β βββ src/
β βββ components/ # μ¬μ¬μ© κ°λ₯ν UI μ»΄ν¬λνΈ
β β βββ AuthModal.tsx # λ‘κ·ΈμΈ/νμκ°μ
λͺ¨λ¬
β β βββ Header.tsx # μλ¨ λ€λΉκ²μ΄μ
β β βββ Footer.tsx # νλ¨ νΈν°
β β βββ MonthlyBarChart.tsx # μλ³ λ
μλ λ§λ μ°¨νΈ
β β βββ AnnualLineChart.tsx # μ°κ° λ
μλ λΌμΈ μ°¨νΈ
β β βββ GenreDoughnutChart.tsx # μ₯λ₯΄λ³ λλ μ°¨νΈ
β β βββ HomeGenreDoughnutChart.tsx
β βββ pages/ # νμ΄μ§ μ»΄ν¬λνΈ
β β βββ MainPage.tsx # λλ© νμ΄μ§
β β βββ HomePage.tsx # λμ보λ ν
β β βββ BookNote.tsx # λ
μ λ
ΈνΈ λͺ©λ‘
β β βββ CreatePostPage.tsx # λ
ΈνΈ μμ±/μμ
β β βββ PostDetailPage.tsx # λ
ΈνΈ μμΈ λ³΄κΈ°
β β βββ ProgressPage.tsx # ν΅κ³/μ§ν μν©
β β βββ SettingsPage.tsx # μ€μ /νλ‘ν
β βββ services/
β β βββ AuthService.ts # μΈμ¦ API νΈμΆ
β βββ lib/
β β βββ api.ts # Axios μΈμ€ν΄μ€
β βββ styles/
β βββ main.css # μ μ μ€νμΌ
β
βββ src/main/java/booktine/Booktine/ # Spring Boot λ°±μλ
βββ config/
β βββ SecurityConfig.java # Spring Security μ€μ
βββ controller/
β βββ AuthController.java # μΈμ¦ API
β βββ PostController.java # κ²μκΈ CRUD API
β βββ ProgressController.java # ν΅κ³ API
β βββ RecommendationController.java # λμ μΆμ² API
β βββ SettingsController.java # μ€μ API
β βββ UploadController.java # νμΌ μ
λ‘λ API
βββ controller/dto/
β βββ ProgressResponse.java
β βββ MonthlyData.java
β βββ GenreData.java
β βββ RecommendedBook.java
βββ model/ # JPA μν°ν°
β βββ User.java # μ¬μ©μ
β βββ Post.java # λ
μ λ
ΈνΈ
β βββ Memo.java # λ©λͺ¨ (Embeddable)
β βββ Author.java # μμ±μ μ 보 (Embeddable)
βββ repository/
β βββ UserRepository.java
β βββ PostRepository.java
βββ service/
βββ UserService.java # μ¬μ©μ λΉμ¦λμ€ λ‘μ§
βββ PostService.java # κ²μκΈ λΉμ¦λμ€ λ‘μ§
βββ ProgressService.java # ν΅κ³ κ³μ° λ‘μ§
βββ RecommendationService.java # μλΌλ API μ°λ'π» PROJECT > [Spring Boot, React] λ μ μ΅κ΄ κ΄λ¦¬ μλΉμ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [νλ‘μ νΈ] 리λ§μΈλ μλ¦Ό ꡬν λ°©μ μ ν κ³Όμ (0) | 2026.05.01 |
|---|---|
| [νλ‘μ νΈ] νμ΄μ§λ€μ΄μ λ°©μ μ ν κ³Όμ (0) | 2026.05.01 |
| [νλ‘μ νΈ] κ³΅ν΅ μλ΅ ν¬λ§· μ€κ³ (0) | 2026.04.30 |
| [νλ‘μ νΈ] μ΄λ―Έμ§ μ λ‘λ μ μ± κ²°μ κ³Όμ (0) | 2026.04.30 |
| [νΈλ¬λΈμν ] Spring Bootμμ λμ 쿼리 κ°μ νκΈ°: @Queryμμ QueryDSLλ‘ (0) | 2026.04.29 |