기본 개념
URL 구조 설계
/list/1 → 1~5번째 글
/list/2 → 6~10번째 글
/list/3 → 11~15번째 글
기본 구현 (하드코딩)
app.get('/list/1', async (요청, 응답) => {
let result = await db.collection('post').find().skip(0).limit(5).toArray()
응답.render('list.ejs', { 글목록 : result })
})
URL 파라미터 활용
app.get('/list/:id', async (요청, 응답) => {
let result = await db.collection('post').find()
.skip((요청.params.id - 1) * 5)
.limit(5)
.toArray()
응답.render('list.ejs', { 글목록 : result })
})
MongoDB 쿼리 메소드
.limit(5) : 최대 5개 문서만 가져오기.skip(5) : 앞의 5개 문서 건너뛰기.toArray() : 결과를 배열로 변환skip() 방식의 한계
_id 기반 방식
await db.collection('post').find({
_id: { $gt: 마지막게시물_id }
}).limit(5).toArray()
장점과 단점
다음 버튼 구현
// 서버 코드
app.get('/list/next/:id', async (요청, 응답) => {
let result = await db.collection('post').find({
_id: { $gt: new ObjectId(요청.params.id) }
}).limit(5).toArray()
응답.render('list.ejs', { 글목록 : result })
})
<!-- EJS 템플릿 -->
<a href="/list/next/<%= 글목록[글목록.length - 1]._id %>">다음</a>
Auto Increment 구현
기본 동작 원리
회원가입
1. 유저가 아이디/비번 입력
2. 서버가 DB에 저장
로그인
1. 유저가 로그인 시도
2. DB의 정보와 대조 확인
3. 성공 시 세션 생성 및 쿠키 발급
인증이 필요한 기능
1. 유저가 요청 시 쿠키 자동 전송
2. 서버가 세션 확인 후 서비스 제공
입장권(세션) 저장 방식
Session 방식
JWT(Token) 방식
설치
npm install express-session passport passport-local
기본 설정
const session = require('express-session')
const passport = require('passport')
const LocalStrategy = require('passport-local')
app.use(passport.initialize())
app.use(session({
secret: '암호화에 쓸 비번',
resave: false,
saveUninitialized: false
}))
app.use(passport.session())
로그인 검증 로직
passport.use(new LocalStrategy(async (입력한아이디, 입력한비번, cb) => {
let result = await db.collection('user').findOne({ username: 입력한아이디 })
if (!result) {
return cb(null, false, { message: '아이디 DB에 없음' })
}
if (result.password == 입력한비번) {
return cb(null, result)
} else {
return cb(null, false, { message: '비번불일치' })
}
}))
로그인 API
app.post('/login', async (요청, 응답, next) => {
passport.authenticate('local', (error, user, info) => {
if (error) return 응답.status(500).json(error)
if (!user) return 응답.status(401).json(info.message)
요청.logIn(user, (err) => {
if (err) return next(err)
응답.redirect('/')
})
})(요청, 응답, next)
})
세션 생성
passport.serializeUser((user, done) => {
process.nextTick(() => {
done(null, { id: user._id, username: user.username })
})
})
세션 검증
passport.deserializeUser(async (user, done) => {
let result = await db.collection('user').findOne({
_id: new ObjectId(user.id)
})
delete result.password
process.nextTick(() => {
return done(null, result)
})
})
세션 유효기간 설정
app.use(session({
secret: '암호화에 쓸 비번',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 60 * 60 * 1000 } // 1시간
}))
로그인 상태 확인
요청.user로 현재 로그인된 사용자 정보 확인 가능