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®ion=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('서버가 시작되었습니다.'); });