[Express] Routing

2023. 7. 4. 16:09공부 중/Node.js

0. 참고자료

 

 

Express 라우팅

라우팅 라우팅은 애플리케이션 엔드 포인트(URI)의 정의, 그리고 URI가 클라이언트 요청에 응답하는 방식을 말합니다. 라우팅에 대한 소개는 기본 라우팅을 참조하십시오. 다음 코드는 매우 기본

expressjs.com

 

 

홈페이지 구현 - 생활코딩

수업소개 Express의 Route 기능을 중심으로 홈페이지 기능을 구현해보겠습니다.  강의 소스코드 main.js (변경사항) var express = require('express') var app = express() var fs = require('fs'); var template = require('./lib/te

opentutorials.org

 


1. 라우팅

 

라우트(route)는 자원을 식별하는 URL의 일부입니다.

 

예를 들면, http://foo.com/products/id에서 /products/id가 라우트입니다.

 

라우팅은 애플리케이션 엔드 포인트(URI)의 정의, 그리고 URI가 클라이언트 요청에 응답하는 방식을 말합니다.

 

가. Route method

// GET method route
app.get('/', function (req, res) {
  res.send('GET request to the homepage');
});

// POST method route
app.post('/', function (req, res) {
  res.send('POST request to the homepage');
});

Express는 HTTP 메서드에 해당하는 다음과 같은 라우팅 메서드를 지원합니다.

get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, searchconnect.

 


나. Route paths

 

라우트 경로는, request 메소드와의 조합을 통해, 요청이 이루어질 수 있는 엔드포인트를 정의합니다.

 

라우트 경로는 문자열, 문자열 패턴 또는 정규식일 수 있습니다.

 

Clean URL

 

간편 URL은 질의어(querystring) 없이, 경로만 가진 간단한 구조의 URL을 말한다.

 

  1. 사용하기 쉬움.
  2. 검색 엔진에 친화적임.

많은 사람들이 해당 방식을 더 선호한다.

 


다. Route parameters

 

Express를 사용하기 전에는 사용자의 입력 데이터를 전달하기 위해서 쿼리 스트링을 사용했다.

 

하지만 Clean url을 사용하면 부가적인 정보를 전달하기 어렵다.

 

그래서 express에선 다음과 같은 방식으로 사용자의 입력 데이터를 전달받는다.

 

app.get('/users/:userId/books/:bookId', (req, res) => {
  res.send(req.params)
})
Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }
  • userIdbookId는 route parameters로 서버에서 파싱 되어 req.params을 통해서 접근할 수 있다.

이전처럼 여러 모듈을 이용해서 복잡하게 파싱할 필요가 없다.

 

쉽게 사용자의 입력 정보를 획득할 수 있게 되었다.

 


라. Route handlers

 

request에 대응하기 위하여 여러 콜백 함수를 사용할 수 있다.(처리 방식이 미들웨어와 비슷함)

 

유일한 차이점은 이러한 콜백은 next(’route’)를 호출하여 나머지 라우트 콜백들을 우회할 수 있다는 점이다.

 

이러한 메커니즘을 이용하면 라우트에 대한 사전 조건을 지정한 후, 현재의 라우트를 계속할 이유가 없는 경우에는 제어를 후속 라우트에 전달할 수 있다.

 

라우트 핸들러는 함수나 함수 배열의 형태 또는 둘을 조합한 형태일 수 있다.

 

  • A single callback function can handle a route. For example:
app.get('/example/a', (req, res) => {
  res.send('Hello from A!')
})

 

  • More than one callback function can handle a route (make sure you specify the next object). For example:
app.get('/example/b', (req, res, next) => {
  console.log('the response will be sent by the next function ...')
  next()
}, (req, res) => {
  res.send('Hello from B!')
})

 

  • An array of callback functions can handle a route. For example:
const cb0 = function (req, res, next) {
  console.log('CB0')
  next()
}

const cb1 = function (req, res, next) {
  console.log('CB1')
  next()
}

const cb2 = function (req, res) {
  res.send('Hello from C!')
}

app.get('/example/c', [cb0, cb1, cb2])

 

  • A combination of independent functions and arrays of functions can handle a route. For example:
const cb0 = function (req, res, next) {
  console.log('CB0')
  next()
}

const cb1 = function (req, res, next) {
  console.log('CB1')
  next()
}

app.get('/example/d', [cb0, cb1], (req, res, next) => {
  console.log('the response will be sent by the next function ...')
  next()
}, (req, res) => {
  res.send('Hello from D!')
})

 


마. Response methods

 

다음 표에 표시된 응답 오브젝트에 대한 메소드(res)는 응답을 클라이언트로 전송하고 요청-응답 주기를 종료할 수 있습니다.

 

라우트 핸들러로부터 다음 메서드 중 어느 하나도 호출되지 않는 경우, 클라이언트 요청은 정지된 채로 방치됩니다.

 

메소드 설명
res.download() 파일이 다운로드되도록 프롬프트합니다.
res.end() 응답 프로세스를 종료합니다.
res.jsonp() JSONP 지원을 통해 JSON 응답을 전송합니다.
res.redirect() 요청의 경로를 재지정합니다.
res.render() 보기 템플리트를 렌더링합니다.
res.send() 다양한 유형의 응답을 전송합니다.
res.sendFile() 파일을 옥텟 스트림의 형태로 전송합니다. (옥텟은 바이트 정도로 이해하자)
res.sendStatus() 응답 상태 코드를 설정한 후 해당 코드를 문자열로 표현한 내용을 응답 본문으로서 전송합니다.

 


바. app.route()

 

app.route()를 이용하면 라우트 경로에 대하여 더 간결한 라우트 핸들러를 작성할 수 있다.

 

경로는 한 곳에 지정되어 있으므로, 모듈식 라우트를 작성하면 중복성과 오타가 감소하여 도움이 된다.

 

app.route()를 사용하여 정의된 체인 라우트 핸들러의 예:

app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });

보기 좋다.

 


사. express.Router

 

위의 방법마저도 복잡하다고 생각 느낄 수 있다.

 

특히 프로젝트의 크기가 커지고 url이 복잡해지면 라우터가 계층을 이루게 된다. (just like if문 중첩)

 

그때 app.route로 모든 라우팅을 처리하는 것이 아니라 여러 개의 작은 라우터를 만든다.

 

요청에 따라 적합한 라우터를 호출해서 처리할 수 있다.

 

express.Router 클래스를 사용하면 모듈식 마운팅 가능한 핸들러를 작성할 수 있다.

 

Router 인스턴스는 완전한 미들웨어이자 라우팅 시스템이며, 따라서 “미니 앱(mini-app)”이라고 불리는 경우가 많다.

 

다음 예에서는 라우터를 모듈로서 작성하고, 라우터 모듈에서 미들웨어 함수를 로드하고, 몇몇 라우트를 정의하고, 기본 앱의 한 경로에 라우터 모듈을 마운트 합니다.

 

다음의 내용이 입력된 birds.js라는 이름의 라우터 파일을 앱 디렉터리에 작성하십시오.

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

// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// define the home page route
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// define the about route
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

 

이후 앱 내에서 다음과 같이 라우터 모듈을 로드하십시오.

 

var birds = require('./birds');
...
app.use('/birds', birds);

 

앱은 이제 /birds/birds/about에 대한 요청을 처리할 수 있게 되었으며, 해당 라우트에 대한 특정한 미들웨어 함수인 timeLog를 호출할 것입니다.

 


'공부 중 > Node.js' 카테고리의 다른 글

[Express] 미들웨어 사용  (0) 2023.07.05
[Express] CRUD 수정  (0) 2023.07.04
[Express] 시작하기  (0) 2023.07.04
[Node.js] .env 파일 사용하기  (0) 2023.07.04
[Node.js] 모듈로 정리정돈  (0) 2023.04.01