# ๐ Express, AWS Lambda ๋ฐ Dynamo DB๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ ๋ฐฑ์๋
Source: Dev.to
Node.js์ Express๋ก ๊ตฌ์ถ๋ ์ธ์ฆ ๋ฐ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋ฐฑ์๋ API์ ๋๋ค. ๋ณด์ ๋ก๊ทธ์ธ/ํ์๊ฐ์ , ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ AWS DynamoDB, Stripe, Brevo์ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค.
โจ ๊ธฐ๋ฅ
- ๐ ์ธ์ฆ ์์คํ โ JWT ํ ํฐ์ ์ด์ฉํ ์์ ํ ์ฌ์ฉ์ ๋ฑ๋ก ๋ฐ ๋ก๊ทธ์ธ
- ๐ฅ ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด โ 4๋จ๊ณ ์ญํ ์์คํ (User, Agent, Master, Super Admin)
- ๐ ๋น๋ฐ๋ฒํธ ๋ณด์ โ ์์ ํ ๋น๋ฐ๋ฒํธ ์ ์ฅ์ ์ํ Bcrypt ํด์
- ๐ DynamoDB ํตํฉ โ AWS DynamoDB๋ฅผ ์ด์ฉํ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
- ๐ณ ๊ฒฐ์ ์ฒ๋ฆฌ โ ๊ฒฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํ Stripe ํตํฉ
- ๐ง ์ด๋ฉ์ผ ์๋น์ค โ ์ด๋ฉ์ผ ์ปค๋ฎค๋์ผ์ด์ ์ ์ํ Brevo ํตํฉ
- ๐ ์๋ฒ๋ฆฌ์ค ์ค๋น โ AWS Lambda ํจ์๋ก ๋ฐฐํฌ ๊ฐ๋ฅ
- ๐ก๏ธ ๋ณด์ ๋ฏธ๋ค์จ์ด โ JWT ์ธ์ฆ ๋ฐ ์ธ๊ฐ ๋ฏธ๋ค์จ์ด
- ๐ ์ ๋ ฅ ๊ฒ์ฆ โ ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ์๋ํฌ์ธํธ์ ๋ํ ์์ฒญ ๊ฒ์ฆ
- ๐๏ธ MVC ์ํคํ ์ฒ โ ๋ชจ๋ธ, ๋ทฐ, ์ปจํธ๋กค๋ฌ๋ฅผ ํตํ ๋ช ํํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
๐ ๏ธ ๊ธฐ์ ์คํ
| ๊ตฌ์ฑ ์์ | ๊ธฐ์ |
|---|---|
| ๋ฐํ์ | Node.js |
| ํ๋ ์์ํฌ | Express.js |
| ๋ฐ์ดํฐ๋ฒ ์ด์ค | AWS DynamoDB |
| ์ธ์ฆ | JWT (JSON Web Tokens) |
| ๋น๋ฐ๋ฒํธ ํด์ฑ | bcryptjs |
| ๊ฒฐ์ | Stripe |
| ์ด๋ฉ์ผ | Brevo (formerly Sendinblue) |
| ๋ฐฐํฌ | Serverless (AWS Lambda compatible) |
๐ ํ์ ์กฐ๊ฑด
- Node.js (v14 ์ด์)
- npm ๋๋ yarn
- AWS ๊ณ์ (DynamoDB์ฉ)
- Stripe ๊ณ์ (๊ฒฐ์ ์ฒ๋ฆฌ์ฉ)
- Brevo ๊ณ์ (์ด๋ฉ์ผ ์๋น์ค์ฉ)
๐ ์ค์น
1. ์ ์ฅ์ ๋ณต์
git clone https://github.com/puffer-git/login-dynamo-db.git
cd login-dynamo-db
2. ์์กด์ฑ ์ค์น
npm install
3. ํ๊ฒฝ ๋ณ์ ์ค์
๋ฃจํธ ๋๋ ํฐ๋ฆฌ์ .env ํ์ผ์ ๋ง๋ค๊ณ ๋ค์ ๋ณ์๋ฅผ ์ค์ ํ์ธ์:
# Server Configuration
ENVIRONMENT=development
PORT=4000
# JWT Configuration
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
JWT_EXPIRES_IN=7d
# AWS DynamoDB Configuration
AWSREGION=us-east-1
AWSENDPOINT=https://dynamodb.us-east-1.amazonaws.com
AWSACCESSKEYID=your-aws-access-key-id
AWSSECRETKEY=your-aws-secret-access-key
# Stripe Configuration (optional)
STRIPE_SECRET_KEY=your-stripe-secret-key
# Brevo Configuration (optional)
BREVO_API_KEY=your-brevo-api-key
4. DynamoDB ํ ์ด๋ธ ์ค์
users ๋ผ๋ ์ด๋ฆ์ DynamoDB ํ
์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ธ์:
- Partition Key:
id(String) - Pointโinโtime recovery: ํ์ฑํ (ํ๋ก๋์ ์์๋ ๊ถ์ฅ)
๐ ์ ํ๋ฆฌ์ผ์ด์ ์คํ
๊ฐ๋ฐ ๋ชจ๋
npm run dev
์๋ฒ๋ http://localhost:4000์์ ์๋ ์ฌ๋ก๋๊ฐ ํ์ฑํ๋ ์ํ๋ก ์์๋ฉ๋๋ค.
ํ๋ก๋์ ๋ชจ๋
npm start
์๋ฒ๋ฆฌ์ค ๋ฐฐํฌ
ENVIRONMENT=production์ผ ๋, ์ ํ๋ฆฌ์ผ์ด์
์ AWS Lambda ๋ฐฐํฌ์ ์ ํฉํ ์๋ฒ๋ฆฌ์ค ํธ๋ค๋ฌ๋ฅผ ๋ด๋ณด๋
๋๋ค.
๐ API ๋ฌธ์
๊ธฐ๋ณธ URL
- ๊ฐ๋ฐ:
http://localhost:4000 - ํ๋ก๋์ : ๋ฐฐํฌ๋ ์๋ํฌ์ธํธ
์ธ์ฆ ์๋ํฌ์ธํธ
์ ์ฌ์ฉ์ ๋ฑ๋ก
POST /auth/signup
Content-Type: application/json
{
"player_name": "johndoe",
"email": "john@example.com",
"password": "securePassword123",
"name": "John Doe" // optional
}
์๋ต (201 Created)
{
"success": true,
"message": "User created successfully",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
์ค๋ฅ ์๋ต
409 Conflictโ ํ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ด๋ฉ์ผ์ด ์ด๋ฏธ ์กด์ฌํฉ๋๋ค400 Bad Requestโ ๊ฒ์ฆ ์ค๋ฅ500 Internal Server Errorโ ์๋ฒ ์ค๋ฅ
๋ก๊ทธ์ธ
POST /auth/login
Content-Type: application/json
{
"identifier": "johndoe", // Can be email or player_name
"password": "securePassword123"
}
์๋ต (200 OK)
{
"success": true,
"message": "Login successful",
"data": {
"user": {
"role": "user",
"player_name": "johndoe",
"email": "john@example.com",
"name": "John Doe"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
์ค๋ฅ ์๋ต
401 Unauthorizedโ ์ธ์ฆ ์ ๋ณด๊ฐ ์ ํจํ์ง ์์400 Bad Requestโ ๊ฒ์ฆ ์ค๋ฅ500 Internal Server Errorโ ์๋ฒ ์ค๋ฅ
์ธ์ฆ ํค๋
๋ณดํธ๋ ๋ผ์ฐํธ์์๋ Authorization ํค๋์ JWT ํ ํฐ์ ํฌํจํ์ธ์:
Authorization: Bearer <token>
๐๏ธ ํ๋ก์ ํธ ๊ตฌ์กฐ
login-dynamo-db/
โโโ app/
โ โโโ constants/
โ โ โโโ roles.js # Role definitions and hierarchy
โ โ โโโ tables.js # DynamoDB table configurations
โ โโโ controllers/
โ โ โโโ auth/
โ โ โโโ login/
โ โ โ โโโ login.js
โ โ โ โโโ loginValidation.js
โ โ โโโ signup/
โ โ โโโ signup.js
โ โ โโโ signupValidation.js
โ โโโ db/
โ โ โโโ dynamoClient.js # DynamoDB client configuration
โ โ โโโ index.js # Database exports
โ โโโ middleware/
โ โ โโโ auth.js
โ โโโ ... (other folders/files)
โโโ config/
โ โโโ ... (configuration files)
โโโ routes/
โ โโโ ... (route definitions)
โโโ services/
โ โโโ ... (business logic, e.g., Stripe, Brevo)
โโโ tests/
โ โโโ ... (unit/integration tests)
โโโ .env.example
โโโ package.json
โโโ README.md
์ถ๊ฐ ๊ตฌ์กฐ:
โโโ app/
โ โโโ middleware/
โ โ โโโ auth.js # Authentication & authorization middleware
โ โโโ models/
โ โ โโโ BaseModel.js # Base model for DynamoDB operations
โ โ โโโ UserModel.js # User model with business logic
โ โโโ routes/
โ โ โโโ auth.js # Authentication routes
โ โ โโโ index.js # Route aggregator
โ โโโ utils/
โ โ โโโ userUtils.js # User utility functions
โ โโโ index.js # Express app configuration
โโโ index.js # Application entry point
โโโ package.json
โโโ README.md
๐ ์ญํ ์์คํ
์ ํ๋ฆฌ์ผ์ด์ ์ 4๋จ๊ณ ์ญํ ๊ณ์ธต์ ์ง์ํฉ๋๋ค:
- USER โ ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ญํ (๊ธฐ๋ณธ๊ฐ)
- AGENT โ ์์ด์ ํธ ์์ค ๊ถํ
- MASTER โ ๋ง์คํฐ ์์ค ๊ถํ
- SUPER_ADMIN โ ์ต๊ณ ์์ค ์ ๊ทผ ๊ถํ
์ญํ ์ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ํ์ธ๋ฉ๋๋ค:
authenticateโ JWT ํ ํฐ ๊ฒ์ฆauthorize(roles)โ ์ฌ์ฉ์๊ฐ ํน์ ์ญํ ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธrequireMinimumRole(role)โ ์ฌ์ฉ์๊ฐ ์ต์ ์ญํ ์์ค์ ์ถฉ์กฑํ๋์ง ํ์ธ
๐งช ๊ฐ๋ฐ
์ฝ๋ ์คํ์ผ
- ๊ธฐ์กด ์ฝ๋ ํจํด์ ๋ฐ๋ฅด์ธ์.
- ์๋ฏธ ์๋ ๋ณ์ ๋ฐ ํจ์ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์.
- ํจ์์ JSDoc ์ฃผ์์ ์ถ๊ฐํ์ธ์.
- ํจ์๋ ํ๋์ ๋ชฉ์ ์ ์ง์คํ๋๋ก ์ ์งํ์ธ์.
์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
-
๊ธฐ๋ฅ ๋ธ๋์น๋ฅผ ์์ฑํ์ธ์:
git checkout -b feature/your-feature-name -
MVC ์ํคํ ์ฒ๋ฅผ ๋ฐ๋ฅด์ธ์:
- Models โ
app/models/ - Controllers โ
app/controllers/ - Routes โ
app/routes/ - Middleware โ
app/middleware/
- Models โ
-
์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ๊ฒ์ฆ์ ์ถ๊ฐํ์ธ์.
-
๋ช ํํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํ์ธ์.
-
๋ณ๊ฒฝ ์ฌํญ์ ์ถฉ๋ถํ ํ ์คํธํ์ธ์.
-
ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ธ์.
๐ค ๊ธฐ์ฌ
Contributions are welcome! Please follow these steps:
-
Fork the repository.
-
Create your feature branch:
git checkout -b feature/AmazingFeature -
Commit your changes:
git commit -m 'Add some AmazingFeature' -
Push to the branch:
git push origin feature/AmazingFeature -
Open a Pull Request.
๊ธฐ์ฌ ๊ฐ์ด๋๋ผ์ธ
- Write clear, readable code. โ ๋ช ํํ๊ณ ๊ฐ๋ ์ฑ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ์ธ์.
- Add comments for complex logic. โ ๋ณต์กํ ๋ก์ง์๋ ์ฃผ์์ ์ถ๊ฐํ์ธ์.
- Follow the existing code structure. โ ๊ธฐ์กด ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด์ธ์.
- Test your changes before submitting. โ ์ ์ถํ๊ธฐ ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ์ธ์.
- Update documentation if needed. โ ํ์ํ๋ฉด ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ์ธ์.
๐ ๋ผ์ด์ ์ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ผ์ด์ ์ค๊ฐ ๋ถ์ฌ๋ฉ๋๋ค โ ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ญ์์ค.
๐ง ์ฐ๋ฝ์ฒ
๊ฐ๋ฐ์: Puffer
- ์ด๋ฉ์ผ: devpuffer0807@gmail.com
- ํ ๋ ๊ทธ๋จ: @devpuffer0807
๐ Acknowledgments
- Express.js ๋ก ๊ตฌ์ถ
- AWS DynamoDB ๋ก ๊ตฌ๋๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Stripe ๋ก ๊ฒฐ์ ์ฒ๋ฆฌ
- Brevo ๋ก ์ด๋ฉ์ผ ์๋น์ค
โญ๏ธ ์ง์
์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์๋ค๋ฉด ๋ณํ๋ฅผ ๋๋ฌ ์ฃผ์ธ์!
