http 모듈

HTTP(HyperText Transfer Protocol)는 TCP/IP를 기반으로 둔 프로토콜이다. HTML 페이지를 전달하는 데 사용하는 프로토콜이지만 다른 파일을 전송할 때도 많이 사용한다.

http 모듈은 Node.js의 가장 기본적인 웹 모듈이다. HTTP 웹 서버와 클라이언트를 생성하는 것과 관련된 모든 기능을 담당한다.

[목차]


1. server 객체

1.1 메서드(Method)

[serveer 객체 메서드]

메서드 이름 설명
server.listen(port[, callback]) 서버를 실행한다.
server.close([callback]) 서버를 종료한다.

[코드 1 - 웹 서버 생성, 실행]

var http = require('http');

// 웹 서버 생성
var server = http.createServer();

// 웹 서버 실행
// server.listen(port?:number, hostname?:string, backlog?:number, listeningListener:function)
server.listen(52273);

[코드 2 - server 객체의 close() 메서드]

// 모듈 추출과 동시에 서버 생성
var server = require('http').createServer();

// 서버 실행
server.listen(52273, function () {
    console.log('Server is Running at http://127.0.0.1:52273');
});

// 10초 후 함수 실행
var test = function() {
    // 서버 종료
    server.close();
};

// setTimeout(callback, timout?:any)
setTimeout(test, 10000);

[실행 2 - server 객체의 close() 메서드]

$ node main.js
Server is Running at http://127.0.0.1:52273
^C

1.2 이벤트(Event)

server 객체에서 중요한 것은 이벤트다. server 객체는 EventEmitter 객체를 기반으로 만들어졌다. 당연히 이벤트를 연결할 수 있는 것이다.

[server 객체의 이벤트]

이벤트 이름 설명
server.on('request', callback) 클라이언트가 요청할 때 발생하는 이벤트
server.on('connection', callback) 클라이언트가 접속할 때 발생하는 이벤트
server.on('close', callback) 서버가 종료될 때 발생하는 이벤트
server.on('checkContinue', callback) 클라이언트가 지속적인 연결을 하고 있을 때 발생하는 이벤트
server.on('upgrade', callback) 클라이언트가 HTTP 업그레이드를 요청할 때 발생하는 이벤트
server.on('clientError', callback) 클라이언트에서 오류가 발생할 때 발생하는 이벤트

[코드 2 - server 객체의 이벤트]

// server 객체 생성
const http = require('http');
const server = http.createServer();
server.listen(52273, function (code) {
    console.log("서버가 구동중입니다...");
});

// server 객체에 이벤트 연결
server.on('request', function (code) {
    console.log('클라이언트가 요청중입니다...');
});

server.on('connection', function (code) {
    console.log("클라이언트가 접속하였습니다...");
});

server.on('close', function (code) {
    console.log('서버가 종료되었습니다...');
});

터미널에서 코드 실행 후 웹브라우저에서 '[[[[http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에)](http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에))](http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에)](http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에](http://localhost:52273'에)))\) 접속하면 다음과 같은 log가 출력된다.

[실행 2 - server 객체의 이벤트]

$ node main.js
서버가 구동중입니다...
클라이언트가 접속하였습니다...
클라이언트가 요청중입니다...
^C

2. response 객체

클라이언트에 웹 페이지를 제공하려면 request 이벤트 리스너의 response 객체를 사용해 응답 메시지를 작성해야 한다.

[response 객체의 메서드]

메서드 이름 설명
response.writeHead(statusCode[, statusMessage][, headers]) 응답 헤더를 작성한다.
response.end([data][, encoding][, callback]) 응답 본문을 작성한다.

[코드 - createServer() 매개 변수를 이용한 짧은 코드 구현]

require('http').createServer(function (request, response) {
    response.writeHead(200, { 'content-Type':'text/html' });
    response.end('<h1>Hello World!</h1>');
}).listen(52273, function () {
    console.log('서버가 시작되었습니다...');
});

2.1 File System 모듈을 사용한 HTML 페이지 제공

매우 중요한 부분이니 반드시 숙지할 것!

[코드 1 - HTMLPage.html]

<!DOCTYPE html>
<html>
    <head>
        <title>Index</title>
    </head>
    <body>
        <h1>Hello Node.js</h1>
        <h2>Author. RintIanTta</h2>
        <hr />
        <p>Lorem ipsum dolor sit amet.</p>
    </body>
</html>

[코드 1 - 서버 생성 및 실행]

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

http.createServer(function (request, response) {
    // HTMLPage.html의 내용을 비동기식으로 읽어와 response.end(data)를 통해 클라이언트에게 뿌려준다.
    fs.readFile('HTMLPage.html', function (error, data) {
        response.writeHead(200, { 'Content-Type': 'text/html' });
        response.end(data);
    })
}).listen(52273, function () {
    console.log("로컬 서버(포트:52273)가 시작되었습니다...");
});

2.2 이미지와 음악 파일 제공

이미지와 음원 파일 모두 readFile() 메서드로 읽어온다. 특정 형식 파일을 클라이언트에게 제공할 때 가장 중요한 것은 응답 헤더의 Content-Type 속성이다.

Content-Type 속성은 MIME 형식을 입력한다. MIME 형식은 굉장히 많다. 추가적인 MIME 형식은 검색해보자.

응답 헤더 Content-Type 속성 파일 확장자
response.writeHead(200, {'Content-Type':'image/jpeg'}) jpeg, jpg 등의 이미지 파일 제공
response.writeHead(200, {'Content-Type':'audio/mp3'}) wav, mp3 등의 오디오 파일 제공

2.3 쿠키(Cookie)

키와 값이 들어있는 작은 데이터 조각이다. 다음과 같은 정보를 포함하고 있다.

  • 이름
  • 파기 날짜
  • 경로

[코드 - 쿠키 저장 및 출력]

require('http').createServer(function(request, response){
    // 변수 선언
    var date = new Date();
    date.setDate(date.getDate() + 7);

    // 쿠키 입력
    response.writeHead(200, {
        'Content-Type':'text/html',
        'Set-Cookie': [
            'breakfast = toast;Expires = ' + date.toUTCString(),
            'dinner = chicken'
        ]
    });

    // 쿠키 출력
    response.end('<h1>' + request.headers.cookie + '</h1>');
}).listen(52273, function(){
    console.log("서버가 시작되었습니다... 포트번호:52273");
});

2.4 페이지 강제 이동

응답 헤더의 Location 속성을 사용해 웹 페이지를 강제로 이동시킨다.

[코드 1 - Location 속성을 사용한 페이지 강제 이동]

require('http').createServer(function(request, response){
    // http 응답코드 302 : 다른 페이지로 이동하지만, 나중에 바뀔 수 있음.
    response.writeHead(302, { 'Location':'http://heythisway.kr'});
    response.end();
}).listen(52273, function(){
    console.log("서버가 시작되었습니다... 포트번호:52273");
});

[코드 2 - HTTP 404 Page Not Found]

require('http').createServer(function(request, response){
    response.writeHead(404);
    response.end()
}).listen(52273, function(){
    console.log("서버가 시작되었습니다... 포트번호:52273");
});

[HTTP Status Code 대표 예시]

HTTP Status Code 설명 예시
1XX 처리 중 100 Continue
2XX 성공 200 OK
3XX 리다이렉트 300 Multiple Choices
4XX 클라이언트 오류 400 Bad Request
5XX 서버 오류 500 Internal Server Error

3. request 객체

[request 객체 속성]

속성 이름 설명
method 클라이언트의 요청 방식을 나타낸다.
url 클라이언트가 요청한 URL을 나타낸다.
headers 요청 메시지 헤더를 나타낸다.
trailers 요청 메시지 트레일러를 나타낸다.
httpVersion HTTP 프로토콜 버전을 나타낸다.

3.1 url 속성을 사용한 페이지 구분

request의 url 경로를 변수에 담은 후 if문에 따라 분기하여 처리한다.

[코드 - url 속성을 사용한 페이지 구분]

// 모듈 추출
var http = require('http')
var fs = require('fs')
var url = require('url')

// 서버 생성 및 실행
http.createServer(function(request, response){
    // 변수 선언 (경로 주소값을 담는다.)
    var pathname = url.parse(request.url).pathname;

    // 페이지 구분
    if (pathname == '/') {      // index.html 일때
        // Index.html 파일을 읽는다.
        fs.readFile('Index.html', function (error, data){
            // 응답한다.
            response.writeHead(200, { 'Content-Type':'text/html' });
            response.end(data);
        });
    } else if (pathname == '/OtherPage.html') {  // OtherPage.html 일때
        // OtherPage.html 파일을 읽는다.
        fs.readFile('OtherPage.html', function (error, data){
            response.writeHead(200, { 'Content-Type':'text/html' });
            response.end(data);
        });
    }
}).listen(52273, function(){
    console.log("서버 구동중입니다. 포트번호:52273");
});

3.2 method 속성을 사용한 페이지 구분

request의 method 속성에 따른 if문 분기로 로직을 처리한다.

  • GET
  • POST
  • PUT
  • DELETE

[코드 - method 속성을 사용한 페이지 구분]

require('http').createServer(function (request, response) {
    if (request.method == 'GET') {
        console.log('GET 요청입니다.')
    } else if (request.method == 'POST') {
        console.log('POST 요청입니다.')
    }
}).listen(52273, function () {
    console.log("서버가 시작되었습니다... 포트번호:52273");
});

[실행 - method 속성을 사용한 페이지 구분]

$ node main.js 
서버가 시작되었습니다... 포트번호:52273
GET 요청입니다.

3.3 GET 요청 매개변수 추출

var query = url.parse(request.url, true).query

클라이언트의 GET 요청시에는 보통 html 문서를 보여주면 된다.

[코드 - GET 요청 매개변수 추출]

var http = require('http')
var url = require('url')

http.createServer(function (request, response) {
    // GET 요청 매개변수 추출
    var query = url.parse(request.url, true).query;

    // GET 요청 매개변수 출력
    response.writeHead(200, { 'Content-Type': 'text/html' });
    // JSON -> JavaScript 값을 JSON (JavaScript Object Notation) 형식으로 변환하는 함수를 제공하는 내장 개체이다.
    response.end('<h1>' + JSON.stringify(query) + '</h1>');    // 브라우저에 JSON 출력
    console.log(JSON.stringify(query));                        // 콘솔창에 JSON 출력
}).listen(52273, function () {
    console.log('서버를 구동중입니다... 포트번호:52273');
});

서버를 구동시키고 브라우저에 http://localhost:52273/?name=jabba&region=Seoul로 이동하면 웹브라우저 화면에 다음과 같은 화면이 출력된다.

[실행 - GET 요청 매개변수 추출]

{"name":"jabba","region":"Seoul"}

3.4 POST 요청 매개변수 추출

POST 방식은 request 이벤트가 발생한 후 request 객체의 data 이벤트로 데이터가 전달된다. 클라이언트의 POST 방식의 요청시에는 매개변수(값)을 추출해 내부 로직을 처리한다. 그 후 값을 다시 리턴해주면 된다.

[코드 - POST 요청 데이터 추출]

var http = require('http')

http.createServer(function (request, response) {
    // 'data'이벤트에 연결한 후 콜백 함수를 통해 로직을 실행한다.
    request.on('data', function (data) {
        console.log('POST Data:' + data);
    });
}).listen(52273, function () { console.log('서버가 시작되었습니다...') });

3.5 쿠키 추출

쿠키는 request 객체의 headers 속성 안 cookie 속성에서 추출할 수 있다.

// 쿠키를 추출한다.
var cookie = request.headers.cookie;

[코드 - 쿠키 생성 및 추출]

require('http').createServer(function (request, response) {
    // 쿠키를 추출한다.
    var cookie = request.headers.cookie;

    // 쿠키를 설정한다.
    response.writeHead(200, {
        'Content-Type': 'text/html',
        'Set-Cookie': ['name=Jabba', 'region=seoul']
    });

    // 응답한다.
    response.end('<h1>' + JSON.stringify(cookie) + '</h1>');
}).listen(52273, function () { console.log('서버를 시작합니다...') });

[코드 2 - 문자열인 쿠키를 분해해 객체의 배열로 생성]

require('http').createServer(function (request, response) {
    var cookie = request.headers.cookie;
    // 요청한 클라이언트에게 쿠키가 있는지 확인
    if (cookie) {
        // 쿠키를 추출하고 분해한다.
        // 쿠키의 값은 "name=Jabba; region=seoul" 방식이다.
        var cookie = cookie.split(';').map(function (element) {
            var element = element.split('=');
            return { key: element[0], value: element[1] };
        });

        // 응답한다.
        response.end('<h1>' + JSON.stringify(cookie)+'</h1>');
    // 클라이언트에게 쿠키가 없다면 쿠키를 생성한다.
    } else {
        response.writeHead(200, {
            'Content-Type':'text/html',
            'Set-Cookie':['name=Jabba','region=Seoule']
        });
        // 응답한다.
        response.end('<h1> 쿠키를 구웠습니다. </h1>');
    }
}).listen(52273, function () { console.log('서버가 시작되었습니다.'); });

results matching ""

    No results matching ""