2023. 7. 4. 16:09ㆍ공부 중/Node.js
0. 참고자료
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
, search
및 connect
.
나. Route paths
라우트 경로는, request
메소드와의 조합을 통해, 요청이 이루어질 수 있는 엔드포인트를 정의합니다.
라우트 경로는 문자열, 문자열 패턴 또는 정규식일 수 있습니다.
Clean URL
간편 URL은 질의어(querystring) 없이, 경로만 가진 간단한 구조의 URL을 말한다.
- 사용하기 쉬움.
- 검색 엔진에 친화적임.
많은 사람들이 해당 방식을 더 선호한다.
다. 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" }
userId
와bookId
는 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 |