체κ³μ μΈ νκ΅μ¬ νμ΅μ μν κ³μΈ΅ν λ°μ΄ν° κ΄λ¦¬ νλ«νΌ & RESTful API
β’ κΈ°λ₯ μκ° β’ λ°μ΄ν° ꡬ쑰 β’ κΈ°μ μ€ν β’ μμνκΈ° β’ API λͺ μΈ
νκ΅μ¬ μλ (KoreaHistory) λ νκ΅μ¬μ λ°©λν λ°μ΄ν°λ₯Ό 7λ¨κ³ κ³μΈ΅ ꡬ쑰(Hierarchy) λ‘ μ²΄κ³ννμ¬ κ΄λ¦¬νκ³ μ 곡νλ μΉ νλ«νΌμ λλ€.
λ¨μν ν μ€νΈ λμ΄μ΄ μλ, μλ(Chapter)λΆν° μΈλΆ λ΄μ©(Content)κΉμ§ λ Όλ¦¬μ μΌλ‘ μ°κ²°λ νμ΅ κ²½νμ μ 곡ν©λλ€. κ΄λ¦¬μλ μ μ© λμ보λλ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μκ°μ μΌλ‘ κ΄λ¦¬ν μ μμΌλ©°, νμ΅μλ μΉ νμ΄μ§λ₯Ό ν΅ν΄ ꡬ쑰νλ νκ΅μ¬ μ½ν μΈ λ₯Ό νμ΅ν μ μμ΅λλ€.
νκ΅μ¬μ νλ¦μ λκΉ μμ΄ μ°κ²°νκΈ° μν΄ μ κ΅ν 7λ¨κ³ ꡬ쑰λ₯Ό μ€κ³νμ΅λλ€.
- ꡬ쑰:
Chapter>Lesson>Section>Subsection>Topic>Keyword>Content - μμ κ°λ μμ μ νμ λ°μ΄ν°κ° ν¨κ» μ 리λλ Cascade μ μ± μ μ©
νμ΅ λ΄μ©μ λ¨μ ν μ€νΈμ κ·ΈμΉμ§ μκ³ , λ€μν ννμ λΈλ‘μΌλ‘ ꡬμ±λ©λλ€. (JSON κΈ°λ° μ μ₯)
- TEXT: μΌλ° ν μ€νΈ μ€λͺ
- TABLE: ν€-κ° ννμ μ 보 ν μ΄λΈ
- COMPARISON_TABLE: κ΅κ°/μλ κ° λΉκ΅ν
- TIMELINE: μμ¬μ μ¬κ±΄μ νλ¦ (μ°ν)
- HERITAGE: λ¬Ένμ¬ μ 보 λ° μ΄λ―Έμ§
- IMAGE_GALLERY: κ΄λ ¨ μ λ¬Ό/μ μ κ°€λ¬λ¦¬
- Admin Dashboard: λ°μ΄ν° CRUD, JSON ν νλ¦Ώ μμ±κΈ°, μ€μκ° λ―Έλ¦¬λ³΄κΈ° μ 곡
- Web Learning: λ°μν λμμΈ, νμ΅ μ§λ 체ν¬, ν€μλ κ²μ λ° νμ΄λΌμ΄ν
- ν€μλ μ‘°ν© κ²μ μ§μ (μ: "λΉμ΄λ¬΄λ¬ν κΈ° + μ μκΈ°")
- κ³μΈ΅ ꡬ쑰 μμΆμ κ²μ (Content λ΄μ©μ ν΅ν΄ μμ Chapter μ°ΎκΈ°)
μ΄ νλ‘μ νΈμ ν΅μ¬μ 7-Layer Hierarchy μ λλ€.
| μν°ν° | μ€λͺ | μμ |
|---|---|---|
| Chapter | κ°μ₯ ν° μλμ κ΅¬λΆ | μ μ¬μλ, κ³ λ, κ³ λ €... |
| Lesson | μλ λ΄μ μ£Όμ κ°μ λ¨μ | ꡬμκΈ°~μ² κΈ° μλ, μΌκ΅μ μ±λ¦½ |
| Section | κ°μλ₯Ό ꡬμ±νλ μμ£Όμ | ꡬμκΈ°μ μ μκΈ° |
| Subsection | ꡬ체μ μΈ νμ΅ ννΈ | ꡬμκΈ° μλ |
| Topic | νμ΅ν ν΅μ¬ μ£Όμ | λꡬ, μν, μ¬ν |
| Keyword | κ²μ λ° νμ΅μ ν΅μ¬ μ΄ν | [λμκΈ°, μ£Όλ¨ΉλλΌ] |
| Content | μ€μ νμ΅ λ°μ΄ν° (JSON Block) | ν μ€νΈ, μ΄λ―Έμ§, ν λ± |
- Framework: Spring Boot 3.5.6 (Java 17)
- Database: MySQL 8.x (Prod), H2 (Dev)
- ORM: Spring Data JPA
- Migration: Flyway (DB μ€ν€λ§ λ²μ κ΄λ¦¬)
- Cloud: AWS Secrets Manager (νκ²½ λ³μ 보μ κ΄λ¦¬)
- Build: Gradle 8.14.3
- Core: HTML5, CSS3, Vanilla JavaScript (ES6+)
- Styling: Custom CSS (Responsive), CSS Grid/Flexbox
- Communication: Fetch API (RESTful)
- JDK 17 μ΄μ
- MySQL 8.0 μ΄μ (Prod νλ‘ν μ¬μ© μ)
git clone https://github.com/devKobe24/KoreaHistory.git
cd KoreaHistoryλ‘컬 κ°λ° νκ²½(dev νλ‘ν)μ H2 μΈλ©λͺ¨λ¦¬ DBλ₯Ό μ¬μ©νλ―λ‘ λ³λ μ€μ μμ΄ λ°λ‘ μ€ν κ°λ₯ν©λλ€.
- Admin κ³μ μλ μμ±:
admin/admin123
# Mac/Linux
./gradlew bootRun
# Windows
gradlew.bat bootRun- νμ΅μ μΉ: http://localhost:8080
- κ΄λ¦¬μ λμ보λ: http://localhost:8080/admin/pages/login.html
- H2 μ½μ: http://localhost:8080/h2-console
μ£Όμ REST API μλν¬μΈνΈμ λλ€.
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/chapters/search/all |
μ 체 κ³μΈ΅ ꡬ쑰 μ‘°ν |
GET |
/api/v1/search/lessons?title={title} |
κ°μ μ λͺ© κ²μ |
GET |
/api/v1/search/keywords?keyword={word} |
ν€μλ κ²μ |
GET |
/api/v1/search/contents?detail={text} |
λ΄μ© λ³Έλ¬Έ κ²μ |
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/v1/create/chapter |
λλΆλ₯ μμ± (νμ κ³μΈ΅ ν¬ν¨ κ°λ₯) |
POST |
/api/v1/create/content/{keywordId} |
νΉμ ν€μλ νμμ 컨ν μΈ μμ± |
PATCH |
/api/v1/content/{id} |
컨ν μΈ μμ (JSON Block μ λ°μ΄νΈ) |
DELETE |
/api/v1/chapters/{id} |
μ±ν° λ° νμ λ°μ΄ν° μ 체 μμ |
src/main/java/com/kobe/koreahistory
βββ config # Flyway, WebMvc(CORS) μ€μ
βββ controller # REST API λ° View Controller
βββ domain/entity # JPA Entity (7-Layer + Admin)
βββ dto # Request/Response DTO
βββ repository # Spring Data JPA Repositories
βββ service # λΉμ¦λμ€ λ‘μ§ (Transaction κ΄λ¦¬)
βββ util # ContentBlockUtil (JSON μ²λ¦¬), JwtUtil
src/main/resources
βββ application.yml # κ³΅ν΅ μ€μ
βββ application-dev.yml # κ°λ° νλ‘ν (H2)
βββ db/migration/mysql # Flyway SQL μ€ν¬λ¦½νΈ
βββ static # μ μ 리μμ€
βββ admin # κ΄λ¦¬μ νμ΄μ§ (HTML/CSS/JS)
βββ web # μ¬μ©μ νμ΄μ§ (HTML/CSS/JS)
μ΄ νλ‘μ νΈλ MIT Licenseλ₯Ό λ°λ¦ λλ€.
Copyright (c) 2025 Minseong Kang
