Node.js(Express) 기반의 소형 Web/API 서버입니다. MySQL 데이터베이스 연결 상태를 확인하고, 지정한 데이터베이스의 테이블 목록을 조회할 수 있습니다. 상품·사용자·주문 테이블 생성과 샘플 데이터 삽입도 웹 UI 또는 API로 실행할 수 있습니다. 모든 API 응답 형식은 JSON입니다.
React(Vite)로 만든 관리용 웹 화면이 포함되어 있으며, 프론트엔드를 빌드한 뒤 같은 포트에서 정적 파일과 /api 라우트를 함께 제공할 수 있습니다.
| 역할 | 설명 |
|---|---|
| REST API | DB 연결 검증(ping), 테이블 목록 조회, 테이블 생성, 샘플 데이터 삽입 |
| 웹 UI | 연결 상태·테이블 목록 확인, 테이블 생성·샘플 데이터 추가 버튼 제공 |
| 배포 | main 브랜치 푸시 시 GitHub Actions가 배포 웹훅 호출 |
| 배포 형태 | API만 쓰거나, 빌드 후 한 프로세스에서 UI + API 동시 제공 |
백엔드는 mysql2로 MySQL에 연결하고, 환경 변수는 프로젝트 루트의 .env에서 읽습니다(실행 위치와 무관하게 src 기준 상위 디렉터리의 .env를 사용합니다).
- 런타임: Node.js 18 이상
- 서버: Express
- DB: MySQL (mysql2 connection pool)
- 설정: dotenv
- 프론트엔드: React 18, Vite 5
- CI/CD: GitHub Actions
프로젝트 루트에 .env를 두고, 아래 예시를 참고해 설정합니다. .env.example을 복사해 사용할 수 있습니다.
| 변수 | 설명 |
|---|---|
APP_PORT |
API 서버 HTTP 포트 (기본값: 3000) |
WEB_PORT |
Vite 개발 서버 포트 (기본값: 5173) |
DB_HOST |
MySQL 호스트 |
DB_PORT |
MySQL 포트 (기본값: 3306) |
DB_USER |
DB 사용자 |
DB_PASSWORD |
DB 비밀번호 |
DB_NAME |
연결할 데이터베이스 이름 |
애플리케이션 코드에서는 process.env.APP_PORT, process.env.WEB_PORT, process.env.DB_HOST 등으로 참조합니다.
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/api/health |
서비스 기동 여부 확인 |
GET |
/api/db/check |
DB 연결 성공 여부 (ping) |
GET |
/api/db/tables |
현재 DB_NAME 스키마의 테이블 이름 목록 |
POST |
/api/db/setup-tables |
예시 테이블 생성 (FK·이상 컬럼명 개인정보 테이블 포함) |
POST |
/api/db/seed-sample-data |
샘플 데이터 누적 삽입 (?scope=all|personal|non_personal) |
연결 실패 시 HTTP 상태는 주로 503이며, 응답에 error, code(해당 시)가 포함될 수 있습니다.
brands ──────────────┐
categories ──┐ │
warehouses │ ▼
│ products ◄──── inventory
└── product_categories
coupons (독립)
users ── addresses
│
├── orders ── order_items ──► products
│ │
│ ├── payments
│ └── shipments
├── reviews ──► products
├── cust_shadow_bag (이상한 컬럼명의 개인정보)
├── id_scrap_bin (이상한 컬럼명의 신원정보)
└── reach_out_pad (이상한 컬럼명의 연락처)
| 테이블 | 개인정보 | 관계 / 설명 |
|---|---|---|
brands |
없음 | 브랜드 마스터 |
categories |
없음 | 카테고리 |
warehouses |
없음 | 물류 창고 |
products |
없음 | brands 참조 |
product_categories |
없음 | products ↔ categories N:M |
inventory |
없음 | products + warehouses |
coupons |
없음 | 쿠폰 정책 |
users |
있음 | 고객 개인정보 |
addresses |
있음 | users 참조 배송지 |
orders |
있음 | users + products 참조 |
order_items |
없음 | orders + products 라인 |
payments |
있음 | orders 참조, 결제자명 |
shipments |
있음 | orders 참조, 수령인 정보 |
reviews |
있음 | users + products 참조 |
cust_shadow_bag |
있음 | 이상 컬럼명 (aka_label, digi_mailbox, ring_signal …) |
id_scrap_bin |
있음 | 이상 컬럼명 (face_tag, citizen_fake_no, wallet_tail …) |
reach_out_pad |
있음 | 이상 컬럼명 (who_is_it, ping_me, shout_code …) |
POST /api/db/seed-sample-data 로 데이터를 누적 삽입합니다. scope 쿼리로 구분해 넣을 수 있습니다.
| scope | 설명 |
|---|---|
all (기본) |
개인정보 + 비개인정보 전부 |
personal |
users, addresses, orders, payments, shipments, reviews, cust_shadow_bag, id_scrap_bin, reach_out_pad 등 |
non_personal |
brands, categories, warehouses, products, product_categories, inventory, coupons |
버튼을 누를 때마다 대상 테이블에 각 10건 전후씩 누적됩니다. 기존 데이터는 삭제되지 않습니다. 테이블 생성을 먼저 실행해야 합니다.
- DB 연결 상태 확인
- 테이블 생성 버튼 클릭 → 예시 테이블 14개 생성
- 개인정보/비개인정보/전체 샘플 추가 버튼으로 구분 삽입
- 목록 불러오기로 개인정보 포함/없음 그룹과 행 수 확인
- 테이블 클릭으로 실제 행 데이터 확인
npm install
npm start개발 시 파일 변경 시 자동 재시작:
npm run dev터미널 1에서 API 서버를 띄운 뒤, 터미널 2에서:
cd frontend
npm install
npm run devVite는 /api 요청을 APP_PORT로 프록시합니다. 브라우저는 WEB_PORT(기본 5173)에서 접속합니다.
npm run build
npm startfrontend/dist가 있으면 Express가 그 정적 파일을 서빙하고, 그 외 경로는 SPA용으로 index.html을 반환합니다. API는 그대로 /api 아래에 있습니다.
main 브랜치에 푸시되면 .github/workflows/deploy-webhook.yml이 실행되어 배포 웹훅을 호출합니다.
POST https://awen.3vi.co.kr/api/sys_hosting/deploy-webhook/api-server-all
Authorization: Bearer <AWEN_DEPLOY_TOKEN>저장소 Settings → Secrets and variables → Actions에서 아래 시크릿을 등록합니다.
| 시크릿 이름 | 설명 |
|---|---|
AWEN_DEPLOY_TOKEN |
배포 웹훅 Bearer 토큰 |
api-server-all/
├── .github/
│ └── workflows/
│ └── deploy-webhook.yml # main 푸시 시 배포 웹훅
├── src/
│ ├── index.js # Express 앱, API 라우트, 정적 서빙
│ └── db/
│ ├── schema.js # 테이블 DDL
│ └── sampleData.js # 샘플 데이터 (각 10건)
├── frontend/ # React + Vite 관리 UI
│ └── src/
│ ├── App.jsx
│ └── api.js
├── package.json
├── .env # 로컬 설정 (저장소에 커밋하지 않는 것을 권장)
└── .env.example
이 프로젝트는 내부·진단용으로 DB 연결 정보와 개인정보 형태의 샘플 데이터를 다룹니다.
.env와 배포 토큰(AWEN_DEPLOY_TOKEN)은 저장소에 올리지 마세요.- 샘플 데이터는 테스트용 가상 정보이지만, 운영 DB에는 사용하지 않는 것을 권장합니다.
- 운영 환경에서는 방화벽·MySQL 사용자 권한을 적절히 제한하는 것이 좋습니다.