express 모듈

http 모듈에 여러 기능을 추가해 쉽게 사용할 수 있도록 만든 모듈이다.

[콘솔 입력 - express 4.X.X 버전 인스톨]

$ npm install express@4

[목차]

[꼭 알아둘 개념]

개념 설명
express 모듈 http 모듈처럼 사용할 수 있지만 훨씬 더 많은 기능이 있는 외부모듈
미들웨어 express 모듈 use() 메서드의 매개변수에 입력하는 함수를 지칭한다.
router 미들웨어 페이지 라우팅을 지원하는 미들웨어
static 미들웨어 지정한 폴더에 있는 내용을 모두 웹 서버 루트 폴더에 올리는 미들웨어
morgan 미들웨어 웹 요청이 들어왔을 때 로그를 출력
cookie parser 미들웨어 요청 쿠키를 추출
body parser 미들웨어 POST 요청 데이터 추출
connect-multiparty 미들웨어 multipart/form-data 인코딩 방식을 사용해 POST 요청 데이터를 추출
express-session 미들웨어 세션을 쉽게 생성할 수 있게 도와주는 미들웨어
RESTful 웹 서비스 일관된 웹 서비스 인터페이스 설계 기반의 REST 규정을 맞춰 만든 웹서비스

1. 기본 서버

// 모듈 추출
var express = require('express');

express 모듈로 서버를 생성하고 실행하는 코드는 기본 코드이기 때문에 반드시 숙지해야 한다.

[코드 1 - express 모듈을 사용한 서버 생성, 실행]

// 모듈 추출
var express = require('express');

// 서버 생성
var app = express();

// request 이벤트 리스너 설정
app.use(function (request, response) {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.end('<h1>Hello Express Module!!</h1>');
});

// 서버 실행
app.listen(8888, function () {
    console.log('서버가 시작되었습니다...8-1.server.js'); 
});

위의 코드는 다음과 같이 줄일 수 있다.

[코드 2 - express 모듈 사용한 서버 생성, 실행 축약]

var express = require('express');

express().use(function (request, response) {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.end('<h1>Hello Express Module!!</h1>');
}).listen(8888, function () { console.log('서버가 시작되었습니다...8-1.server.js'); });

보통 express 프레임워크는 http 모듈과 함께 서버를 실행한다. 그럴 땐 다음과 같은 코드를 자주 사용하므로 기억해둔다.

[코드 3 - 다른 서버 실행 방법]

var http = require('http');
var express = require('express');

// 서버 생성
var app = express();

// 서버 실행
http.createServer(app).listen(8888, function () { console.log('서버를 시작하였습니다...'); });

2. 기본 응답 메서드(response method)

express 모듈로 서버를 생성하면 request 객체와 response 객체에 다양한 기능이 추가된다.

[response 객체의 메서드]

메서드 이름 설명
response.send([body]) 매개변수의 자료형에 따라 적절한 형태로 응답한다. 매개변수의 자료형으로 문자열(HTML), 배열(JSON), 객체(JSON)를 가진다.
response.json([body]) JSON 형태로 응답한다.
response.jsonp([body]) JSONP 형태로 응답한다.
response.redirect([status,]path) 웹 페이지 경로를 강제로 이동한다.

2.1 send() 메서드

[코드 1 - send() 메서드 이용]

var express = require('express');

express().use(function (request, response) {
    // 데이터 생성
    var output = [];
    for (var i = 0; i < 3; i++) {
        // JSON 타입으로 데이터를 배열에 담는다.
        output.push({
            count: i,
            name: 'name - ' + i
        });
    }

    // 응답 로직 - 배열의 형태로 값을 담았기 때문에 JSON 형태로 브라우저에 보여준다.
    response.send(output);
}).listen(8888, function () { console.log('서버가 구동중입니다...send()'); });

[Web 실행 1 - send() 메서드 이용]

[{"count":0,"name":"name - 0"},{"count":1,"name":"name - 1"},{"count":2,"name":"name - 2"}]

2.2 status() 메서드

상태코드(Status Code)를 전달하고 싶으면 response.send() 메서드 앞에 status() 메서드를 사용한다.

[코드 2 - status() 메서드로 404 상태 코드 전달]

var express = require('express');

express().use(function (request, response) {
    // 응답 - 상태코드 404를 전달한다.
    response.status(404).send('<h1>404 Error!</h1>');
}).listen(8888, function () { console.log('서버 시작....status()'); });

XMLHttpRequest 객체로 Ajax 요청을 수행할 때 응답코드를 확인하면 적절한 처리를 할 수 있다.


3. 기본 요청 메서드(request method)

[request 객체의 속성, 메서드]

메서드/속성 이름 설명
params 라우팅 매개변수를 추출한다.
query 요청 매개변수를 추출한다.
headers 요청 헤더를 추출한다.
header() 요청 헤더의 속성을 지정하거나 추출한다.
accepts(type) 요청 헤더의 Accept 속성을 확인한다.
is(type) 요청 헤더의 Content-Type 속성을 확인한다.

3.1 header()

웹 브라우저로 HTTP 요청을 하면 반드시 User-Agent 속성이 따라온다. 이것을 추출해보자.

[코드 1 - header() 메서드로 User-Agent 속성 추출]

var express = require('express');

// 미들웨어 설정
express().use(function (request, response) {
    // User-Agent 속성 추출
    var agent = request.header('User-Agent');    // request.header(name : String)
    console.log(request.headers);                // request.headers -> 요청 헤더를 추출한다.(JSON)
    console.log(agent);    // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

    // 상태 코드만 보낼 때는 sendStatus() 메서드를 사용한다.
    response.sendStatus(200);
}).listen(8888, function () { console.log('서버 시작...'); });

[Console 실행 1 - header() 메서드로 User-Agent 속성 추출]

{ host: 'localhost:8888',
  connection: 'keep-alive',
  'cache-control': 'max-age=0',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4',
  cookie: 'csrftoken=FQp5k4KvZh6PugJvL86MU2EEt2p9dGcAwCp6ZWS2c40NdLI34tsz5zcvEHNURlyC; breakfast=toast; dinner=chicken; name=Jabba; region=seoul' }
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

헤더의 속성을 추출하면 웹 브라우저의 정보가 포함되어 있어 이에 따라 분기 처리를 할 수 있다.

[코드 2 - header() 메서드로 User-Agent 속성 추출 & 브라우저 체크]

var express = require('express');

express().use(function (request, response) {
    var agent = request.header('User-Agent');
    // 브라우저 구분 - agent 값을 소문자로 만든 후 비교한다.
    if (agent.toLowerCase().match(/chrome/)) {
        response.send('<h1>Hello Chrome..!</h1>');
    } else if (agent.toLowerCase().match(/safari/)) {
        response.send('<h1>Hello Safari..!</h1>');
    }
}).listen(8888, function () { console.log('서버를 구동합니다....브라우저 체크'); });

3.2 query 속성

query 속성을 이용하면 클라이언트가 url로 요청한 매개변수를 추출할 수 있다. 클라이언트가 http://localhost:8888/?name=rint&region=seoul로 요청했다고 가정하고 다음 코드를 살펴보자.

var express = require('express');

// 서버 생성 & 미들웨어 설정 
express().use(function (request, response, next) {
    // 변수 선언
    var name = request.query.name;          // 사용자 요청 쿼리 중 name 속성을 뽑아내 담는다.
    var region = request.query.region;      // 사용자 요청 쿼리 중 region 속성을 뽑아내 담는다.

    response.send('<h1>' + name + '-' + region + '</h1>');  // 웹 브라우저에 속성 값들을 출력한다.
}).listen(8888, function () { console.log('서버를 시작합니다... request.query'); });

4. 미들웨어(middleware) 개요

미들웨어는 요청에 대한 응답을 완료하기 전까지 중간에서 여러가지 일을 처리할 수 있다. express 모듈에서는 use() 메서드의 매개변수에 입력하는 함수를 미들웨어라고 한다.

미들웨어는 다양한 개발자가 배포하고 있다. 자세한 내용은 문서를 참고하자.

[코드 1 - 미들웨어 테스트]

var express = require('express');
var app = express();

// 미들웨어 1
app.use(function (request, response, next) {
    console.log('첫 번째 미들웨어');
    next();
});

// 미들웨어 2
app.use(function (request, response, next) {
    console.log('두 번째 미들웨어');
    next();
});

// 미들웨어 3
app.use(function (request, response, next) {
    console.log('세 번째 미들웨어');

    // 응답
    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.end('<h1>express Basic</h1>');
}).listen(8888, function () { console.log('서버를 실행합니다.... 미들웨어들'); });

[Console 실행 1 - 미들웨어 테스트]

서버를 실행합니다.... 미들웨어들
첫 번째 미들웨어
두 번째 미들웨어
세 번째 미들웨어

잠깐! 미들웨어는 왜 사용할까?

미들웨어에서 request, response 객체에 속성 또는 메서드를 추가할 수 있다. 이렇게 추가한 것들을 다른 미들웨어에서도 사용할 수 있다. 즉, 특정한 로직을 수행하는 모듈을 분리해서 만들 수 있다. 재사용도 당연히 가능하다.

[코드 2 - 미들웨어를 사용한 속성 추가]

var express = require('express');
var app = express();

// 미들웨어 1
app.use(function (request, response, next) {
    // 데이터 추가
    request.number = 52;
    response.number = 273;
    next();
});

// 미들웨어 2
app.use(function (request, response, next) {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.end('<h1>' + request.number + ':' + response.number + '</h1>');
}).listen(8888, function () { console.log('서버를 실행합니다.... 미들웨어 사용이유'); });

[Web 실행 2 - 미들웨어를 사용한 속성 추가]

52:273

5. router 미들웨어

express 모듈은 클라이언트 요청에 적절한 페이지를 제공하는 기술인 페이지 라우팅을 지원한다. express 모듈의 내부 모듈이기 때문에 따로 설치할 필요없다.

[페이지 라우팅을 위한 메서드]

메서드 이름 설명
get(path, callback[, callback ...]) GET 요청이 발생했을 때의 이벤트 리스너를 지정
post(path, callback[, callback ...]) POST 요청이 발생했을 ...
put(path, callback[, callback ...]) PUT 요청이 발생했을...
delete(path, callback[, callback ...]) DELETE 요청이 발생했을...
all(path, callback[, callback ...]) 모든 요청이 발생했을...

[코드 - 라우팅 매개변수 추출 (토큰 사용)]

var express = require('express');
var app = express();

// 라우터 설정
app.get('/page/:id', function (request, response) {
    var name = request.params.id;
    response.send('<h1>' + name + ' Page</h1>');
}).listen(8888, function () { console.log('서버를 시작합니다... get 라우터 토큰'); });

위의 코드는 http://localhost:8888/page/273로 접속하면 실행결과를 볼 수 있다.

[Web 실행 - 라우팅 매개변수 추출 (토큰 사용)]

273 Page

request 객체의 params .vs. query 속성 정리

속성 이름 설명
request.params /:id처럼 ':' 기호를 사용해 지정된 라우팅 매개변수 추출
request.query ?name=A와 같은 요청 매개변수 추출

6. static 미들웨어

static 미들웨어를 사용하면 지정한 폴더에 있는 내용을 모두 웹 서버 루트 폴더에 올려준다. 따라서 다음과 같이 img 태그를 생성해 이미지를 출력할 수 있다. express 모듈의 내부 모듈이기 때문에 따로 설치할 필요없다.

[코드 - static 미들웨어를 사용한 이미지 제공]

// 모듈 추출
var express = require('express');

// 서버 생성
var app = express();

// 미들웨어 설정
// 전역변수 __dirname을 사용해 폴더 위치를 지정하면 나머지는 express 모듈이 전부 알아서 처리해준다.
app.use(express.static(__dirname + '/public'));
app.use(function(request,response){
    response.writeHead(200, {'Content-Type':'text/html'});
    response.end('<img src="/fullimage1.jpg" width="100%" />');
});

// 서버 실행
app.listen(8888);

실행을 위해서는 서버 실행파일이 있는 폴더에 public 폴더를 생성한 후 fullimage1.jpg 파일을 위치시켜 놓아야 한다.


7. morgan 미들웨어

웹 요청이 들어왔을 때 로그를 출력하는 미들웨어이다. 외부 모듈이기 때문에 따로 설치해야 한다.

[콘솔 입력 - morgan 미들웨어 인스톨]

$ npm install morgan

[코드 - morgan 미들웨어]

var express = require('express');
var morgan = require('morgan');

// 서버 생성
var app = express();

// 미들웨어 설정
app.use(morgan('combined'));    // morgan() 메서드의 매개변수로 combined를 입력했다. 가장 기본적인 로그형식.
app.use(function(request,response){
    response.send('<h1>express Basic</h1>');
});

// 서버 실행
app.listen(8888);

원하는 토큰을 조합하면 다양한 로그를 확인할 수 있다.

[morgan 미들웨어의 토큰]

토큰 설명
:req[header] 요청 헤더
:res[header] 응답 헤더
:http-version HTTP 버전
:response-time 응답 시간
:remote-addr 원격 주소
:date[format] 요청 시간 요청 방식
:method
:url
:referrer
:User-Agent
:status

results matching ""

    No results matching ""