Node.js 구축하기

웹사이트를 만들기 전에 요청한 정보를 response해줄 서버가 필요합니다.
다양한 서버들이 존재하지만 저는 node.js 서버를 구축해보겠습니다!
console창을 통해서도 코드 작성이 가능하지만 1회성코드에 불과하기 때문에
에디터를 js파일로 저장하여 개발하는 것이 좋아요!

node.js는 이미 만들어진 모듈을 가지고 쉽게 구축할 수 있습니다.
모듈은 누군가 만들어좋은 소프트웨어 집합을 말하며, 내장모듈과 외장모듈로 나뉘어 지는데요.
외장모듈은 말그대로 외부에서 만들어진 모듈입니다. 지금 이 순간에도 다양한 모듈들이 만들어지고 있어요.
그래서 따로 설치하는 과정이 필요합니다.
반면, 내장모듈은 이미 node.js를 설치함과 동시에 생성된 모듈이기 때문에 따로 설치할 필요가 없습니다.

서버 구축할 파일디렉토리 생성

C드라이브 > koreaAcademy > node_workspace > webserver1
위와같이 파일을 생성하고
webserver1에서 서버를 구축해보도록 하겠습니다.

서버 구축하기

webserver1안에 main.js 파일을 생성하여 서버구축을 합니다.

1
var http = require("http");

http는 이미 존재하는 내장 모듈로, 위의 코드는 http모듈을 가져오는 과정입니다.
앞으로 계속 사용하기 위해 http라는 객체로 받습니다.

1
var server = http.createServer();

웹서버 객체를 생성합니다. 변수명은 마음대로 바꿔도 됩니다.

서버 가동

1
2
3
server.listen(7777,function(){
console.log("webserver is running at 7777")
});

웹서버를 가동합니다.
단, 다른 네트워크 프로그램과 구분하기 위해 포트번호(7777)를 부여합니다.
그리고 웹서버 가동과 동시에 익명함수가 호출되어 webserver is running at 7777이라는
문구가 콘솔창에 뜨는 것을 확인하고, 서버가동이 성공했음을 알 수 있습니다.

###클라이언트 요청 받아오기
서버 가동만 하지 말고 클라이언트의 요청을 받는 코드를 추가합니다.
서버 가동 전에 추가되어야 하겠죠.

1
2
3
4
server.on("request",function(request, response){
response.writeHead(200,{"ContentType":"text/html"}); //성공했다는 응답코드 200을 보내고
response.end("서버로부터 온 데이터"); //응답 문자열을 end메서드의 매개변수로 전달합니다.
});

on은 ~할때를 의미하는 이벤트 핸들러 기능을 합니다.
request가 들어오면 2번째 인수의 콜백함수가 실행됩니다.
request에는 클라이언트의 요청정보가 담겨있습니다. 예를 들어, url주소같은..!
response는 클라이언트에게 전송할 응답객체입니다. 이 객체를 이용하면
데이터 전송을 할 수 있습니다.

ContentType은 클라이언트가 브라우저로 들어오면 html형태로 응답해주어야 하기때문에 값으로 text/html을 줍니다.

콜백함수란 시스템에서 어떠한 이벤트가 발생하면 함수를 불러와 실행되는 것을 의미합니다.
원래는 함수를 정의해놓고 개발자가 호출하는 방식이었으나,
콜백함수는 개발자가 익명함수를 정의해놓고 어떠한 이벤트가 발생하면
시스템이 알아서 그 익명함수를 불러오는 방식입니다. 그러므로, 개발자는 언제 이 함수가
호출될 지 모르는 것이죠. 왜냐면 시스템에 의해서 호출되는 함수니까요!!

자, 이제 webserver1파일(서버) 안에 index.html을 만들고
클라이언트가 요청하면 불어오는 실습을 해볼게요.
아래는 index.html파일로, 이미지를 넣어봤어요.

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>메인페이지</title>
</head>
<body>
<img src="data:image/jpeg;base64,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"
</body>
</html>

이 상태에서 서버를 가동해도 파일을 불러올 수 없습니다.
특이하게도 node.js는 root디렉토리에 파일을 올려놓는 것만으로 끝나지 않습니다.
(tomcat같은경우는 root디렉토리에 파일을 올려두기만 해도 서버에서 불러올수있습니다. )

우리가 위에서 짠 코드 어디에서도 파일을 읽어들이는 부분이 없기 때문입니다.
node.js에는 특정파일을 읽어들이는 fs 모듈이 있습니다.
fs모듈을 객체로 받아옵니다.(객체명 변경가능)

1
var fs = require("fs"); //파일을 읽어들이는 객체, java의 filestring과 동일.

파일을 읽어들이는 것은 논리상 클라이언트로 부터 파일요청을 받은 이후에 실행되어야 합니다.
위의 server가동 뒤 콜백함수안에 파일을 읽어들이는 코드를 추가합니다.

1
2
3
4
5
6
7
8
server.on("request",function(request, response){
fs.readFile("index.html","utf-8",function(error, data){
response.writeHead(200,{"ContentType":"text/html"}); //이동!!
response.end(data); //이동!! 그리고 index.html을 읽어들인 data를 매개변수로 보낸다.
})
//response.writeHead(200,{"ContentType":"text/html"});
//response.end("서버로부터 온 데이터");
});

readFile메서드로 index.html파일을 읽어들인 후 콜백함수를 실행합니다.
여기서 콜백함수는 error와 data를 전달해줍니다. error와 data 이름은 바꿔도 상관없습니다.
data는 index.html를 담고 있습니다.

다시 서버를 재가동해봐서 확인해보면 브라우저에 우리가 만들었던 index.html파일이 제대로 뜨는 것을
확인하실 수 있습니다.
이러한 기능을 톰캣이나 아파치는 이미 내부에 존재하기 때문에 root 디렉토리에 넣어두기만 해도 파일을 읽어올 수 있습니다.

여기서 주목할 점이 하나 있습니다.
만약 클라이언트가 다른 페이지를 요청한다면 어떻게 될까요? 계속 index.html 파일만을 불러올 것입니다.
그럼 이제 ,webserver1파일안에 test.html이라는 새로운 파일을 생성해서 클라이언트의 요청에 따라
다른 파일을 불러오는 코드를 짜볼게요.
test.html은 바탕이 초록색인 파일입니다.

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body bgcolor="green">

</body>
</html>

main.js로 다시 돌아와 코드를 추가합니다.
클라이언트가 요청한 자원을 보여주기에 앞서먼저 url을 분석합니다.
그래야 해당 페이지를 보여줄 수 있습니다.
request.url과 같은 메서드는 node.js 공식홈페이지에 들어가면 찾아볼 수 있습니다.
홈페이지에 없으면..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server.on("request",function(request, response){
if(request.url == "/index.html"){
fs.readFile("index.html", "utf-8",function(error, data){
response.writeHead(200, {"ContentType":"text/html"}); //성공여부를 알려줌
response.end(data); //응답 문자열을 end()메서드의 매개변수로 전달
});
}
else if(request.url == "/test.html"){
fs.readFile("test.html", "utf-8",function(error, data){
response.writeHead(200, {"ContentType":"text/html"}); //성공여부를 알려줌
response.end(data); //응답 문자열을 end()메서드의 매개변수로 전달
});
}
}

request메시지의 url을 나타내는 request.url이 /index.html일때, /test.html 일때
요청한 파일을 읽어들여 response메시지에 담아 전달했습니다.

자.. 그렇다면 100개 , 1000개의 요청이 있을 때, 일일이 if문을 다 쳐야 할까요?
node.js에서는 express라는 외부모듈이 존재합니다.
이 모듈을 이용하면 기능의 개선뿐만 아니라 간단한 코드로 구현이 가능합니다.
단, 외부모듈이기 때문에 루트리렉토리인 webserver1에 설치를 해야합니다.

** npm이란? Node Packaged Manager의 약자로, node.js로 만들어진 package(module)들을 관리해주는 툴을 말합니다.

express모듈을 설치했으면 webserver1에 node_modules라는 파일이 생성된것을 볼 수 있습니다.
설치가 제대로 됐다는 것입니다.
이제 main.js에서 express를 객체로 받아옵니다.

1
var express = require("express");

그리고 express 생성자를 호출합니다.

1
var app = express(); //1

app이라는 객체로 받아옵니다.

여기서 중요한점!! 객체 app와 객체 http 중 종속적인 요소는 app이기 때문에
http서버를 업그레이드 시킨다는 의미로

1
var server = http.createServer(app);

위와 같이 기존의 코드를 바꿔줍니다.
이제, express의 지원을 받는 서버가 되었습니다.
논리상 1번이 먼저오고, 그 다음에 2번 줄이 와야 합니다.

express 모듈은 미들웨어라 불리는 각종 기능들을 지원하는데,
이 미들웨어를 호출할 때는 use()메서드를 사용합니다.

1
app.use(express.static(__dirname));

정적 자원들의 위치를 알려주는 static메서드를 사용하고
그리고 __dirname이라는 변수를 통해
지금 실행중인 파일의 디렉토리를 가져올 수 있습니다.

** __ 가 붙은 형태의 변수는 node.js의 전역변수입니다. 이미 개발자가 정해놓은 변수이다.

express로 업그레이드 하기 전에는 클라이언트의 요청을 받는 메서드가 server.on이었으나,
express에서도 요청을 처리하는 use라는 메서드가 지원됩니다.

기존과 동일한 기능을 하도록 구현해 보겠습니다.
만약 초록배경의 test.html을 가져오고 싶으면

1
2
3
4
5
6
app.use("/green", function(request, response){
fs.readFile("test.html","utf-8",function(error, data){
response.writeHead(200,{"ContentType":"text/html"});
response.end(data);
})
});

첫 번째 인수로 /green을 주었는데 이는 가상의 mapping, routing이라고 합니다.
즉, /green을 /chorok으로 바꿔도 똑같은 파일을 라우팅해주는 것입니다.

이제 server.on과 비슷한 express.use라는 것으로 간단하게, restful하게 바꿔보았습니다.

이번 포스팅은 nodejs서버 생성, 가동, 그리고 요청한 파일을 가상의 매핑을 통해 불러오는 것을 간단하게 실습해보았습니다.

Share