✔ Express
- Node.js 웹 애플리케이션 프레임워크
- HTTP 유틸리티 메서드와 미들웨어를 사용하여 빠르고 쉽게 API를 작성
✔ 라우팅(Routing)
라우팅은 URI(path) 및 특정한 HTTP 요청 메서드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 응답하는 방식을 말한다.
express는 라우터를 미들웨어로서 제공하고 있고, 각 라우터는 하나 이상의 핸들러 함수를 가질 수 있다.
// 라우터 객체 참조
const express = require('express')
const router = express.Router()
// 라우팅 핸들러 등록
router.route('/api/login').post()
// 체인 라우터 핸들러
router.route('/api/test')
.get((req, res) => {
console.log('test get')
})
.post((req, res) => {
console.log('test post')
})
// 라우터 객체를 app 객체에 등록
app.use('/', router)
라우터 핸들러
미들웨어와 비슷하게 작동하는 여러 콜백 함수를 제공하여 요청을 처리할 수 있다.
유일한 차이점은 이러한 콜백은 next('router')를 호출하여 나머지 라우터 콜백을 우회할 수도 있다는 점이다.
/*
* 2개 이상의 콜백 함수는 하나의 라우터를 처리할 수 있다
* next 파라미터를 반드시 지정해야 한다
*/
app.get('/', (req, res, next) => {
console.log('test')
next()
}, (req, res) => {
console.log('test2')
})
// console result
// test
// test2
app.get('/', (req, res, next) => {
console.log('test')
next('route')
}, (req, res) => {
console.log('test2')
})
app.get('/', (req, res) => {
console.log('test3')
})
// console result
// test
// test3
express.Router
express.Router 클래스를 사용하면 모듈식 마운팅 가능한 핸들러를 사용할 수 있다.
// users.js
const express = require('express')
const router = express.Router()
router.get('/', (req, res) => {
console.log('router get')
})
router.get('/abc', (req, res) => {
console.log('router abc get')
})
module.exports = router
// app.js
const userRouter = require('./routes/users')
app.use('/users', userRouter)
"/users", "/users/abc/" URL 리소스에 대한 요청을 처리할 수 있게 되었다.
라우터 파라미터(Route Parameters)
라우트 파라미터는 URL의 해당 위치에 지정된 값을 캡처하는 데 사용된다.
캡처된 값은 req.params에 지정된 경로 매개변수의 이름을 키(key)로 사용하는 객체이다.
// http://localhost:3000/users/1
app.post('/users/:id', (req, res) => {
console.log(req.params.id) // 1
})
✔ 미들웨어(Middleware)
Express는 미들웨어로 구성된다. 내가 느끼기에는 코드 구현 전체가 미들웨어로 구성되는 것 같다.
미들웨어를 쉽게 설명하자면 요청(Request)과 응답(Response) 사이 중간(middle)에서 핸들링해주는 express의 핵심 기능이다.
- 위에서 아래로 순서대로 실행
- req, res, next가 매개변수인 함수(매개변수 명칭명은 고정이 아니다)
- next()로 다음 미들웨어로 실행
- 에러가 발생하면 에러 처리 미들웨어 실행(err, req, res, next 매개변수 4개 사용)
app.use(미들웨어) | 모든 요청에서 미들웨어 실행 |
app.use('/abc', 미들웨어) | abc로 시작하는 요청에서 미들웨어 실행 |
app.get('/abc', 미들웨어) | abc로 시작하는 GET 메서드 요청에서 미들웨어 실행 |
애플리케이션 레벨 미들웨어
Express 모듈에서 내보낸 최상위 express() 함수를 호출하여 app 객체를 생성한다.
const express = require('express')
const app = express()
생성된 app 객체에서 app.use() 및 app.METHOD() 함수를 이용해 애플리케이션 미들웨어를 사용한다.
app.use((req, res, next) => {
console.log('미들웨어 실행!')
next()
})
app.get('/', (req, res) => {
console.log('method get!')
})
미들웨어는 next()를 해야지만 다음 꺼를 진행하게 된다.
"next(err)" next에 인수가 있다면 에러 처리 미들웨어로 next가 되고, 인수가 없다면 다음 미들웨어를 실행하게 된다.
단, "next('route')"인 경우에는 다음 라우터로 실행된다.
app.use/get이 미들웨어는 아니고, 콜백함수 부분이 미들웨어이다.
라우터 레벨 미들웨어
express.Router() 인스턴스에 바인드된다는 점을 제외하면 애플리케이션 레벨 미들웨어와 동일한 방식으로 사용한다.
오류 처리 미들웨어
에러 미들웨어는 매개변수가 4개가 있어야 한다.
그 이유는 매개변수의 개수가 다른 함수는 아예 다른 함수로 취급하기 때문에 그렇다.
app.use((err, req, res, next) => {
console.error(err)
})
써드파티 미들웨어
써드파티는 express에서 만든 것이 아닌, 다른 사람들이 만든 모듈을 얘기한다.
자세한 내용 및 모듈 목록은 써드파티 미들웨어를 참조하기 바란다.
미들웨어 확장
미들웨어 내부에 미들웨어를 삽입하는 방식
app.use((req, res, next) => {
// 환경변수가 배포(production)이면 if문 실행
if (process.env.NODE_ENV === 'production') {
morgan('combined')(req, res, next)
} else { // 아니면 else문 실행
morgan('dev')(req, res, next)
}
})
🔗 Reference
'Node.js' 카테고리의 다른 글
[NestJS] Configuration 설정 & TypeORM 연결 (0) | 2023.05.31 |
---|---|
Node.js 구조 & 동작 원리 (0) | 2022.08.17 |
Node.js 교과서 4주차 (0) | 2022.06.09 |
Node.js 교과서 2주차 (0) | 2022.05.25 |
Node.js 교과서 1주차 (1) | 2022.05.14 |
댓글