2. 무엇을 해 나아갈 것인가?!
1. Node.js 알아보자!
2. Node.js 로 만들어보자!
1. 맛을 보면 압니다!
2. 알기 위해 맛을 봐야지!
3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
4. ….
3. Node.js 로 구축해보자!
4. Node.js 로 적용해보자!
• 웹개발을 하기 위해서 web application structure 를 한번 살짝 다듬어 보기로 합시다요.
• 우리의 목적을 잃어버리지 않기 위해서 조금만 더 발을 딛여 나아가보도록 하죠..
4. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
지난번까지 해서 작성된 server.js 이구요…
여전히 우리의 server 는 이벤트!가 발생될때 request, response 라는 Object!!를 인자로 받는 onRequest() 라는 아주 맛깔나는(?)
callback 함수를 열심히 비동기로 호출하면서 밥벌이를 하고 있습니다.
var http = require("http");
function onRequest(request, response){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
var server = http.createServer(onRequest);
server.listen(8888);
근데 맨 위에 “http” 라는 녀석의 정체를 뜬금없이 한 번 알아보고 넘어가 봐야할듯요;;;
뭘까요? 우리가 깔아놓은 Node.js 의 내부 모듈이랍니다. 이미 사용하도록 작성 되어 있네요.
네.. 쩜(.) 찍어서 만들어져 있는 메소드 “createServer()” 를 잘 쓰고 있어요.
멋들어진 구조의 app를 만들기 위해 저는 이 server.js 가 하고 있는 비즈니스를 또 하나의 모듈로 만들겠습니다.
(비즈니스.. 쉽게 말하면 http 서버를 여는 비즈니스를 하고 있지요?)
server 라는 모듈에 “서버여요청에응답을시작하라!()”라는 메소드를 만들어서 쩜 찍어서 불러와 쓰겠습니다.
5. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
멋들어지게 부드럽게 감싸 줄꺼에요..(살살)
var http = require("http");
function start() {
function onRequest(request, response){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
var server = http.createServer(onRequest);
server.listen(8888);
console.log("Server has started.");
}
exports.start = start;
start() 라는 이름의 함수로 한번 감싸줬습니다.
그리고 나서 exports.start = start;
뭔가를 꼭 내보내는 듯한 느낌의 코드를 하나 남겼어요.
저렇게 씀으로써 우린 이런 짓거리를 할 수 있게 됩니다.
바로…
6. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
짠~ 이렇게요… ㅇㅅㅇv
index.js 라는 이름의 뭔가 새로운 구조적인 모듈을 하나 생성하기를…
var server = require(“./server");
server.start();
Node.js 의 기본 내장 모듈이 아니더라도 이렇게 만들어서 쓰면 그만~인 거죠;;;
이제 서버 시작 시킬때 “node index.js” 하면 그 전과 똑같은 걸 확인 할 수 있죠..
(생~~~략!!!)
자!!! 이 만큼(아주 기초적이지만..) 어떤 구조를 쪼개고, 분리하고, 따로 빼고(다 같은말이잖소?!!) 하는 방법을 알아놨으면…
이제 우리가 웹으로 수행해야 할!!, 우리가 만들어야 할 테스크, 비즈니스, 뭔가 로직…(왜 그러는데?!!)에 대하여 한 번 생각해봅시다.
일 하나만 할 것 아니죠?
웹페이지 하나만 딸랑~ 띄울 거 아니죠?
Web app 는 여러가지 요청(http request)을 받아서 알맞게 처리를 하죠…
클라이언트는 이 여러가지 요청을 기본적으로 web app 서버에 URL 로 던지죠…
“다른 HTTP 요청이 코드의 다른 부분을 가리키도록 하는
것을 “라우팅(routing)” 이라고 합니다. ”
이렇게 얘기하고 있습니다. (구뤠.. 그렇다능.. 그렇다면…)
7. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
그렇다면 클라이언트가 요청한 URL을 뭔가로 구분을 해야 각각의 요청에 맞는 비즈니스를 할 수 있겠죠.
그렇게 routing 을 하기 위한 뭔가를 만들어줘야 할텐데…
위대하신 Node 의 신께서, 말 그대로 “url”이라는 이름의 내장 모듈을 내려 주셨으니…
server.js 를 잠깐 다시 열어서 url 판별 코드를 심어보겠습니다.
var http = require("http");
var url = require("url"); //내장 모듈 url을 쓰기위해 require 했습니다.
function start() {
function onRequest(request, response){
var pathname = url.parse(request.url).pathname; //이러한 method, attribute 등을 제공하네요..
console.log("Request for " + pathname + " received.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
var server = http.createServer(onRequest);
server.listen(8888);
console.log("Server has started.");
}
exports.start = start;
url 모듈의 parse() 메소드와 pathname 속성 값으로 request 의 url 정보를 콘솔로 찍는 코드를 심어놨습니다.
파라미터 request 객체도 당연하듯이 url 이라는 속성을 가지고 있군요.
확인사살 해보실 분들은 브라우저에 “http://localhost:8888/아무거나다르게” 어러번 때러보시고....
8. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
이제 URL 판별 능력을 갖춘 서버 모듈이 만들어져 있으니…
URL 에 따라 다른 비즈니스를 하도록 엮어줘야 할텐데… 라우팅.. 라우팅 해야할텐데…
뭔가 아까 판별해서 나온 url pathname 값을 파라미터로 받아서 값에 따라 지지고 볶는 function 하나 만들면 되지 않을까요?
네~ 됩니다 고갱님!! 기왕이면 알흠다운 스트뤜춰~~를 위해서 “route.js” 라는 이름의 모듈을 생성해보십시오~
function route(pathname) {
console.log("About to route a request for " + pathname); //하라는 비즈니스는 안하고 이런 거나 하고 있다;;
}
exports.route = route;
url 판별코드는 server 에다 만들어 놓았는데.. 이걸 이 라우팅 모듈과 어떻게 엮어줄까요?
일단 server 모듈에서 이 route() 함수를 불러야 할텐데…
http 요청인 브라우저에 url 때림! 이라는 이벤트가 발생하면 저 위 뭐 같지도 않은 비즈니스를 하는 route() 를 호출하도록 만들면 되는
것이지요? 어디에다가?
이미 만들었잖아요.. server.start() 이 넘 속에서 url 뽑아오고 있잖아요.. (오늘 말장난이 좀 실속 없이 심한데?;;)
9. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
var http = require("http");
var url = require("url");
function start(route) {
function onRequest(request, response){
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
route(pathname);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
var server = http.createServer(onRequest);
server.listen(8888);
console.log("Server has started.");
}
exports.start = start;
자 route 함수(함수에요!!) 를 파라미터로 받아먹는 server.start() 메소드가 다시 만들어졌습니다.
server.start() 메소드는 우리 index 양께서 호출하도록 만들었었죠…
그럼 index 양에게 server 군과 데이트 할려고 부를 때 route 함수를 챙겨 가라고 전해줘야겠어요..
10. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
var server = require("./server");
var router = require("./router"); //router 모듈을 쓰겠thㅓ!!
server.start(router.route);
실행을 한번 해봅시다. (드디어 오늘 처음 콘솔 뜸 ㅋㅋ)
브라우저에 때리는 url 에 따라 다른 비즈니
스를 처리하게 되었습니다.
(여기서는 url 자체를 걍 찍고 말지만…)
지나가는 얘긴데 저번에도 살짝 찾아보라고
만 했지만.. 자꾸 favicon 을 찾을려는 불가침
의 습성 때문에 좀.. 거슬리긴 해요;;;
11. 3. 웹개발을 할 것이라는 것을 잊지는 않았겠지?
좌아~~ 이번 시간에는
Web app 를 구축하겠다는 굳은 의지를 상실해가지 않도록
node 모듈모듈모듈~~ 들의 구조화 얘기 쪼끔,
우리가 만들어야 할 비즈니스!!! 구현에 대한 접근을 시작해보았습니다.
뭔가 js 파일이 막 요레요레 늘어나고 분리되고 “ㅇ ㅏ~~ 뭔가 만드는 것 같다 ㅋㅋㅋ” 하는 기쁨보다는
드..드…드디어 비즈니스에 대한 얘기를 꺼내게 된 것에 더욱 스스로 의미를 두고 싶습니다.
다음 시간에는 이 죽일놈에 비즈니스를 좀 더 철저히 관리할 필요성에 대해서 얘기해보는 걸로 약속드리면서…
달려갑니다!! 이상한 node 의 세계로…
갑니다!! 혼자라면… 혼자 갑니다!! ( 흥~! ㄷ ㅏ 필요벗ㅇㅂ엉~!!)
To be 게솎!