์์ ์ ์ฌ๋ฆฌ๋ฉด ๊ฐ์ฅ ๋ฎ์ ๊ณก์ ์ฐพ์์ฃผ๊ณ , "์ ๋ฎ์๋์ง"๊น์ง ์ค๋ช ํด์ฃผ๋ ์ค๋์ค ์ ์ฌ๋ ๋ถ์ ์๋น์ค
ํ์ผ๋ก ๋ง๋ค์๋ easygap/capstone_music ๋ฅผ ํผ์ ๋ค์ ๋ถ์ก์๋ค. ์ฃผํผํฐ ๋ ธํธ๋ถ ํ ์ฅ์์๋ง ๋๋ ๋ถ์๊ธฐ๋ฅผ, ๋๊ตฌ๋ ๋ธ๋ผ์ฐ์ ๋ก ์ด์ด์ ์จ๋ณผ ์ ์๋ ์๋น์ค๋ก ๋ง๋ค์ด๋ณด๊ณ ์ถ์๋ค.
์ง๊ธ์ ์์ ํ์ผ ํ๋๋ง ์ฌ๋ฆฌ๋ฉด ๋๋๋ค. librosa ๋ก ์์ยทํ ํฌยท๋ฆฌ๋ฌยทMFCC ๋ฑ 58๊ฐ์ง ํน์ฑ์ ๋ฝ๊ณ , ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋ 781๊ณก ์นดํ๋ก๊ทธ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ก ๋น๊ตํด์ โ ๊ฐ์ฅ ๋ฎ์ ๊ณก๊ณผ ๊ทธ ์ด์ ๋ฅผ ๋๋ ค์ค๋ค. ์์์ ๋ถ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋๋ก ๋๊ณ , ๊ทธ ์์ FastAPI ์๋ฒ ยท SPA ํ๋ก ํธ ยท Docker ยท CI ๋ฅผ ์๋ก ์น์๋ค.
๊ฐ์ธ์ ๋ณด ๋ณดํธ: ์ ๋ก๋ํ ์์์ ๋ถ์์ด ๋๋๋ ์ฆ์ ์ง์ด๋ค. ์ด๋์๋ ์ ์ฅํ๊ฑฐ๋ ํ์ต์ ์ฐ์ง ์๋๋ค.
๊ฐ์ฅ ๊ณต๋ค์ธ ๋ถ๋ถ์ด๋ค. ์์๋ง ํญ ๋์ง๋ ๋์ , ์ ๋ก๋ํ ๊ณก๊ณผ 1์ ๋งค์นญ์ ์ค๋์ค ์ง๋ฌธ์ ๋ ์ด๋ ์ฐจํธ๋ก ๊ฒน์ณ ๋ณด์ฌ์ฃผ๊ณ โ "ํ ํฌยท๋ฆฌ๋ฌ์ด 96% ๋ฎ์๋ค"๋ ์์ผ๋ก ์ด๋๊ฐ ์ ๋ฎ์๋์ง๋ฅผ ํ๊ตญ์ด ๋ฌธ์ฅ์ผ๋ก ํ์ด์ค๋ค.
์ค๋น๋ ์์์ด ์์ด๋ ๊ด์ฐฎ๋ค. ๋ฉ์ธ ํ๋ฉด์ ์ํ๋ก ๋ถ์ํด๋ณด๊ธฐ ํ ๋ฒ์ด๋ฉด ๊ฒฐ๊ณผ ํ๋ฉด์ ๊ทธ๋๋ก ๋๋ฌ๋ณผ ์ ์๋ค.
๋คํฌยท๋ผ์ดํธ ํ ๋ง, ๋ชจ๋ฐ์ผ, ํ๊ตญ์ด/์์ด, PWA(ํ ํ๋ฉด ์ถ๊ฐยท์คํ๋ผ์ธ)๊น์ง โ ์ด๋ค ํ๊ฒฝ์์ ์ด์ด๋ ํํธ๋ฌ์ง์ง ์๊ฒ ๋ค๋ฌ์๋ค.
![]() |
![]() |
|
librosa ๋ก RMSยทBPMยท์คํํธ๋ด ์ผํธ๋ก์ด๋ยทํฌ๋ก๋งยท20-MFCC ๋ฑ 58๊ฐ์ง ํน์ฑ์ ๋ฝ๋๋ค. |
|
ํน์ฑ๋ณ ๊ฑฐ๋ฆฌ๋ฅผ ์์ ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด "์ ๋ฎ์๋์ง" ๋ฅผ ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ฅ์ผ๋ก ํ์ด์ค๋ค. |
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements-dev.txt
uvicorn backend.main:app --reload # โ http://localhost:8000Docker ๊ฐ ํธํ๋ฉด docker compose up --build ํ ์ค์ด๋ฉด ๋๋ค.
๋ฌด๊ฑฐ์ด ์ค๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ํ๋ฉด๋ง ๋ณด๊ณ ์ถ๋ค๋ฉด python preview_server.py 8765 โ ๋๋ฏธ ๋ฐ์ดํฐ๋ก ์ ํ์ด์ง๊ฐ ๊ทธ๋๋ก ๋ฌ๋ค.
- CLI โ ์๋ฒ ์์ด ํ์ผยทํด๋ ๋จ์ ๋ถ์, ๋ ๊ณก ๋น๊ต, ๋ฐฐํฌ ํฌ์ค์ฒดํฌ๊น์ง (
python -m backend.cli --help) - API โ ๋ชจ๋ ์๋ํฌ์ธํธ๋
/docs์ Swagger ๋ฌธ์์์ ๋ฐ๋ก ๋๋ฌ๋ณผ ์ ์๋ค - ์ค์ โ rate limit ยท CORS ยท ์บ์ ยท ํ๋ก์ ์ ๋ขฐ ๋ฒ์ ๋ฑ์
MUSIC_*ํ๊ฒฝ ๋ณ์๋ก ์กฐ์ - ์นดํ๋ก๊ทธ ๊ต์ฒด โ
scripts/rebuild_dataset.py๋ก ๋ด ์์ ํด๋๋ฅผ ํต์งธ๋ก ๋ค์ ์นดํ๋ก๊ทธํ
๊ธฐ์ ์คํ ย ยทย Python ยท FastAPI ยท librosa ยท scikit-learn ยท numpy ์์, ํ๋ ์์ํฌ ์์ด ์ง Vanilla JS SPA + PWA. ๋ฐฐํฌ๋ Docker, ๊ฒ์ฆ์ GitHub Actions(3๊ฐ ํ์ด์ฌ ๋ฒ์ ๋งคํธ๋ฆญ์ค).
๋ฐฐํฌ๋ ์๋ฒ๊ฐ ๊ธฐ๋ํ ๋ฒ์ ์ธ์ง ํ์ธํ ๋๋ CLI ๋ฅผ ๋ฐ๋ก ์ด๋ค.
python -m backend.cli version
# v1.8.22 ยท 2026-07-16 ยท <git-sha>
python -m backend.cli status --url https://your-soundmatch.example --readyํต์ฌ ์ค์ ๋ง ์ถ๋ฆฌ๋ฉด ์๋ ์ ๋๋ค. ์ ์ฒด ๊ฐ์ backend/main.py ์ MUSIC_* ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๋ฅธ๋ค.
| ์ด๋ฆ | ๊ธฐ๋ณธ | ์ค๋ช |
|---|---|---|
MUSIC_ENV |
development |
production ์ด๋ฉด HSTS ์ ์๊ฒฉํ CORS ์ค์ ์ ์ฌ์ฉํ๋ค. |
MUSIC_DATASET_PATH |
data/dataset.csv |
๋น๊ต์ ์ฌ์ฉํ ์นดํ๋ก๊ทธ CSV ๊ฒฝ๋ก. |
MUSIC_MAX_UPLOAD_BYTES |
26214400 |
์ ๋ก๋ ํ์ผ ํฌ๊ธฐ ์ ํ. ๊ธฐ๋ณธ์ 25MB. |
MUSIC_RATE_LIMIT_PER_MIN |
12 |
IP ๊ธฐ์ค ๋ถ๋น ๋ถ์ ์์ฒญ ํ๋. |
MUSIC_GIT_COMMIT |
"" | /api/version ๊ณผ /api/health ์ ๋
ธ์ถํ ์งง์ ๋ฐฐํฌ SHA. |
WEB_CONCURRENCY |
1 |
Docker / Render / Fly ๊ธฐ๋ณธ๊ฐ์ ๋จ์ผ worker. rate limit, ์บ์, metrics ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ด๋ผ ์ฌ๋ฌ worker ๋ฅผ ์ฐ๋ ค๋ฉด Redis ๊ฐ์ ์ธ๋ถ ์ํ ์ ์ฅ์๋ฅผ ๋จผ์ ๋ถ์ฌ์ผ ํ๋ค. |
CHANGELOG.md์[Unreleased]๋ด์ฉ์## [x.y.z] โ YYYY-MM-DD์น์ ์ผ๋ก ์ฎ๊ธด๋ค.backend/__init__.py์__version__์ ๊ฐ์x.y.z๋ก ์ฌ๋ฆฐ๋ค.- README ์
python -m backend.cli version์ถ๋ ฅ ์์์ OpenAPI ์คํค๋ง ์์๋ ๊ฐ์ ๋ฒ์ ์ผ๋ก ๋ง์ถ๋ค. - main CI ๊ฐ ์ด๋ก์ธ์ง ํ์ธํ ๋ค
git tag vx.y.z && git push origin vx.y.z.
ํ๊ทธ๊ฐ ํธ์๋๋ฉด GitHub Release ์ํฌํ๋ก๊ฐ CHANGELOG ์น์
์ ๊ทธ๋๋ก ๋ฆด๋ฆฌ์ฆ ๋
ธํธ๋ก ์ฌ์ฉํ๋ค.
ํ๊ทธ ๋ฒ์ , backend.__version__, CHANGELOG.md ์ ๋ฆด๋ฆฌ์ฆ ์น์
์ด ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด ๋ฆด๋ฆฌ์ฆ ์์ฑ์ ์ค๋จํ๋ค.
- ๋ถ์์ ๊ณก์ ์ 30์ด๋ง ๋ณธ๋ค. ๊ฐ์ฅ ํน์ง์ ์ธ ํ๋ ด๊ตฌ๊ฐ ์ ์กํ ์ ์๋ค.
- ์นดํ๋ก๊ทธ๋ 781๊ณก ๊ท๋ชจ. ๋ ์ปค์ง๋ฉด ์ฝ์ฌ์ธ ์ ์ฌ๋ ๋์ AnnoyยทFAISS ๊ฐ์ ANN ๊ตฌ์กฐ๊ฐ ๋ง๋ค.
- rate limitยทmetrics ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ด๋ผ, ์ฌ๋ฌ ์์ปค๋ก ๋์ฐ๋ฉด ๊ฐ์ด ์์ปค๋ณ๋ก ๋๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ทจ๋ฏธยทํ์ต์ฉ์ด๋ค. ์ ์๊ถ์ด๋ ๋ผ์ด์ ์ค ํ๋จ์ ๊ทผ๊ฑฐ๋ ๋ ์ ์๋ค.
MIT. ์์ ์บก์คํค ๋ฐ์ดํฐ์ ๊ณผ ์ฝ๋๋ easygap/capstone_music ์์ ๋ณผ ์ ์๋ค.





