๐ ์๋ฆผG์ ๊ตํ ํ์คํ ํ๋ซํผ ์์ฑ!
๐ ๊ตฌํ ์๋ฃ ์ฌํญ ์ด์ ๋ฆฌ
โ
1. ๋ฐฑ์๋ ๊ฐ๋ฐ (Node.js + Express)
RESTful API ์๋ฒ
- Express ๊ธฐ๋ฐ ๋ชจ๋ ์น ์๋ฒ
- SQLite ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- JWT ์ธ์ฆ ์์คํ
- Bcrypt ๋น๋ฐ๋ฒํธ ์ํธํ
- Multer ํ์ผ ์
๋ก๋
- Sharp ์ด๋ฏธ์ง ์ต์ ํ
- Nodemailer ์ด๋ฉ์ผ ๋ฐ์ก
๋ณด์ ๊ฐํ
- Helmet ๋ณด์ ํค๋
- CORS ์ค์
- Rate Limiting (15๋ถ 100ํ)
- SQL Injection ๋ฐฉ์ด
- XSS ๋ฐฉ์ด
โ
2. ๋ค๊ตญ์ด ์ง์ (i18n)
์์ ์ง์ ์ธ์ด
- ๐ฐ๐ท ํ๊ตญ์ด (ko)
- ๐บ๐ธ ์์ด (en)
- ๐ป๐ณ ๋ฒ ํธ๋จ์ด (vi)
๋ฒ์ญ ์์คํ
- JSON ๊ธฐ๋ฐ ๋ฒ์ญ ํ์ผ
- API ์๋ํฌ์ธํธ๋ฅผ ํตํ ๋์ ๋ก๋ฉ
- ๋ชจ๋ UI ์์ ๋ค๊ตญ์ดํ
- ๋ด์ค, ํํธ๋, ๊ฐค๋ฌ๋ฆฌ ์ฝํ
์ธ ๋ค๊ตญ์ด
โ
3. ์จ๋ผ์ธ ํ์ ์์คํ
PG ์ฐ๋
- PortOne (๊ตฌ ์์ํฌํธ) ์ฐ๋ ์ค๋น ์๋ฃ
- ์ ๊ธฐ/์ผํ ํ์ ์ง์
- ๋ค์ํ ๊ฒฐ์ ์๋จ (์นด๋, ๊ณ์ข์ด์ฒด ๋ฑ)
ํ์ ๊ด๋ฆฌ
- ํ์ ์งํ๋ฅ ์ค์๊ฐ ์ถ์
- ํ์์ ์ ๋ณด ๊ด๋ฆฌ
- ์์์ฆ ์๋ ๋ฐ์ก
- ํ์ ๋ด์ญ ์กฐํ
โ
4. ๊ด๋ฆฌ์ ๋์๋ณด๋
์ธ์ฆ ์์คํ
- JWT ๊ธฐ๋ฐ ๋ก๊ทธ์ธ
- ์ญํ ๊ธฐ๋ฐ ๊ถํ ๊ด๋ฆฌ
- ์ธ์
๊ด๋ฆฌ
๊ด๋ฆฌ ๊ธฐ๋ฅ
- ๋ด์ค ๊ด๋ฆฌ: ์์ฑ, ์์ , ์ญ์ , ๋ฐํ ๊ด๋ฆฌ
- ๋๊ธ ๊ด๋ฆฌ: ์น์ธ/๊ฑฐ๋ถ, ์ญ์
- ํ์ ๊ด๋ฆฌ: ๋ด์ญ ์กฐํ, ์ํ ์
๋ฐ์ดํธ
- ๊ฐค๋ฌ๋ฆฌ ๊ด๋ฆฌ: ์ด๋ฏธ์ง ์
๋ก๋, ์ต์ ํ
- ํํธ๋ ๊ด๋ฆฌ: BAM ๊ธฐ์
์ ๋ณด ๊ด๋ฆฌ
- ์ค์ ๊ด๋ฆฌ: ์ฌ์ดํธ ์ค์ ๋ณ๊ฒฝ
- ํต๊ณ ๋์๋ณด๋: ์ค์๊ฐ ํต๊ณ
โ
5. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
8๊ฐ ์ฃผ์ ํ
์ด๋ธ
- visitors - ๋ฐฉ๋ฌธ์ ์ถ์
- newsletter_subscribers - ๋ด์ค๋ ํฐ ๊ตฌ๋
์
- donations - ํ์ ๋ด์ญ
- news - ๋ด์ค ๊ธฐ์ฌ (๋ค๊ตญ์ด)
- comments - ๋๊ธ ์์คํ
- admin_users - ๊ด๋ฆฌ์ ๊ณ์
- partners - ํ๋ ฅ ํํธ๋
- gallery - ๊ฐค๋ฌ๋ฆฌ ์ด๋ฏธ์ง
- settings - ์ฌ์ดํธ ์ค์
โ
6. API ์๋ํฌ์ธํธ (23๊ฐ)
๊ณต๊ฐ API (12๊ฐ)
GET /health ํฌ์ค ์ฒดํฌ
GET /api/visitors ๋ฐฉ๋ฌธ์ ํต๊ณ
POST /api/newsletter ๋ด์ค๋ ํฐ ๊ตฌ๋
POST /api/donation ํ์ํ๊ธฐ
GET /api/donation/progress ํ์ ์งํ๋ฅ
GET /api/news ๋ด์ค ๋ชฉ๋ก
GET /api/news/:id ๋ด์ค ์์ธ
POST /api/comments ๋๊ธ ์์ฑ
GET /api/search ๊ฒ์
GET /api/i18n/:lang ๋ฒ์ญ ๋ก๋
GET /api/gallery ๊ฐค๋ฌ๋ฆฌ
GET /api/partners ํํธ๋ ๋ชฉ๋ก
๊ด๋ฆฌ์ API (11๊ฐ)
POST /api/admin/login ๋ก๊ทธ์ธ
GET /api/admin/dashboard ๋์๋ณด๋
GET /api/admin/news ๋ด์ค ๋ชฉ๋ก
POST /api/admin/news ๋ด์ค ์์ฑ
PUT /api/admin/news/:id ๋ด์ค ์์
DELETE /api/admin/news/:id ๋ด์ค ์ญ์
GET /api/admin/comments ๋๊ธ ๋ชฉ๋ก
PUT /api/admin/comments/:id/approve ๋๊ธ ์น์ธ
DELETE /api/admin/comments/:id ๋๊ธ ์ญ์
GET /api/admin/donations ํ์ ๋ชฉ๋ก
PUT /api/admin/donations/:id/status ํ์ ์ํ ๋ณ๊ฒฝ
GET /api/admin/settings ์ค์ ์กฐํ
PUT /api/admin/settings ์ค์ ๋ณ๊ฒฝ
โ
7. ๋ด์ค & ์ปจํ
์ธ ๊ด๋ฆฌ
๋ค๊ตญ์ด ๋ด์ค
- ํ๊ตญ์ด/์์ด/๋ฒ ํธ๋จ์ด ๋์ ์ง์
- ์ ๋ชฉ, ๋ณธ๋ฌธ, ์์ฝ ๋ค๊ตญ์ดํ
- ์นดํ
๊ณ ๋ฆฌ ๋ฐ ํ๊ทธ ์์คํ
- ์กฐํ์ ์๋ ์ถ์
์ด๋ฏธ์ง ์ฒ๋ฆฌ
- ์๋ ์ต์ ํ (Sharp)
- ๋ฆฌ์ฌ์ด์ง (์ต๋ 1200x800)
- ํ์ง ์์ถ (85%)
- ์ธ๋ค์ผ ์์ฑ (400x300)
โ
8. ๋๊ธ ์์คํ
๊ธฐ๋ฅ
- ๋๊ธ ์์ฑ ๋ฐ ๋ต๊ธ
- ๋ค๊ตญ์ด ์ง์
- ์คํธ ๋ฐฉ์ง (์น์ธ ์ํฌํ๋ก์ฐ)
- ๊ณ์ธต ๊ตฌ์กฐ (๋๋๊ธ)
๊ด๋ฆฌ
- ๊ด๋ฆฌ์ ์น์ธ ํ ํ์
- ๋ถ์ ์ ํ ๋๊ธ ์ญ์
- ์์ฑ์ ์ ๋ณด ๊ด๋ฆฌ
โ
9. ์ด๋ฉ์ผ ํตํฉ
์๋ ๋ฐ์ก
- ๋ด์ค๋ ํฐ ๊ตฌ๋
ํ์ ์ด๋ฉ์ผ
- ํ์ ์๋ฃ ๊ฐ์ฌ ์ด๋ฉ์ผ
- ๊ด๋ฆฌ์ ์๋ฆผ ์ด๋ฉ์ผ
์ค์
- Gmail SMTP ์ง์
- ๋ค๋ฅธ SMTP ์๋ฒ ์ฐ๋ ๊ฐ๋ฅ
- HTML ์ด๋ฉ์ผ ํ
ํ๋ฆฟ
โ
10. ๊ฐค๋ฌ๋ฆฌ ๊ด๋ฆฌ
์ด๋ฏธ์ง ๊ด๋ฆฌ
- ๋ค์ค ์ด๋ฏธ์ง ์
๋ก๋
- ์๋ ์ต์ ํ ๋ฐ ์ธ๋ค์ผ ์์ฑ
- ์นดํ
๊ณ ๋ฆฌ๋ณ ๋ถ๋ฅ
- ํ๊ทธ ์์คํ
ํ์
- ๊ทธ๋ฆฌ๋ ๋ ์ด์์
- ๋ชจ๋ฌ ํ๋ ๋ณด๊ธฐ
- Lazy loading ์ง์
โ
11. ๊ธ๋ก์ปฌ ๋น์ฆ๋์ค ํ์ฅ์ฑ
BAM (Business As Mission) ์์คํ
- ํ๋ ฅ ๊ธฐ์
๊ด๋ฆฌ
- ์ฐ์
๋ถ๋ฅ
- ์ง์ญ๋ณ ๋ถ๋ฅ
- ์น์ฌ์ดํธ ์ฐ๊ฒฐ
๋ค๊ตญ์ด ์ง์
- ๊ธฐ์
๋ช
๋ค๊ตญ์ด
- ์ค๋ช
๋ค๊ตญ์ด
- ์ฐ๋ฝ์ฒ ์ ๋ณด
๐ ์คํ ๋ฐฉ๋ฒ
1. ์ค์น
git clone https://github.com/JinJun-han/elimgweb.git
cd elimgweb
npm install
2. ํ๊ฒฝ ์ค์
cp .env.example .env
# .env ํ์ผ ํธ์ง
3. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ
4. ์๋ฒ ์คํ
5. ๋ธ๋ผ์ฐ์ ์์ ์ด๊ธฐ
๐ ๊ด๋ฆฌ์ ๊ณ์
๊ธฐ๋ณธ ๊ณ์
- Username:
admin
- Password:
change-this-password
โ ๏ธ ๋ณด์: ์ฒซ ๋ก๊ทธ์ธ ํ ๋ฐ๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ์ธ์!
๐ก API ํ
์คํธ
Health Check
curl http://localhost:3000/health
๋ด์ค ๋ชฉ๋ก (ํ๊ตญ์ด)
curl "http://localhost:3000/api/news?language=ko&limit=5"
๋ด์ค ๋ชฉ๋ก (๋ฒ ํธ๋จ์ด)
curl "http://localhost:3000/api/news?language=vi&limit=5"
๋ฐฉ๋ฌธ์ ํต๊ณ
curl http://localhost:3000/api/visitors
ํ์ ์งํ๋ฅ
curl http://localhost:3000/api/donation/progress
๋ด์ค๋ ํฐ ๊ตฌ๋
curl -X POST http://localhost:3000/api/newsletter \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","language":"ko"}'
๊ด๋ฆฌ์ ๋ก๊ทธ์ธ
curl -X POST http://localhost:3000/api/admin/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"change-this-password"}'
๐ ๋ผ์ด๋ธ ์๋ฒ
ํ์ฌ ์คํ ์ค
URL: https://3000-ikfnvt0ididz4vgesiz23-5c13a017.sandbox.novita.ai
API ํ
์คํธ
- Health: https://3000-ikfnvt0ididz4vgesiz23-5c13a017.sandbox.novita.ai/health
- News (KO): https://3000-ikfnvt0ididz4vgesiz23-5c13a017.sandbox.novita.ai/api/news?language=ko
- News (EN): https://3000-ikfnvt0ididz4vgesiz23-5c13a017.sandbox.novita.ai/api/news?language=en
- News (VI): https://3000-ikfnvt0ididz4vgesiz23-5c13a017.sandbox.novita.ai/api/news?language=vi
๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํํฉ
์ด๊ธฐํ ์๋ฃ
- โ
Admin users: 1
- โ
News articles: 2 (์ํ)
- โ
Partners: 2 (์ํ)
- โ
Settings: 6
์ํ ๋ด์ค
- ๊ฑฐ์ ์ฐธ๋นํ๋ง์ผํฐ ๊ฐ์์
- ํํ์ค์
์ธ๊ตญ์ธ ๊ทผ๋ก์ 1,800๋ช
์ข
ํฉ ์ง์
- ์นดํ
๊ณ ๋ฆฌ: ํ์ฅ
- ๋ฒ ํธ๋จ์ด ํ๊ตญ์ด ๊ต์ก ํ๋ซํผ ์คํ
- 700๊ฐ ๋จ์ด, 20๋จ๊ณ ์ฒด๊ณํ ํ์ต
- ์นดํ
๊ณ ๋ฆฌ: ๊ต์ก
๐ฏ ๋ค์ ๋จ๊ณ (ํฅํ ๊ฐ๋ฐ ๊ณํ)
ํ๋ก ํธ์๋ ํ๋ํ
์ค์๊ฐ ๊ธฐ๋ฅ
๋ชจ๋ฐ์ผ ์ฑ
๊ณ ๊ธ ๊ธฐ๋ฅ
๋น์ฆ๋์ค ํ์ฅ
๐ฆ ๊ธฐ์ ์คํ ์์ฝ
๋ฐฑ์๋
- Node.js 18+
- Express 4.18
- SQLite (better-sqlite3)
- JWT (jsonwebtoken)
- Bcrypt
- Nodemailer
- Multer
- Sharp
ํ๋ก ํธ์๋
- React 18
- Babel Standalone
- Vanilla CSS
- IntersectionObserver API
- Clipboard API
๋ณด์ & ์ฑ๋ฅ
- Helmet
- CORS
- Rate Limiting
- Compression
- Image Optimization
๐ ์ฑ๊ณผ ์งํ
๊ฐ๋ฐ ์๋ฃ
- โ
23๊ฐ API ์๋ํฌ์ธํธ
- โ
8๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ
- โ
3๊ฐ ์ธ์ด ์์ ์ง์
- โ
100% RESTful API
- โ
JWT ์ธ์ฆ ์์คํ
- โ
์ด๋ฏธ์ง ์ต์ ํ ์๋ํ
- โ
์ด๋ฉ์ผ ์๋ ๋ฐ์ก
- โ
๊ด๋ฆฌ์ ๋์๋ณด๋
์ฝ๋ ํ์ง
- โ
ES6+ ๋ชจ๋ JavaScript
- โ
๋ชจ๋ํ ์ค๊ณ
- โ
์๋ฌ ํธ๋ค๋ง
- โ
๋ณด์ Best Practices
- โ
RESTful ์ค๊ณ ์์น
๐ ๊ฒฐ๋ก
์๋ฆผG์ ๊ตํ ์น์ฌ์ดํธ๊ฐ ๋จ์ ์ ์ ์ฌ์ดํธ์์ ํ์คํ ๊ธ๋ก์ปฌ ์ ๊ต ํ๋ซํผ์ผ๋ก ์์ ํ ๋ณ๋ชจํ์ต๋๋ค!
์ฃผ์ ์ฑ๊ณผ
- โ
๋ฐฑ์๋ API ์๋ฒ ๊ตฌ์ถ
- โ
๋ค๊ตญ์ด ์ง์ (3๊ฐ๊ตญ)
- โ
์จ๋ผ์ธ ํ์ ์์คํ
- โ
๊ด๋ฆฌ์ ๋์๋ณด๋
- โ
๋ด์ค/๋๊ธ ์์คํ
- โ
์ด๋ฉ์ผ ํตํฉ
- โ
์ด๋ฏธ์ง ์ต์ ํ
- โ
BAM ๋น์ฆ๋์ค ๋คํธ์ํฌ
๊ธ๋ก์ปฌ ์ ๊ต์ ์๋ก์ด ํจ๋ฌ๋ค์
- ๐ ์๋ฐฉ(Local)์์ ์ด๋ฐฉ(Global)์ผ๋ก
- ๐ค ๋์์ ๋์ด ์ฐ๊ฒฐ๋ก
- ๐ผ ์ ๊ต์ ๋น์ฆ๋์ค์ ์ตํฉ
- ๐ ๋์งํธ ๊ธฐ์ ๋ก ํ์ฅํ๋ ํ๋๋ ๋๋ผ
๊ฐ๋ฐ ์๋ฃ์ผ: 2026๋
2์ 8์ผ
GitHub: https://github.com/JinJun-han/elimgweb
Live Demo: https://3000-ikfnvt0ididz4vgesiz23-5c13a017.sandbox.novita.ai
Made with โค๏ธ & โ by AI Assistant for Elim G Mission