본문 바로가기

Nodejs

[Node.js] 인터넷, 모듈, NPM 프로젝트 시작, Callback

OT

js는 language(java script), run time(web browser과 node js)라고 할 수 있습니다.

즉, js는 언어일뿐이고 js가 web brower와 node js에서 어떤 기능이 있는지 알아야 합니다.

예를 들어 alert는 web browser에서만 사용되고 node js에서는 사용할 수 없다는 것이 있습니다 . 

 

Node js 의 장점

기본적으로 v8을 사용하기 때문에 속도가 빠릅니다.

event driven과 non-blocking을 사용해 이 특징이 적합할 땐 아주 빨라집니다.

js라는 하나의 언어로 client와 server 모두 구현 가능합니다.

 

인터넷의 동작 방법

1. client와 server

컴퓨터끼리 연결될 때 요청을 보내는 쪽이 client, 요청을 받는 쪽이 server입니다. 

실제로 client가 요청하는 http://a.com같은 도메인을 요청하면, 이 도메인과 일치하는 server의 ip주소로 요청이 들어갑니다. 

 

server

한 개의 server에는 게임, 채팅, 웹, 데이터베이스 server 등 여러 application이 있을 수 있습니다. 

여러 개의 server application중 과연 어떤 application을 연결시켜줘서 그 application이 응답할 수 있는걸까?

 

80번 port에 웹 server를 연결시켜놓고 80번 port를 웹 server가 listening하게 합니다. 

http://a.com:80을 요청하면 a.com에 해당하는 ip주소를 가진 서버로 들어와 80번 포트(웹서버)와 연결됩니다.

정확히 말하자면 80번 port에 요청이 들어오니 80번 port를 바라보던(listening) 웹 서버가 연결됩니다. 

* :80 은 생략가능합니다. => http를 통해 웹 브라우저를 통해 요청이 들어왔다는 것을 알 수 있기 때문.

 

따라서 우리가 서버를 만드려면 port와 연결시켜 줘야 합니다. 

//websever.js

const http = require("http");

const hostname = "127.0.0.1";
const port = 1337;

http
  .createServer((req, res) => {
    res.writeHead(200, { "Content-Type": "text/plain" });
    res.end("Hello World\n");
  })
  .listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
  });

위는 node js 홈페이지에 나온 server만들기 코드입니다.

코드를 살짝 분석해보자면,

1. 우리가 만든 웹 서버의 hostname은 이 컴퓨터의 ip, port는 1337번이다.

      다시 말해, 127.0.0.1로 접속한 사용자에 대해 응답해야하고 우리가 만든 웹 서버가 1337번 port를 listening한다는 것을 알 수 있다. 

2. 응답결과는 Hello World를 보여줘라

 

실행

node webserver.js

또는 (아래는 app.js에 변경사항이 생기면 알아서 서버를 재시작해주는 명령어)

supervisor app.js

 

모듈

웹 서버를 만드는 일은 굉장히 어렵습니다! 그래서 node js가 기본 웹서버를 아주 잘 만들어뒀네욤. 따라서 우리가 할 일은 node js가 만들어 둔 기본적인 웹서버를 잘 사용하면 되는 것입니다. 위의 코드를 예시로 설명드리겠습니다.

 

먼저 모듈을 사용하려면 require로 호출해야 합니다.

const http = require('http')

이 맨 윗 줄 코드는 그 아래 application을 구동하기 위해 http라는 모듈을 요구한다는 뜻입니다.

 

http라는 모듈에는 createServer라는 메소드가 들어있고 이 메소드를 호출하면 새로운 Server객체를 리턴해줍니다.

http
  .createServer((req, res) => {
    res.writeHead(200, { "Content-Type": "text/plain" });
    res.end("Hello World\n");
  })

따라서 이 코드는 createServer를 통해 새로운 Server객체를 리턴받았고 이 새로운 Server 객체는 listen이라는 메소드를 가지고 있어서

.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
  });

 listen 메소드를 사용할 수 있습니다. 

 

NPM

Node Package Manager의 약자로 Node계의 앱스토어정도로 비교할 수 있습니다!

NPM은 내 프로젝트에 어떤 모듈을 설치, 삭제, 업그레이드, 의존성 관리 등을 합니다.

NPM에서는 1. 모듈이나 2. 독립적으로 실행 될 수 있는 프로그램을 Package라고 합니다. 

 

1. 모듈 설치

모듈 설치는 다른 사람이 만든 sw인 모듈을 내 프로젝트의 부품으로 사용할 때와 독립적인 프로그램을 설치할 때로 나눌 수 있습니다. 

 

1. 다른 사람이 만든 sw인 모듈을 내 프로젝트의 부품으로 사용하려면, 내 디렉토리도 package이기 때문에 먼저 현재 디렉토리 자체를 NPM의 package로 지정을 해줘야 합니다. 

 

  ❗ NPM의 package로 지정

npm init

그 후, 우리의 sw를 패키지로 만들기 위한 여러가지 환경설정을 하게 됩니다. (환경설정 하는 법은 "더보기"에)

 

더보기

( * 괄호 안에 값이 있으면 엔터를 쳤을 때 자동으로 설정됩니다. * ) 

name : 프로젝트 이름
version : 버전
description : 설명 (직접 쓰기를 권장)
entry point: 어떤 js파일이 package를 구동시키는 첫 시작인지
test command : TDD(Test Driven Development : 테스트 주도 개발)를 할 때 test를 실행시킬 명령어
git repository : git repo 주소

 

환경설정을 마치면 프로젝트의 여러 정보가 담긴 package.json이라는 파일이 생성됩니다. 이렇게 되면 우린 이 프로젝트 퐅더를 npm의 package의 디렉토리로 선언을 했습니다. 이제 다른 사람이 만든 것을 우리 프로젝트에 포함시킬 수 있습니다! 

 

이 후, 모듈을 설치하면 node_module 폴더 아래 새로 설치한 모듈의 폴더가 생깁니다. (설치 방법은 아래)

 

  ❗ 설치

npm install [프로그램명]
npm install [프로그램명] --save

여기서 --save는 package.json에 의존성이 명시되는지에 대한 것입니다.

--save가 없다면, 모듈을 설치할 때 extraneous가 뜰텐데 이것은 곧 "부가적"임을 의미합니다. 보통 소스코드에 포함시키진 않지만 지금! 필요할 때 사용합니다. 

--save를 하면, package.json파일에 설치하는 모듈의 의존성이 명시되고 우리 프로젝트가 새로 깔린 모듈에 의존하고 있다는 것을 표시합니다. 이제 이 프로젝트를 다른 디렉토리에서 사용할 때도 package.json파일만 있으면 언제든 설치한 모듈을 사용할 수 있습니다.

 

프로그램에 이 모듈이 반드시 사용돼야하고 항상 같이 다녀야하면 --save를 붙여야합니다.

 

 

2. 독립적인 프로그램을 설치 할 때,

npm install [프로그램명]
npm install [프로그램명] -g

여기서 -g는 global의 약자로 내 컴퓨터 전체에 설치를 할 것인지에 대한 것입니다.

-g가 있다면 내 컴퓨터 전역에서 사용하는 독립적인 sw로 설치가 된다.는 것이고,

g가 없다면 현재 프로젝트 안에서 부품으로 사용하겠다. 라는 뜻입니다.

 

 

2. 사용법

const [내가 소스코드에서 사용할 이름] = reqiure('[프로그램명]');

을 사용해 모듈을 가져오고 공식문서를 통해 메소드를 알아냅니다. 

예를 들어 underscore 모듈을 가져오고 싶다면 const _ = require('underscore');를 사용해 "_"로(underscore가 이 변수명으로 많이 쓰임) 모듈을 가져옵니다. undersocre는 array(Object, Function등등)와 관련된 모듈로, first메소드를 사용해 _.first(arr)하면 배열의 첫번째 원소를 반환받습니다.  

 

 

 

Callback

a=[3,2,1];
function b(v1,v2){
	return v1-v2
};
a.sort(b);

어떤 함수(a)의 인자로 다른 함수(b)를 전달했고 이렇게 전달된 함수(b)를 콜백함수라고 합니다. 또는 누군가에 의해 나중에 호출당할 함수를 말합니다. b함수를 주입함으로써 a함수가 가진 기능을 확장시킬 수 있습니다. 

 

b함수가 다른 곳에서 또 쓰이지 않고 a함수(sort 함수)에서만 1회용으로 쓰인다면 익명함수를 콜백함수로 사용할 수 있습니다. 

a=[3,2,1];
a.sort(function(v1,v2){return v2-v1;});
function a(callback){callback();};

> a(function(){console.log("hello")});
hello

위는 callback으로 익명함수를 줬을 때의 예시입니다.