Routing
-
Routing
- 라우팅은 URI(또는 경로) 및 특정한 HTTP 요청 메소드인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것을 말한다.
(# URI : Uniform Resource Identifier, 자원을 식별하고 위치를 지정해주는 문자열이다. URL과 비교하여 공부 후 포스팅할 계획이다.)- express framework에서 라우트는 아래와 같은 형식으로 정의된다.app.METHOD(PATH, HANDLER)
app은 express의 인스턴스, METHOD는 HTTP의 요청 메소드(ex// get, post), PATH는 서버에서의 경로, 마지막으로 HANDLER에는 라우트가 일치할 때 실행될 기능이 위치한다. -
route method
- express framework에서 라우트는 다음과 같은 라우팅 메소드를 지원한다.
(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.)- 아래는 자주 사용하는 5가지 메소드를 정리한 것이다. 한 주소가 여러 메소드를 갖을 수 있고, 메소드와 주소를 확인함으로써 요청 내용을 더 명확하게 보여준다는 장점이 있다.GET : 서버 자원을 가져올 때 사용. response의 body에 데이터를 넣지않고, 데이터를 서버로 보내야한다면 쿼리 스트링 사용.## Get / Post : 웹서버에 get 방식 요청과 post 방식 요청은 모두 요청 정보를 보낸다는 점에서 같지만 get 방식은 header 부분에, post방식은 body 부분에 정보를 담아 요청 정보를 송신한다. 보안의 문제가 있거나 파일 업로드 시에는 post 방식을 주로 사용하고, 이는 이후 '게시판 만들기'를 포스팅하면서 더 명확히 공부할 생각이다.
POST : 서버에 자원을 새로 등록 할 때 사용. response의 body에 새로 등록할 데이터를 넣어 보냄.
PUT : 서버 자원을 response에 들어있는 자원으로 치환할 때 사용. response의 body에 치환할 데이터를 넣어 보냄.
PATCH : 서버 자원을 일부 수정할 때 사용. response의 body에 수정 데이터를 넣어 보냄.
Delite : 서버 자원을 삭제하고자 할 때 사용. -
response Method
- 라우터에서는 반드시 요청에 대한 응답을 하거나 에러 핸들러를 통해 요청을 넘겨야한다. 응답을 보내지 않으면 클라이언트 요청은 정지된 채로 방치된다.- 다음 표의 응답 메소드로 응답을 보내고, 요청/ 응답 주기를 종료할 수 있다.
> express API _ response Methodres.download() 파일이 다운로드되도록 프롬프트. res.end() 응답 프로세스를 종료. res.json() JSON 데이터를 전송. res.jsonp() JSONP 지원을 통해 JSON 데이터를 전송. res.redirect() 요청의 경로를 재지정. 응답을 다른 라우터로 전환. es.render() 템플릿 엔진을 렌더링. res.send() 버퍼 데이터나 문자열, HTML 코드나 JSON 데이터 등 여러 유형의 응답을 전송. res.sendFile 파일 자체를 응답으로 전송. res.sendStatus() 응답 상태 코드를 설정한 후 해당 코드를 문자열로 전송. -
Example _
- 다음 예제는 기본 index에 목록을 누르면 관련 주소를 요청하고 그 주소에 맞게 미들웨어를 호출하여 페이지를 출력한다."app.js" var express = require('express'); var app =express(); app.get('/', function(req, res){ res.write(' Hello world!!
') res.write('node.js'); res.write('
express.js'); res.end(); }); app.get('/node.js', function(req, res){ res.write('node.js!!
'); res.end(); }); app.get('/express.js', function(req, res){ res.end('express.js!!
'); }); app.listen(3000, function(){ console.log("listen _ port:3000") });- 객체 app은 listen 메소드로 포트 3000에서 클라이언트의 요청을 대기한다. 클라이언트에서 요청한 주소에 따라 '/'이면 HelloWorld와 node.js , express.js를 res.write로 body에 담아 응답하고 res.end에 의해 응답 프로세스를 종료한다.- 클라이언트에서 요청한 주소가 '/node.js'라면 res.write로 body에 데이터를 담아 응답하고 res.end를 호출하여 응답 프로세스를 종료하고, '/express.js'라면 write 없이 바로 res.end를 호출하여 express.js 데이터를 응답 후 바로 프로세스를 종료한다.- 만약 end가 없이 write 함수로만 호출하면 응답 프로세스가 종료되지 못하고 페이지는 무한 로딩한다. -
Example _ router modulation
- 위 예제를 라우터를 모듈화함으로써 다음처럼 깔끔하게 라우팅을 관리할 수 있다."app.js" var express = require('express'); var app =express(); var indexRouter = require('./routes/index'); var nodeRouter = require('./routes/node'); var expressRouter = require('./routes/express') app.use('/', indexRouter); app.use('/node.js',nodeRouter); app.use('/express.js',expressRouter); app.listen(3000, function(){ console.log("listen _ port:3000") }); "/routes/index.js" var express = require('express'); var router = express.Router(); router.get('/',function(req,res,next){ res.write(' Hello world!!
') res.write('node.js'); res.write('
express.js'); res.end(); }); module.exports = router;- app.js에서는 주소에 따른 use 메소드의 미들웨어로 require한 라우터 모듈을 대입하여 응답할 내용에 관해서는 신경쓰지 않을 수 있게 되고 응답의 측면에서는 해당 주소의 파일만 관리해주면 되므로 유지보수에 더 유리해진다. -
Example _ next('route')
- route handler의 call back function은 다른 미들웨어와 다르게 next('route')를 호출하여 현재 라우터에서 더 이상 진행이 무의미한 기능을 우회하고 다음 라우터로 넘어가도록 할 수 있다.- 아래는 private page를 요청했을 때 현재 로그인 상태를 확인하고 로그인 페이지를 우회하여 바로 private page를 응답하도록 next('route')를 호출하는 예제이다. check 변수는 로그인 유무, console 출력은 서버의 응답을 간단히 표시하기 위해 사용하였다."private page.js" var express = require('express'); var app = express(); var check = true; var checkLog = function(req, res, next){ console.log('check log-in'); if(check) next('route'); next(); }; var login = function(req, res, next){ console.log('please log-in'); next(); }; var private = function(req, res, next){ console.log('private page'); next(); }; app.get('/', checkLog, login); app.get('/',private); app.listen(3000); - check의 상태가 true기 때문에 console은 로그인 페이지 출력을 우회하여 'check log-in' -> 'private page'를 출력한다.