[NodeJS] Express.js - 라우팅

2017. 12. 5. 13:57JavaScript/NodeJS

Express.js의 라우팅은 URI(경로), HTTP 요청 Method(GET, POST 등)의 특정 엔드포인트에 대한 클라이언트 요청에 응답하는 방법을 결정하는 것을 말합니다.



라우트 Method 설정


라우터의 기본 구조는 다음과 같습니다.


app.method(path, handler)

    • method - HTTP 요청 Method
    • path - 엔드포인트 경로
    • handler - 클라이언트 접속 시 실행 되는 함수


위의 구조를 보듯이 각 메소드 별로 처리 라우터를 지정할 수 있다.


1. GET 방식 호출


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



2. POST 방식 호출


1
2
3
app.post('/', (req, res) => {
  res.send('Got a POST request');
});



3. PUT 방식 호출


1
2
3
app.put('/user', (req, res) => {
  res.send('Got a PUT request at /user');
});



4. DELETE 방식 호출


1
2
3
app.delete('/user', (req, res) => {
  res.send('Got a DELETE request at /user');
});



5. 모든 Method 접근 허용


1
2
3
app.all('/', (req, res) => {
  console.log('All Method request ...');
});




라우트 경로 설정


라우트 경로는 문자열 또는 문자열 패턴 그리고 정규식으로 지정할 수 있습니다.



1. 문자열


기본은 위의 예제와 같이


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





이렇게 호출 됩니다.


/about 에 접근하자 할 경우에는 다음과 같이 작성을 하면 됩니다.


1
2
3
app.get('/about', (req, res) => {
  res.send('about');
});




2. 문자열 패턴


다음 예제는 경로가 /abcd 또는 /acd 에 접근이 가능하도록 합니다.


1
2
3
app.get('/ab?cd', (req, res) => {
  res.send('ab?cd');
});



다음 예제는 /abcd 또는 /abbbbbbcd 등의 경로에 접근이 가능하도록 합니다. 


1
2
3
app.get('/ab+cd', (req, res) => {
  res.send('ab+cd');
});



다음 예제는 /abcd 또는 /ab123cd 등과 같이 ab와 cd 사이에 어떠한 문자가 와도 접근이 가능하도록 합니다.


1
2
3
app.get('/ab*cd', (req, res) => {
  res.send('ab*cd');
});



3. 정규식


다음은 예제는 a가 포함된 모든 경로에 접근하도록 합니다.


1
2
3
app.get(/a/, (req, res) => {
  res.send('/a/');
});


다음 예제는 fly로 끝나는 경로에 접근이 가능하도록 합니다.


1
2
3
app.get(/.*fly$/, (req, res) => {
  res.send('/.*fly$/');
});





라우트 핸들러(Callback 함수)


라우팅 핸들러는 하나 이상으로 설정이 가능합니다.


1
2
3
app.get('/example', (req, res) => {
  res.send('Hello from A!');
});



위와 같이 라우터 핸들러를 하나만 가지는걸 기본으로 하지만 다음과 같이 1개 이상의 라우터 핸들러를 처리할 수도 있습니다. 그러기 위해서는 next() 를 반드시 호출해 줘야 합니다. 


1
2
3
4
5
6
app.get('/example'function (req, res, next) {
  console.log('the response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from B!');
});


위와 같이 next를 사용하면 다음 핸들러를 호출할 수 있습니다.


또한 함수들을 만들어서 배열 형태로 라우트 처리를 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}
 
var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}
 
var cb2 = function (req, res) {
  res.send('Hello from C!');
}
 
app.get('/example', [cb0, cb1, cb2]);



Console 결과는 다음과 같습니다.


1
2
3
CB0
CB1
Hello from C!






app.route()


라우트 경로에 대한 체인이 가능하도록 작성이 가능합니다.


정의된 체인 라우트 핸들러는 다음과 같이 사용합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
app.route("/chain")
    .all((req, res, next) => {
        console.log('Time: 'Date.now());
        next();
    })
    .get((req, res) => {
        console.log("GET call~");
        res.send("LIST BOOK~~~~");
    })
    .post((req, res) => {
        console.log("POST call~");
        res.send("INSERT BOOK~~~~");
    })
    .put((req, res) => {
        console.log("PUT call~");
        res.send("UPDATE BOOK~~~~");
    })
    .delete((req, res) => {
        console.log("DELETE call~");
        res.send("DELETE BOOK~~~~");
    });





express.Router


express.Router을 사용하면 모듈식 라우트 핸들러를 작성할 수 있습니다.


express.Router로 작성은 Java 웹프로그램으로 따졌을 때 Controller과 비슷하다(??) 라고 할 수 있을 듯하네요.


위의 chain route를 기준으로 모듈 작성은 다음과 같이 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const express = require("express");
const router = express.Router();
 
router.route("/")
    .all((req, res, next) => {
        console.log('Time: 'Date.now());
        next();
    })
    .get((req, res) => {
        console.log("GET call~");
        res.send("LIST BOOK~~~~");
    })
    .post((req, res) => {
        console.log("POST call~");
        res.send("INSERT BOOK~~~~");
    })
    .put((req, res) => {
        console.log("PUT call~");
        res.send("UPDATE BOOK~~~~");
    })
    .delete((req, res) => {
        console.log("DELETE call~");
        res.send("DELETE BOOK~~~~");
    });
 
module.exports = router;



이렇게 모듈을 생성을 하고 app메서는 다음과 같이 로딩합니다.


1
2
3
4
5
6
7
8
9
10
const express = require("express");
const app = express();
 
const chain = require("./chain");
 
app.use("/chain", chain);
 
app.listen(3000, () => {
    console.log( "Express Server port 3000");
});


그리고 최종적으로 브라우저에서 확인을 해보면 결과를 확인할 수 있습니다.



'JavaScript > NodeJS' 카테고리의 다른 글

[NodeJS] Express.js - Hello World!!!  (0) 2017.12.05
[NodeJS] Express.js 시작  (0) 2017.12.05
[NodeJS] 서버 만들기(HTTP Server) - 2  (0) 2017.11.28
[NodeJS] 서버 만들기(HTTP Server) - 1  (0) 2017.11.27
[NodeJS] File System  (0) 2017.11.16