Angple Backend

๋ค๋ชจ์(damoang.net) ์ปค๋ฎค๋ํฐ ์ฐจ์ธ๋ ๋ฐฑ์๋ API ์๋ฒ์
๋๋ค. ๊ธฐ์กด PHP ์์คํ
์ Go๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ์ฌ 800ms โ 50ms ์ดํ์ ์๋ต ์๋๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค.
๐ Quick Start
๋ฐฉ๋ฒ 1: Docker All-in-One (๊ถ์ฅ โญ)
MySQL + Redis + API๋ฅผ ํ ๋ฒ์ ์คํํ๋ ์์ ํ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ:
# ์ ์ฒด ๊ฐ๋ฐ ํ๊ฒฝ ์์
make dev-docker
# ๋ก๊ทธ ํ์ธ
make dev-docker-logs
# ์ค์ง
make dev-docker-down
์๋ ์คํ ํญ๋ชฉ:
- MySQL (ํฌํธ 3306)
- Redis (ํฌํธ 6379)
- API ์๋ฒ (ํฌํธ 8081)
๋ฐฉ๋ฒ 2: ๋ก์ปฌ ์ง์ ์คํ
# 1. MySQL + Redis๋ง ์คํ
docker-compose up -d
# 2. ํ๊ฒฝ ์ค์
cp .env.example .env
# 3. API ์๋ฒ ์คํ
make dev
# ๋๋
go run cmd/api/main.go
์๋ฒ ํ์ธ:
curl http://localhost:8081/health
# {"status":"ok","time":1734163200}
๐ ์์ธ ๊ฐ์ด๋: ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
โจ ์ฃผ์ ๊ธฐ๋ฅ
โ
๊ตฌํ ์๋ฃ (Production Ready)
| ๊ธฐ๋ฅ |
์ค๋ช
|
์๋ํฌ์ธํธ |
| ์ธ์ฆ |
JWT + ๋ ๊ฑฐ์ SSO ํตํฉ |
/api/v2/auth/* |
| ๊ฒ์๊ธ |
CRUD, ๊ฒ์, ํ์ด์ง๋ค์ด์
|
/api/v2/boards/{id}/posts |
| ๋๊ธ |
๊ณ์ธตํ ๋๊ธ ์์คํ
|
/api/v2/boards/{id}/posts/{id}/comments |
| ๋ฉ๋ด |
๋์ ๋ฉ๋ด ๊ด๋ฆฌ (ํค๋/์ฌ์ด๋๋ฐ) |
/api/v2/menus/* |
| ์ถ์ฒ๊ธ |
์บ์ ๊ธฐ๋ฐ ์ถ์ฒ ๊ฒ์๋ฌผ |
/api/v2/recommended/{period} |
๐ง ๊ฐ๋ฐ ์์ (Roadmap)
- ํ์ผ ์
๋ก๋ (์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง)
- ์ค์๊ฐ ์๋ฆผ (WebSocket)
- ํตํฉ ๊ฒ์ (ElasticSearch)
- ํฌํ/์ค๋ฌธ ์์คํ
- ๊ด๋ฆฌ์ ๋์๋ณด๋
๐ ์ ์ฒด ๋ก๋๋งต: docs/api-roadmap.csv
๐ก API ๋ฌธ์
Swagger UI (์ถ์ฒ โญ)
# Swagger UI ์คํ
docker run -p 8082:8080 \
-e SWAGGER_JSON=/docs/swagger.yaml \
-v $(pwd)/docs:/docs \
swaggerapi/swagger-ui
# ๋ธ๋ผ์ฐ์ ์์ ์ ์
open http://localhost:8082
์ฃผ์ ์๋ํฌ์ธํธ
๐ ์ธ์ฆ (Authentication)
| ๋ฉ์๋ |
๊ฒฝ๋ก |
์ธ์ฆ |
์ค๋ช
|
| POST |
/api/v2/auth/login |
โ |
๋ก๊ทธ์ธ (JWT ๋ฐ๊ธ) |
| POST |
/api/v2/auth/refresh |
โ |
ํ ํฐ ์ฌ๋ฐ๊ธ |
| GET |
/api/v2/auth/me |
๐ช Cookie |
ํ์ฌ ์ฌ์ฉ์ (SSO) |
| GET |
/api/v2/auth/profile |
โ
JWT |
์ฌ์ฉ์ ํ๋กํ |
๋ก๊ทธ์ธ ์์ :
curl -X POST http://localhost:8081/api/v2/auth/login \
-H "Content-Type: application/json" \
-d '{"user_id":"testuser","password":"password123"}'
๐ ๊ฒ์๊ธ (Posts)
| ๋ฉ์๋ |
๊ฒฝ๋ก |
์ธ์ฆ |
์ค๋ช
|
| GET |
/api/v2/boards/{board_id}/posts |
โ |
๊ฒ์๊ธ ๋ชฉ๋ก |
| GET |
/api/v2/boards/{board_id}/posts/search |
โ |
๊ฒ์๊ธ ๊ฒ์ |
| GET |
/api/v2/boards/{board_id}/posts/{id} |
โ |
๊ฒ์๊ธ ์์ธ |
| POST |
/api/v2/boards/{board_id}/posts |
โ
|
๊ฒ์๊ธ ์์ฑ |
| PUT |
/api/v2/boards/{board_id}/posts/{id} |
โ
|
๊ฒ์๊ธ ์์ |
| DELETE |
/api/v2/boards/{board_id}/posts/{id} |
โ
|
๊ฒ์๊ธ ์ญ์ |
๊ฒ์๊ธ ์์ฑ ์์ :
curl -X POST http://localhost:8081/api/v2/boards/free/posts \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"title":"์ ๋ชฉ","content":"๋ด์ฉ"}'
๐ฌ ๋๊ธ (Comments)
| ๋ฉ์๋ |
๊ฒฝ๋ก |
์ธ์ฆ |
์ค๋ช
|
| GET |
/api/v2/boards/{board_id}/posts/{post_id}/comments |
โ |
๋๊ธ ๋ชฉ๋ก |
| POST |
/api/v2/boards/{board_id}/posts/{post_id}/comments |
โ
|
๋๊ธ ์์ฑ |
| PUT |
/api/v2/boards/{board_id}/posts/{post_id}/comments/{id} |
โ
|
๋๊ธ ์์ |
| DELETE |
/api/v2/boards/{board_id}/posts/{post_id}/comments/{id} |
โ
|
๋๊ธ ์ญ์ |
๐ ๋ฉ๋ด (Menus)
| ๋ฉ์๋ |
๊ฒฝ๋ก |
์ธ์ฆ |
์ค๋ช
|
| GET |
/api/v2/menus |
โ |
์ ์ฒด ๋ฉ๋ด |
| GET |
/api/v2/menus/sidebar |
โ |
์ฌ์ด๋๋ฐ ๋ฉ๋ด |
| GET |
/api/v2/menus/header |
โ |
ํค๋ ๋ฉ๋ด |
โญ ์ถ์ฒ ๊ฒ์๋ฌผ (Recommended)
| ๋ฉ์๋ |
๊ฒฝ๋ก |
์ธ์ฆ |
์ค๋ช
|
| GET |
/api/v2/recommended/{period} |
โ |
์ถ์ฒ ๊ฒ์๋ฌผ (daily/weekly/monthly) |
๐ ๊ธฐ์ ์คํ
Backend
- Go 1.23+ - ๊ณ ์ฑ๋ฅ ๋์์ฑ ์ฒ๋ฆฌ
- Fiber v2 - Express ์คํ์ผ ๋น ๋ฅธ HTTP ํ๋ ์์ํฌ
- GORM - Go ORM with MySQL
- golang-jwt/jwt v5 - JWT ์ธ์ฆ
Infrastructure
- MySQL 8.0 - ๊ธฐ์กด ๊ทธ๋๋ณด๋ DB (100GB+) ํธํ
- Redis 7+ - ์บ์ฑ ๋ฐ ์ธ์
- Docker Compose - ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ
Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Handler (Presentation) โ โ HTTP ์์ฒญ/์๋ต
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Service (Business Logic) โ โ ๋น์ฆ๋์ค ๋ก์ง
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Repository (Data Access) โ โ ๋ฐ์ดํฐ ์ ๊ทผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Domain (Models & DTOs) โ โ ๋๋ฉ์ธ ๋ชจ๋ธ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
angple-backend/
โโโ .docker/
โ โโโ mysql/init/ # MySQL ์ด๊ธฐํ ์คํฌ๋ฆฝํธ (๋ฉ๋ด seed ๋ฑ)
โโโ cmd/
โ โโโ api/ # API ์๋ฒ ์ํธ๋ฆฌํฌ์ธํธ
โโโ internal/
โ โโโ handler/ # HTTP ํธ๋ค๋ฌ
โ โโโ service/ # ๋น์ฆ๋์ค ๋ก์ง
โ โโโ repository/ # ๋ฐ์ดํฐ ์ ๊ทผ ๋ ์ด์ด
โ โโโ domain/ # ๋๋ฉ์ธ ๋ชจ๋ธ
โ โโโ middleware/ # JWT, CORS, Cookie Auth
โ โโโ common/ # ๊ณตํต ์๋ต/์๋ฌ
โ โโโ routes/ # ๋ผ์ฐํธ ์ค์
โ โโโ config/ # ์ค์ ๊ด๋ฆฌ
โโโ pkg/
โ โโโ jwt/ # JWT ์ ํธ๋ฆฌํฐ
โ โโโ auth/ # ๋ ๊ฑฐ์ ์ธ์ฆ ํธํ
โ โโโ logger/ # ๋ก๊ฑฐ
โ โโโ redis/ # Redis ํด๋ผ์ด์ธํธ
โโโ configs/ # YAML ์ค์ ํ์ผ
โโโ docs/ # API ๋ฌธ์ (Swagger, Roadmap)
โโโ docker-compose.yml # MySQL + Redis ํ๊ฒฝ
โโโ .env.example # ํ๊ฒฝ ๋ณ์ ์์
๐ป ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
ํ์ ์๊ตฌ์ฌํญ
- Go 1.23+
- Docker & Docker Compose
- Git
์ ์ฅ์ ํด๋ก
git clone https://github.com/damoang/angple-backend.git
cd angple-backend
๐ฆ Option 1: Docker All-in-One (๊ถ์ฅ โญ)
๋ก์ปฌ ๊ฐ๋ฐ์ ์ํ ์์ ํ ๊ฐ๋ฐ ํ๊ฒฝ์ Docker๋ก ์ ๊ณตํฉ๋๋ค. MySQL, Redis, API ์๋ฒ๊ฐ ๋ชจ๋ ์๋์ผ๋ก ์คํ๋ฉ๋๋ค.
1๋จ๊ณ: ๊ฐ๋ฐ ํ๊ฒฝ ์์
make dev-docker
์ด ๋ช
๋ น์ด๋ ๋ค์์ ์๋์ผ๋ก ์คํํฉ๋๋ค:
- MySQL 8.0 (ํฌํธ 3306)
- Redis 7 (ํฌํธ 6379)
- API ์๋ฒ (ํฌํธ 8081)
2๋จ๊ณ: ์๋ฒ ํ์ธ
# Health check
curl http://localhost:8081/health
# ๋ฉ๋ด API ํ
์คํธ
curl http://localhost:8081/api/v2/menus/sidebar
์ ์ฉํ ๋ช
๋ น์ด
# ๋ก๊ทธ ํ์ธ
make dev-docker-logs
# ํ๊ฒฝ ์ค์ง
make dev-docker-down
# ์ฌ๋น๋ (์ฝ๋ ๋ณ๊ฒฝ ํ)
make dev-docker-rebuild
ํ๊ฒฝ ๋ณ์ (์ ํ)
๊ธฐ๋ณธ ์ค์ (configs/config.docker.yaml)์ผ๋ก ๋ฐ๋ก ์คํ๋์ง๋ง, ์ปค์คํฐ๋ง์ด์ง์ด ํ์ํ๋ฉด docker-compose.dev.yml์ environment ์น์
์ ์์ ํ์ธ์.
๊ธฐ๋ณธ ์ค์ :
- Database:
mysql:3306 (Docker ๋คํธ์ํฌ ๋ด๋ถ)
- JWT Secret:
dev-secret-key-2024-please-change-in-production
- CORS:
http://localhost:5173,http://localhost:5174,http://localhost:3000
๐ง Option 2: ๋ก์ปฌ ์ง์ ์คํ
API ์๋ฒ๋ง ๋ก์ปฌ์์ ์คํํ๊ณ MySQL/Redis๋ Docker๋ก ์คํํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
1๋จ๊ณ: MySQL + Redis ์์
# MySQL + Redis ์ปจํ
์ด๋๋ง ์คํ
docker-compose up -d
# ์ปจํ
์ด๋ ์ํ ํ์ธ
docker-compose ps
Docker ๊ตฌ์ฑ:
- MySQL 8.0: ํฌํธ 3307 โ 3306
- Redis 7: ํฌํธ 6379
2๋จ๊ณ: ํ๊ฒฝ ์ค์
# .env ํ์ผ ์์ฑ
cp .env.example .env
.env ์ฃผ์ ์ค์ :
# Environment
APP_ENV=local
# Database (Docker MySQL)
DB_HOST=localhost
DB_PORT=3307
DB_USER=angple_user
DB_PASSWORD=angple_pass_2024
DB_NAME=angple_db
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
# JWT
JWT_SECRET=your-development-secret-key
DAMOANG_JWT_SECRET=your-legacy-sso-secret
# API
API_PORT=8081
3๋จ๊ณ: ์์กด์ฑ ์ค์น ๋ฐ ์คํ
# Go ๋ชจ๋ ๋ค์ด๋ก๋
go mod download
# API ์๋ฒ ์คํ
make dev
# ๋๋
APP_ENV=local go run cmd/api/main.go
4๋จ๊ณ: ์คํ ํ์ธ
# Health Check
curl http://localhost:8081/health
# ๋ฉ๋ด API ํ
์คํธ
curl http://localhost:8081/api/v2/menus/sidebar
5๋จ๊ณ: ๋น๋ (์ ํ)
# ๋ฐ์ด๋๋ฆฌ ๋น๋
make build-api
# ๋๋
go build -o bin/api cmd/api/main.go
# ์คํ
./bin/api
๐ ํ๊ฒฝ๋ณ ์ค์ ๊ฐ์ด๋
ํ๋ก์ ํธ๋ ํ๊ฒฝ๋ณ๋ก ๋ค๋ฅธ ์ค์ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค.
| ํ๊ฒฝ |
APP_ENV |
์ค์ ํ์ผ |
์ฉ๋ |
| Docker ๊ฐ๋ฐ |
docker |
configs/config.docker.yaml |
Docker Compose ๋ก์ปฌ ๊ฐ๋ฐ |
| ๋ก์ปฌ ๊ฐ๋ฐ |
local |
configs/config.local.yaml |
์ง์ ์คํ ๋ก์ปฌ ๊ฐ๋ฐ |
| ์ด์ |
prod |
configs/config.prod.yaml |
ํ๋ก๋์
ํ๊ฒฝ |
Docker ๊ฐ๋ฐ ํ๊ฒฝ (config.docker.yaml)
server:
env: docker
database:
host: mysql # Docker ์๋น์ค๋ช
port: 3306
user: damoang_user
password: dev_pass_2024
redis:
host: redis # Docker ์๋น์ค๋ช
port: 6379
cors:
allow_origins: "http://localhost:5173, http://localhost:5174"
์ด์ ํ๊ฒฝ (config.prod.yaml)
โ ๏ธ ์ค์: ์ด์ ํ๊ฒฝ์์๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ์ค๋ฒ๋ผ์ด๋ ํด์ผ ํฉ๋๋ค.
server:
env: prod
mode: production
database:
host: "" # ํ๊ฒฝ ๋ณ์: DB_HOST ํ์!
password: "" # ํ๊ฒฝ ๋ณ์: DB_PASSWORD ํ์!
jwt:
secret: "" # ํ๊ฒฝ ๋ณ์: JWT_SECRET ํ์!
damoang_secret: "" # ํ๊ฒฝ ๋ณ์: DAMOANG_JWT_SECRET ํ์!
ํ์ ํ๊ฒฝ ๋ณ์:
export DB_HOST=your-production-db-host
export DB_PASSWORD=your-secure-password
export REDIS_HOST=your-redis-host
export JWT_SECRET=your-jwt-secret-key
export DAMOANG_JWT_SECRET=your-damoang-jwt-secret
export CORS_ALLOW_ORIGINS=https://damoang.net
๐ ์ด์ ํ๊ฒฝ ๋ฐฐํฌ (Standalone)
์ ์ฒด ์คํ(MySQL, Redis, API, Gateway, Web, Admin)์ ๋จ์ผ compose๋ก ์คํํฉ๋๋ค.
๋น ๋ฅธ ์์
git clone https://github.com/damoang/angple-backend.git
cd angple-backend
cp .env.example .env # ํ์ ๊ฐ ์์
docker compose -f docker-compose.standalone.yml up -d
ํ์ ํ๊ฒฝ ๋ณ์ (.env)
| ๋ณ์ |
์ค๋ช
|
ํ์ |
DB_PASSWORD |
MySQL ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ |
O |
MYSQL_ROOT_PASSWORD |
MySQL root ๋น๋ฐ๋ฒํธ |
O |
JWT_SECRET |
JWT ์๋ช
ํค (32์ ์ด์) |
O |
ANGPLE_VERSION |
Docker ์ด๋ฏธ์ง ํ๊ทธ |
- (๊ธฐ๋ณธ: latest) |
CORS_ALLOW_ORIGINS |
ํ์ฉ Origin ๋ชฉ๋ก |
- |
LARAVEL_BACKEND_URL |
๋ ๊ฑฐ์ PHP ๋ฐฑ์๋ URL |
- |
DAMOANG_JWT_SECRET |
๋ ๊ฑฐ์ SSO ์ํฌ๋ฆฟ |
- |
์๋น์ค ํฌํธ
| ์๋น์ค |
๊ธฐ๋ณธ ํฌํธ |
ํ๊ฒฝ ๋ณ์ |
| Gateway |
8080 |
GATEWAY_PORT |
| API |
8081 |
API_PORT |
| Web |
3010 |
WEB_PORT |
| Admin |
3011 |
ADMIN_PORT |
์๋ฒ๋ณ ์ปค์คํฐ๋ง์ด์ง (docker-compose.override.yml)
๋ฆฌ๋ฒ์ค ํ๋ก์(Nginx Proxy Manager ๋ฑ)๋ ๋ ๊ฑฐ์ DB ์ฐ๋ ๋ฑ ์๋ฒ ๊ณ ์ ์ค์ ์ docker-compose.override.yml์ ์ฌ์ฉํฉ๋๋ค. ์ด ํ์ผ์ Docker Compose๊ฐ ์๋์ผ๋ก mergeํฉ๋๋ค.
# docker-compose.override.yml ์์
services:
api:
networks:
- proxy-network
- legacy-db
environment:
DB_HOST: legacy-mysql
DB_NAME: legacy_db
DB_USER: root
DB_PASSWORD: legacy-password
gateway:
networks:
- proxy-network
web:
networks:
- proxy-network
networks:
proxy-network:
external: true
legacy-db:
external: true
name: existing_mysql_network
Health Check
curl http://localhost:8081/health # API
curl http://localhost:8080/health # Gateway
curl http://localhost:3010 # Web
curl http://localhost:3011 # Admin
๐ CI/CD (GitHub Actions)
๋น๋ ๋ฐ ๋ฐฐํฌ
main ๋ธ๋์น์ pushํ๋ฉด ์๋์ผ๋ก:
- Go ํ
์คํธ ์คํ
- API + Gateway Docker ์ด๋ฏธ์ง ๋น๋ (linux/amd64, linux/arm64)
- GHCR(ghcr.io)์ push
- SSH๋ก ์๋ฒ์ ์ ์ํ์ฌ ์ด๋ฏธ์ง pull & ์ฌ์์
main push โ test โ build (multi-arch) โ GHCR push โ SSH deploy
์ํฌํ๋ก์ฐ: .github/workflows/ghcr-deploy.yml
์ด์ ํ๊ฒฝ ๋ฐฐํฌ (์๋)
์ํฌํ๋ก์ฐ: .github/workflows/deploy-prod.yml
GitHub Actions์์ ์๋ ํธ๋ฆฌ๊ฑฐํ์ฌ ์ด์ ์๋ฒ์ ๋ฐฐํฌํฉ๋๋ค.
๐ ์ธ์ฆ ์์คํ
JWT ํ ํฐ
- Access Token: 15๋ถ (์งง์ ์๋ช
์ผ๋ก ๋ณด์ ๊ฐํ)
- Refresh Token: 7์ผ (ํ ํฐ ์ฌ๋ฐ๊ธ์ฉ)
๋ ๊ฑฐ์ ํตํฉ
- Damoang SSO: ๊ธฐ์กด PHP ์์คํ
์
damoang_jwt ์ฟ ํค ๊ฒ์ฆ
- ๊ทธ๋๋ณด๋ ๋น๋ฐ๋ฒํธ: 1๊ฐ์ง ํฌ๋งท ํธํ
- ๋น๋ฐ๋ฒํธ๋ PBKDF2 ๊ธฐ๋ฐ SHA256 ํด์์ด๋ค. ๋ฐ๋ณตํ์ 12000, Salt 24 Byte
- ๊ทธ๋๋ณด๋ ID : ์์
๋ก๊ทธ์ธ ์์ด๋ adler32(md5(์์
์ ๋ํฌํค)) ๋ก ๊ฐ์ธ์ ๊ฑฐ์น๋ค.
๊ฐ๋ฐ ํ๊ฒฝ Mock ์ธ์ฆ
// local, dev ํ๊ฒฝ์์๋ ์๋ ๋ก๊ทธ์ธ
User ID: "dev_user"
User Name: "๊ฐ๋ฐ์"
Level: 10 (๊ด๋ฆฌ์)
๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค
๊ทธ๋๋ณด๋ ํธํ์ฑ
๊ธฐ์กด ๊ทธ๋๋ณด๋ 5.x ๋ฐ์ดํฐ๋ฒ ์ด์ค์ 100% ํธํ:
- ํ
์ด๋ธ ์ ๋์ฌ:
g5_
- ๋์ ๊ฒ์ํ:
g5_write_{board_id} (์: g5_write_free)
- ๋๊ธ ๊ตฌ์กฐ: ๊ฒ์๊ธ ํ
์ด๋ธ์
wr_is_comment = 1๋ก ์ ์ฅ
์ฃผ์ ํ
์ด๋ธ
g5_member # ํ์ ์ ๋ณด
g5_write_{board_id} # ๊ฒ์ํ๋ณ ๊ฒ์๊ธ/๋๊ธ
g5_board # ๊ฒ์ํ ์ค์
g5_group # ๊ฒ์ํ ๊ทธ๋ฃน
menus # ๋ฉ๋ด ์์คํ
(์ ๊ท)
Docker MySQL ์ด๊ธฐํ
.docker/mysql/init/ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ์คํ:
01-schema.sql: ๋ฉ๋ด ํ
์ด๋ธ ์์ฑ
02-seed-menus.sql: ๊ธฐ๋ณธ ๋ฉ๋ด 29๊ฐ ์ฝ์
๐งช ํ
์คํธ
# ๋ชจ๋ ํ
์คํธ ์คํ
go test ./...
# ์ปค๋ฒ๋ฆฌ์ง ํฌํจ
go test -cover ./...
# ํน์ ํจํค์ง
go test ./internal/service/...
# ํน์ ํจ์
go test -run TestAuthService ./internal/service/
โ ์์ฃผ ๋ฌป๋ ๋ฌธ์
Port 8081 already in use
์์ธ: ์ด์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง ์์
ํด๊ฒฐ:
# ํ๋ก์ธ์ค ํ์ธ ๋ฐ ์ข
๋ฃ
lsof -ti :8081 | xargs kill -9
# ๋๋
pkill -f "go run cmd/api/main.go"
CORS error (Access-Control-Allow-Origin)
์์ธ: ํ๋ก ํธ์๋ origin์ด ํ์ฉ ๋ชฉ๋ก์ ์์
ํด๊ฒฐ:
# configs/config.dev.yaml
cors:
allow_origins: "http://localhost:5173, http://localhost:5174"
๋๋ .env:
CORS_ALLOW_ORIGINS="http://localhost:5173, http://localhost:5174"
Database connection failed
์์ธ: MySQL ์ปจํ
์ด๋๊ฐ ์คํ๋์ง ์์
ํด๊ฒฐ:
# Docker ์ปจํ
์ด๋ ์ํ ํ์ธ
docker-compose ps
# MySQL ๋ก๊ทธ ํ์ธ
docker-compose logs mysql
# ์ฌ์์
docker-compose down
docker-compose up -d
DAMOANG_JWT_SECRET required
์์ธ: ํ์ ํ๊ฒฝ ๋ณ์ ๋๋ฝ
ํด๊ฒฐ:
# .env ํ์ผ์ ์ถ๊ฐ
DAMOANG_JWT_SECRET=your-legacy-sso-secret-key
๐ ์ฑ๋ฅ ๋ฒค์น๋งํฌ
๋ชฉํ ์งํ
| ์งํ |
๊ธฐ์กด PHP |
Go ๋ชฉํ |
ํ์ฌ ์ํ |
| ์๋ต ์๊ฐ (P95) |
~800ms |
< 50ms |
์ธก์ ์์ |
| ์ฒ๋ฆฌ๋ (RPS) |
~1,000 |
> 10,000 |
์ธก์ ์์ |
| ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ |
~512MB |
~128MB |
์ธก์ ์์ |
| ๋์ ์ ์ |
7์ฒ~2๋ง |
5๋ง+ |
์ธก์ ์์ |
๐ค ๊ธฐ์ฌํ๊ธฐ
๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค! ๋ค์ ์ ์ฐจ๋ฅผ ๋ฐ๋ผ์ฃผ์ธ์:
- ์ด ์ ์ฅ์๋ฅผ Fork ํฉ๋๋ค
- Feature ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค (
git checkout -b feature/amazing-feature)
- ๋ณ๊ฒฝ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค (
git commit -m 'Add amazing feature')
- ๋ธ๋์น์ Push ํฉ๋๋ค (
git push origin feature/amazing-feature)
- Pull Request๋ฅผ ์์ฑํฉ๋๋ค
์ฝ๋ฉ ์ปจ๋ฒค์
- Go ํ์ค ํฌ๋งท ์ฌ์ฉ (
gofmt, goimports)
- ํจ์/๋ฉ์๋์ ์ฃผ์ ์์ฑ
- ํ
์คํธ ์ฝ๋ ํฌํจ
- Clean Architecture ํจํด ์ค์
์ฐ์ ์์ ์์
ํ์ฌ ๋์์ด ํ์ํ ์์
๋ค:
- ๋ฉ๋ด ๊ด๋ฆฌ ์์คํ
โ
- ์ถ์ฒ API (ํ์ผ ๊ธฐ๋ฐ) โ
- ๋น์ถ์ฒ API
- ํ์ผ ์
๋ก๋ ์์คํ
(์ด๋ฏธ์ง ๋ณํ)
- ํ์ ํ๋กํ API
- ์คํฌ๋ฉ ๊ธฐ๋ฅ
- ์๋ฆผ ์์คํ
(WebSocket)
- ํตํฉ ๊ฒ์ (ElasticSearch)
๐ ์์ธ ๋ก๋๋งต: docs/api-roadmap.csv
๐ ๊ด๋ จ ๋ฌธ์
๐ ๋ผ์ด์ ์ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ
๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ๊ณ ํ์ธ์.
๐ง ๋ฌธ์
Made with โค๏ธ by SDK Co., Ltd.
Test auto deploy Mon Jan 26 06:57:02 PM KST 2026