Express CRUD - Routing

Janek·2023년 5월 1일
0
post-thumbnail

공식 문서를 독파하며 새로운 지식을 학습하고, 기존 지식을 보완하며, 잘못된 내용은 삭제하며 학습합니다.

라우팅(Routing)

라우팅은 어플리케이션의 엔드포인트(URI 및 특정 HTTP 요청 메서드 - GET, POST 등) 정의 및 클라이언트 요청에 응답하는 방식을 말한다.

각 라우트는 하나 이상의 핸들러 함수를 가질 수 있으며, 이러한 함수는 라우트가 일치할 때 실행된다. 라우트 정의는 다음과 같은 구조를 지닌다.

app.METHOD(PATH, HANDLER);
  • app: express의 인스턴스
  • METHOD: HTTP의 요청 메서드
  • PATH: 서버 경로
  • HANDLER: 라우트가 일치할 때 실행될 함수

이를 통해 기본적인 라우트를 구현하면 다음과 같다.

const express = require('express`);
const app = express();

app.get('/', (req, res) => { res.send('Hello World!') });

라우트 메서드

라우트 메서드는 HTTP 메서드 중 하나로부터 파생되며, express 클래스의 인스턴스에 연결된다.

기본적으로 get, post, put, head, delete, options 등을 지원한다. app.all()은 특수한 라우팅 메서드로 어떠한 HTTP 메서드로부터도 파생되지 않으며, 모든 요청 메서드에 대해 한 경로에서 미들웨어 함수를 로드하는 데 사용된다. 아래 예시의 경우 http 모듈에서 지원되는 모든 HTTP 요청 메서드를 실행할 때 함께 실행된다.

app.all('/secret', (req, res, next) => {
  console.log('Accessing the secret section ...');
  next(); 
});

라우트 경로

라우트 경로는 요청 메서드와의 조합을 통해 엔드포인트를 정의한다. 문자열, 문자열 패턴 또는 정규식을 사용할 수 있다. express는 라우트 경로의 일치를 위해 path-to-regexp를 사용한다.

라우트 핸들러

라우트 핸들러를 통해 미들웨어와 비슷하게 작동하는 여러 콜백 함수를 제공하여 요청을 처리할 수 있다. 이러한 콜백은 next('route')를 호출하여 나머지 라우트 콜백을 우회할 수도 있다.

하나의 콜백 함수는 하나의 라우트를 처리할 수 있으며, 아래와 같이 next()를 통해 2개 이상의 콜백함수를 하나의 라우트로 처리할 수도 있다.

app.get('/somthing', (req, res, next) => {
  console.log('do something...');
  next();
}, (req, res) => {
  res.send('Hello from somthing!');
});

또한 콜백 함수 배열은 하나의 라우트로 처리할 수 있다.

var cb0 = (req, res, next) => {
  console.log('CB0');
  next();
}

var cb1 = (req, res, next) => {
  console.log('CB1');
  next();
}

var cb2 = (req, res) => {
  res.send('Hello from somthing!');
}

app.get('/somthing', [cb0, cb1, cb2]);

위의 두 경우를 조합해서 독립적인 함수와 함수 배열을 하나의 라우트로 처리할 수 있다.

var cb0 = (req, res, next) => {
  console.log('CB0');
  next();
}

var cb1 = (req, res, next) => {
  console.log('CB1');
  next();
}

app.get('/somthing', [cb0, cb1], (req, res, next) => {
  console.log('do something...');
  next();
}, (req, res) => {
  res.send('Hello from somthing!');
});

응답 메서드

응답 오브젝트에 대한 메서드(res)는 클라이언트의 요청에 대한 응답을 전송하고, 요청-응답 주기를 종료할 수 있다. 아래 메서드 중 어느 하나도 호출되지 않을 경우 클라이언트 요청은 정지된 채 방치된다.

  • res.download(): 파일이 다운로드되도록 프롬포트
  • res.end(): 응답 프로세스 종료
  • res.json(): JSON 응답 전송
  • res.jsonp(): JSONP 지원을 통해 JSON 응답 전송
  • res.redirect(): 요청의 경로 재지정
  • res.render(): view template 렌더링
  • res.send(): 다양한 유형의 응답 전송
  • res.sendFile(): 파일을 octet-stream 형태로 전송
  • res.sendStatus(): 응답 상태 코드를 설정한 후 해당 코드를 문자열로 표현한 내용을 응답 본문으로 전송

app.route()

app.route() 사용시 라우트 경로에 대한 체인 가능한 라우트 핸들러를 작성할 수 있다. 아래와 같이 경로를 한 곳에 지정하여 중복성과 오타를 감소시킬 수 있다.

app.route('/user')
  .get((req, res) => { ... })
  .post((req, res) => { ... })
  .put((req, res) => { ... });

express.Router

express.Router 클래스를 사용하여 모듈식 마운팅 가능한 핸들러를 작성할 수 있다.(Router 인스턴스는 완전한 미들웨이자 라우팅 시스템으로 '미니 앱, mini-app'이라고도 한다.)

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => { ... });

router.post('/', (req, res) => { ... });

module.exports = router;
var userRouter = require('./user');
...
app.use('/user', userRouter);
profile
만들고 나누며, 세상을 이롭게 하고 싶습니다.

0개의 댓글