본문 바로가기
Node.js

Node.js 교과서 3주차

by WhoamixZerOne 2022. 6. 1.

✔ 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

 

Express - Node.js web application framework

Fast, unopinionated, minimalist web framework for Node.js $ npm install express --save

expressjs.com

 

[Node.js] Node.js Middleware란?

🎯 Node.js Middleware란? 미들웨어는 Express.js 동작의 핵심이다. HTTP 요청과 응답 사이에서 단계별 동작을 수행해주는 함수이다. 📝 미들웨어 동작 원리 Express.js의 미들웨어는 HTTP 요청이 들어온 순

lakelouise.tistory.com

'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

댓글