Skip to content
152 changes: 84 additions & 68 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,99 +1,115 @@
# โœจProject Conventionโœจ
---
# ๐Ÿฑ ์ž”๋ฐ˜ํ”Œ๋ŸฌํŒ… Backend

<br>

## โœ‰๏ธ Commit Convention
์ง€์—ญ ๋ฐ˜์ฐฌ ๋งค๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ **์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ๋ฐ˜์ฐฌ ์ถ”์ฒœ๊ณผ ๊ฒฝ๋กœ ์ตœ์ ํ™”**๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
Spring Boot๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ, **FastAPI ๊ธฐ๋ฐ˜ AI ์ถ”์ฒœ ์„œ๋ฒ„**์™€ ์—ฐ๋™๋˜์–ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” **Udacity ์Šคํƒ€์ผ**์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑ
---

```
type: Subject (์ œ๋ชฉ)
## ๐Ÿš€ Tech Stack
<img width="1045" height="844" alt="struct-be" src="https://github.com/user-attachments/assets/a10dd991-3e69-46dc-8eb0-152d27e3c1e4" />

body (๋ณธ๋ฌธ) (๊ธด ์„ค๋ช…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ž‘์„ฑ)

footer (๊ผฌ๋ฆฌ๋ง) (issue tracker ID๋ฅผ ๋ช…์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์ž‘์„ฑ)
```
<br>
### ๐Ÿ”น Backend
- **Java 21**
- **Spring Boot 3.5.3**
- **MySQL** : ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
- **Swagger (springdoc-openapi)** : API ๋ฌธ์„œํ™”

<img src="https://img.shields.io/badge/Java%2021-007396?style=flat-square&logo=java&logoColor=white" /> <img src="https://img.shields.io/badge/Spring%20Boot%203.5.3-6DB33F?style=flat-square&logo=springboot&logoColor=white" /> <img src="https://img.shields.io/badge/MySQL-4479A1?style=flat-square&logo=mysql&logoColor=white" /> <img src="https://img.shields.io/badge/Swagger-85EA2D?style=flat-square&logo=swagger&logoColor=black" />

### ๐Ÿ›  **type**: ์ปค๋ฐ‹์˜ ์œ ํ˜•

| ํƒ€์ž… | ์„ค๋ช… |
|------------|------------------------------------------------|
| `feat` | โœจ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ |
| `fix` | ๐Ÿ› ๋ฒ„๊ทธ ์ˆ˜์ • |
| `docs` | ๐Ÿ“ ๋ฌธ์„œ ์ˆ˜์ • (README, ์ฃผ์„ ๋“ฑ) |
| `style` | ๐Ÿ’„ ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ ๋“ฑ ๊ธฐ๋Šฅ ์˜ํ–ฅ ์—†๋Š” ๋ณ€๊ฒฝ |
| `refactor` | โ™ป๏ธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง (๊ธฐ๋Šฅ ๋ณ€ํ™” ์—†์Œ) |
| `test` | โœ… ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ ๋˜๋Š” ์ˆ˜์ • |
| `chore` | ๐Ÿ”ง ๋นŒ๋“œ ์„ค์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์„ค์ • ๋“ฑ ๊ธฐํƒ€ ์ž‘์—… |
| `perf` | โšก ์„ฑ๋Šฅ ๊ฐœ์„  |
| `ci` | ๐Ÿ”„ CI ๊ด€๋ จ ์„ค์ • ๋ฐ ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ • |
| `revert` | โš™๏ธ ์ด์ „ ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ |
### ๐Ÿ”น AI / Recommendation
- **FastAPI (Python)** : AI ์ถ”์ฒœ ์„œ๋ฒ„
- **GPT-4o-mini**
- ๐Ÿณ **์š”๋ฆฌ ๋ ˆ์‹œํ”ผ ์ƒ์„ฑ** (์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งคํ•œ ๋ฐ˜์ฐฌ ๊ธฐ๋ฐ˜)
- ๐Ÿฅ— **์‹๋‹จ ํ…Œ๋งˆ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ** (๋‹ค์ด์–ดํŠธ/ํ‚คํ† /์ €์—ผ/๋ฒŒํฌ์—…/ํ˜ˆ๋‹น)
- **Fine-tuning**
- GPT-4o-mini๋ฅผ **์˜์–‘์„ฑ๋ถ„ํ‘œ ๋ฐ์ดํ„ฐ๋กœ ํŒŒ์ธํŠœ๋‹**
โ†’ ๋งค๋ฌผ์˜ ์‹ค์ œ ์˜์–‘ ์„ฑ๋ถ„ ๋ถ„์„ ํ›„ ๋งž์ถคํ˜• ์ถ”์ฒœ ์ œ๊ณต

<br>
<img src="https://img.shields.io/badge/FastAPI-009688?style=flat-square&logo=fastapi&logoColor=white" /> <img src="https://img.shields.io/badge/GPT--4o%20mini-412991?style=flat-square&logo=openai&logoColor=white" />

### ๐Ÿ–Š๏ธ **Subject**: ์ œ๋ชฉ

- 50์ž ์ด๋‚ด๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
- ๋งˆ์นจํ‘œ(`.`) ๊ธˆ์ง€
- ๊ณผ๊ฑฐ ์‹œ์ œ X, ๋ช…๋ น์–ด ์‚ฌ์šฉ
### ๐Ÿ”น DevOps
- **Gradle** : ๋นŒ๋“œ & ์˜์กด์„ฑ ๊ด€๋ฆฌ
- **GitHub Actions** : CI/CD ํŒŒ์ดํ”„๋ผ์ธ
- Build & Test
- Docker Build & Push โ†’ DockerHub ์—…๋กœ๋“œ
- **Docker** : ์ปจํ…Œ์ด๋„ˆํ™” ๋ฐ ๋ฐฐํฌ

<br>
<img src="https://img.shields.io/badge/Gradle-023038?style=flat-square&logo=gradle&logoColor=white" /> <img src="https://img.shields.io/badge/GitHub%20Actions-2088FF?style=flat-square&logo=githubactions&logoColor=white" /> <img src="https://img.shields.io/badge/Docker-2496ED?style=flat-square&logo=docker&logoColor=white" />

### ๐Ÿ“ **Body**: ๋ณธ๋ฌธ

- **์„ ํƒ ์‚ฌํ•ญ**
- ์ œ๋ชฉ์—์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณต
- "๋ฌด์—‡์„"๊ณผ "์™œ"๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ƒ์„ธํžˆ ๊ธฐ์ˆ 
- ํ•œ ์ค„๋‹น 72์ž ์ด๋‚ด๋กœ ์ž‘์„ฑ
- ํ•„์š”์‹œ Markdown ์‚ฌ์šฉ ๊ฐ€๋Šฅ
---

## ๐Ÿ“‚ Project Structure
```text
๐Ÿ“ฆ src
โ”ฃ ๐Ÿ“‚ main
โ”ƒ โ”ฃ ๐Ÿ“‚ java/com/example/Centralthon
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ domain # ๋„๋ฉ”์ธ ๋กœ์ง
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ global # ๊ณตํ†ต ์„ค์ • ๋ฐ ์œ ํ‹ธ
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ core/exception # ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
โ”ƒ โ”ฃ ๐Ÿ“‚ resources
โ”ƒ โ”ƒ โ”ฃ application.properties # ํ™˜๊ฒฝ ์„ค์ •
โ”ฃ ๐Ÿ“‚ test # ๋‹จ์œ„/ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
```

---
<br>

## ๐Ÿ›  ์ฃผ์š” ๊ธฐ๋Šฅ

## ๐ŸŒฟ Git Flow ๋ธŒ๋žœ์น˜ ์ „๋žต (with `main`) ๐ŸŒฟ
### 1. ๐Ÿ“ ๋ฐ˜์ฐฌ ๋งค๋ฌผ ์กฐํšŒ
- ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ **๋ฐ˜๊ฒฝ 2km ์ด๋‚ด**์˜ ๋งค๋ฌผ ๋ชฉ๋ก ์กฐํšŒ
- ๊ฐ€๊ฒŒ ์ •๋ณด, ๋ฉ”๋‰ด ์ •๋ณด, ๊ฐ€๊ฒฉ, ํ• ์ธ์œจ ํฌํ•จ

### 2. ๐Ÿšถ ์ตœ์  ๊ฒฝ๋กœ ์ œ๊ณต
- ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฌผ์„ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ณ  ํ”ฝ์—… ์˜ˆ์•ฝํ•˜๋ฉด
ํ•ด๋‹น ๊ฐ€๊ฒŒ๋“ค์„ ๊ฒฝ์œ ํ•˜๋Š” **๋„๋ณด ์ตœ์  ๊ฒฝ๋กœ(TSP ๊ธฐ๋ฐ˜)** ์ œ๊ณต
- **Tmap API + ๋‚ด๋ถ€ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™œ์šฉ**

### ๐ŸŒด ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜
| ๋ธŒ๋žœ์น˜ | ์—ญํ•  |
|--------|------|
| `main` | ์ตœ์ข… ๋ฐฐํฌ์šฉ ๋ธŒ๋žœ์น˜ (stable) |
| `develop` | ๋‹ค์Œ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ํ†ตํ•ฉ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜ |
### 3. ๐Ÿณ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ ์ถ”์ฒœ (AI)
- ๊ตฌ๋งคํ•œ ๋ฐ˜์ฐฌ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” **๋ ˆ์‹œํ”ผ ์ž๋™ ์ƒ์„ฑ**
- **GPT-4o-mini ํ™œ์šฉ**

<br>
### 4. ๐Ÿฅ— ๋งž์ถคํ˜• ์‹๋‹จ ์ถ”์ฒœ (AI Fine-tuning)
- ๋‹ค์„ฏ ๊ฐ€์ง€ ์‹๋‹จ ํ…Œ๋งˆ ์ œ๊ณต:
- ๋‹ค์ด์–ดํŠธ / ํ‚คํ†  / ์ €์—ผ / ๋ฒŒํฌ์—… / ํ˜ˆ๋‹น ์กฐ์ ˆ
- **GPT-4o-mini Fine-tuning** โ†’ ์‹ค์ œ **์˜์–‘์„ฑ๋ถ„ํ‘œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต**์‹œ์ผœ, ๋งค๋ฌผ์˜ ์„ฑ๋ถ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ๋งˆ๋ณ„ ๋งž์ถคํ˜• ์ถ”์ฒœ ์ œ๊ณต

### ๐ŸŒฑ **์ž‘์—… ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ ๊ทœ์น™**
---

```
type/#issue๋ฒˆํ˜ธ (์ž‘์—… ๋‹จ์œ„๋Š” ๊ธฐ๋Šฅ/์ˆ˜์ •/๋ฆฌํŒฉํ† ๋ง ๋“ฑ์œผ๋กœ ๊ตฌ๋ถ„)
```
## โš™๏ธ CI/CD Workflow

### ๐Ÿ”น CI Pipeline
1. Gradle ๋นŒ๋“œ โ†’ Spring Boot JAR ์ƒ์„ฑ
2. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
3. DockerHub ํ‘ธ์‹œ (latest, commit sha ํƒœ๊ทธ)

| prefix | ์„ค๋ช… | ์˜ˆ์‹œ |
|--------------|------------------------------|-----------------------------------|
| `feature/` | โœจ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ | `feature/#15` |
| `fix/` | ๐Ÿ› ๋ฒ„๊ทธ ์ˆ˜์ • | `fix/#42` |
| `refactor/` | โ™ป๏ธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง | `refactor/#23` |
| `chore/` | ๐Ÿ”ง ์„ค์ • ๋ณ€๊ฒฝ, ์žก์ผ | `chore/#25` |
| `perf/` | โšก ์„ฑ๋Šฅ ๊ฐœ์„  | `perf/#94` |
| `hotfix/` | ๐Ÿš‘ ๊ธ‰ํ•œ ์ˆ˜์ • (main์—์„œ ๋ฐ”๋กœ ๋ถ„๊ธฐ) | `hotfix/#102` |
| `test/` | ๐Ÿงช ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€/์ˆ˜์ • | `test/#55` |
### ๐Ÿ”น CD Pipeline
1. ๋Œ€์ƒ ์„œ๋ฒ„์—์„œ DockerHub์—์„œ pull
2. ์ปจํ…Œ์ด๋„ˆ ์žฌ๊ธฐ๋™(๊ต์ฒด ๋ฐฐํฌ)

<br>

### ๐Ÿš€ ๋ธŒ๋žœ์น˜ ํ๋ฆ„ ์š”์•ฝ
๐Ÿ‘‰ GitHub Actions์—์„œ **`main` ๋ธŒ๋žœ์น˜์— push ์‹œ ์ž๋™ ์‹คํ–‰**

```text
1. main โ† ๋ฐฐํฌ
2. develop โ† ํ†ตํ•ฉ ๊ฐœ๋ฐœ (PR ๋Œ€์ƒ)
3. develop์—์„œ feature/fix/... ๋ธŒ๋žœ์น˜ ๋ถ„๊ธฐ
4. ๊ธฐ๋Šฅ ์™„๋ฃŒ ํ›„ develop์œผ๋กœ PR & ๋จธ์ง€
5. ๋ฐฐํฌ ์‹œ develop โ†’ main ๋จธ์ง€
6. ๊ธ‰ํ•œ ์ˆ˜์ •์€ hotfix์—์„œ main โ†’ develop ๋ณ‘ํ•ฉ
```
---
## ๐Ÿ“Š ERD
<img width="885" height="543" alt="image" src="https://github.com/user-attachments/assets/35bf67e7-59e4-4079-8ff5-2290b61343ed" />


---

## ๐Ÿ“Œ API ๋ชฉ๋ก (์ฃผ์š” ์—”๋“œํฌ์ธํŠธ)

- `GET /api/menus` โ†’ ์‚ฌ์šฉ์ž ์œ„์น˜ ๊ธฐ๋ฐ˜ ๋ฐ˜๊ฒฝ 2km ๋‚ด ๋งค๋ฌผ ์กฐํšŒ
- `POST /api/routes/directions` โ†’ ํ”ฝ์—… ์˜ˆ์•ฝ ๊ธฐ๋ฐ˜ ์ตœ์  ๊ฒฝ๋กœ ์ƒ์„ฑ
- `POST /api/menus/tips` โ†’ ๊ตฌ๋งค ๋ฐ˜์ฐฌ ๊ธฐ๋ฐ˜ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ ์ถ”์ฒœ (AI)
- `POST /api/menus/recommend` โ†’ ์‹๋‹จ ํ…Œ๋งˆ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ (AI Fine-tuning)

Swagger ๋ฌธ์„œ:
๐Ÿ‘‰ [https://52.78.244.98.nip.io/api/swagger-ui/index.html](https://52.78.244.98.nip.io/api/swagger-ui/index.html)

---


Binary file added docs/images/server.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.