app.get(), app.post() 코드가 몇백개 쌓일 때 관리가 어려움디렉토리 구조:
routes/
└── shop.js
server.js
// routes/shop.js
const router = require('express').Router()
router.get('/shop/shirts', (요청, 응답) => {
응답.send('셔츠 파는 페이지입니다')
})
router.get('/shop/pants', (요청, 응답) => {
응답.send('바지 파는 페이지입니다')
})
module.exports = router
// server.js
app.use('/', require('./routes/shop.js'))
// routes/shop.js - URL에서 /shop 제거
router.get('/shirts', (요청, 응답) => {
응답.send('셔츠 파는 페이지입니다')
})
// server.js - 공통 경로 지정
app.use('/shop', require('./routes/shop.js'))
라우터 파일에서 db 변수를 사용할 수 없음
// database.js
const { MongoClient } = require('mongodb')
const url = 'DB연결URL~~'
let connectDB = new MongoClient(url).connect()
module.exports = connectDB
// server.js
let connectDB = require('./database.js')
let db
connectDB.then((client) => {
console.log('DB연결성공')
db = client.db('forum')
app.listen(process.env.PORT, () => {
console.log('서버 실행중')
})
}).catch((err) => {
console.log(err)
})
// routes/shop.js
let connectDB = require('./../database.js')
let db
connectDB.then((client) => {
console.log('DB연결성공')
db = client.db('forum')
}).catch((err) => {
console.log(err)
})
npm install dotenv
// server.js 상단
require('dotenv').config()
PORT=8080
DB_URL="mongodb+srv://codingapple1@저쩌구"
SECRET_KEY="암호화키"
// 코드에서 사용
app.listen(process.env.PORT)
const dbUrl = process.env.DB_URL
⚠️ 주의사항: .env 파일은 GitHub에 업로드하면 안됨!
요청과 응답 사이에 실행되는 함수
function checkLogin(요청, 응답, next) {
if (요청.user) {
next() // 다음 단계로 진행
} else {
응답.send('로그인안했는데요?')
}
}
// 특정 API에 적용
app.get('/protected', checkLogin, (요청, 응답) => {
응답.send('보호된 페이지')
})
// 모든 API에 적용
app.use(checkLogin)
// 특정 URL로 시작하는 API에만 적용
app.use('/admin', checkLogin)
// 여러 미들웨어 적용
app.get('/api', [middleware1, middleware2], (요청, 응답) => {
// API 로직
})
// routes/admin.js
router.use(checkLogin) // 이 라우터의 모든 API에 적용
// 로그 출력 미들웨어
app.use('/list', (요청, 응답, next) => {
console.log(new Date())
next()
})
// 입력값 검증 미들웨어
function validateInput(요청, 응답, next) {
if (요청.body.username == '' || 요청.body.password == '') {
응답.send('입력값이 비어있습니다')
} else {
next()
}
}
0.0.0.0으로 설정 (모든 IP 허용)node_modules 폴더 제외하고 프로젝트를 .zip으로 압축AWS 콘솔 → IAM → 역할 생성
애플리케이션 설정
코드 업로드
인스턴스 설정
배포 후 구성 메뉴에서 환경변수 추가 가능
"업로드 및 배포" 버튼으로 새 코드 zip 파일 업로드
<form action="/add" method="POST" enctype="multipart/form-data">
<input type="file" name="img1" accept="image/*">
<input name="title">
<input name="content">
<button type="submit">전송</button>
</form>
npm install multer multer-s3 @aws-sdk/client-s3
const { S3Client } = require('@aws-sdk/client-s3')
const multer = require('multer')
const multerS3 = require('multer-s3')
const s3 = new S3Client({
region: 'ap-northeast-2',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_KEY
}
})
const upload = multer({
storage: multerS3({
s3: s3,
bucket: '버킷이름',
key: function (요청, file, cb) {
cb(null, Date.now().toString()) // 파일명 중복 방지
}
})
})
app.post('/add', upload.single('img1'), async (요청, 응답) => {
console.log(요청.file) // 업로드된 파일 정보
await db.collection('post').insertOne({
title: 요청.body.title,
content: 요청.body.content,
img: 요청.file.location // S3 URL
})
응답.redirect('/list')
})
app.post('/add', (요청, 응답) => {
upload.single('img1')(요청, 응답, (err) => {
if (err) return 응답.send('업로드 에러')
// 업로드 성공시 로직
// DB에 저장 등...
})
})
<input type="file" name="images" multiple>
upload.array('images', 5) // 최대 5개 파일
.env 파일 GitHub 업로드 금지