Node.js의 기본 개념
1. Node.js의 개념
- 웹 브라우저는 컴퓨터 내외부 서버에 HTTP/HTTPS 접속을 해서 HTML, XML, JavaScript 등의 코드와 CSS 등의 서식정보, 그리고 그외 음악, 사진, 동영상 등 여러 미디어 파일을 얻어온 후 코드를 해석하고 화면에 표현할 각종 요소를 렌더링하여 최종적으로 사용자에게 웹 페이지를 보여준다. 이처럼 여러 형식의 코드와 파일을 처리하기 때문에 웹 브라우저는 각 기능을 담당하는 여러 요소로 구성돼 있는데, 그 중에 JavaScript를 처리하는 요소를 JavaScript 인터프리터 또는 JavaScript 엔진이라 한다. 웹 브라우저마다 각각 다른 JavaScript 엔진을 두고 있는데, 대표적으로 과거 넷스케이프에서 쓰였고 현재도 파이어폭스에서 쓰고 있는 SpiderMonkey, 사파리에서 쓰고 있는 WebKit, 크롬에서 쓰고 있는 V8 등이 있다.
- Node.js는 크롬의 V8 엔진만을 떼온 후 여기에 OS 커널과의 소통을 위한 C 라이브러리인 libuv를 결합해, 브라우저 없이도 JavaScript 코드를 실행할 수 있도록 한 플랫폼이다. 따라서 Node.js를 이용하면 브라우저 없이 단독으로 JavaScript 코드를 실행시킬 수 있다.
- 크롬에서 사용할 수 있는 문법과 Node.js에서 사용할 수 있는 문법은 거의 동일하나 몇몇 부분에서 차이가 있다. 다음은 그 예이다.
-
크롬에서 지원되는 브라우저 관련 API는 V8에 직접 포함된 것이 아니므로, 이러한 API 호출이 있는 코드는 Node.js에서는 에러가 발생할 수 있다. (document 엘리먼트가 이러한 API 호출에 의한 엘리먼트이며, 시스템 함수로 생각하기 쉬운
fetch()또한 마찬가지다.fetch()를 사용하고자 한다면 이를 지원하는 패키지를 내 앱에 추가해야 한다.) -
모듈 관련 문법에 있어 크롬은 ES6만을 따르지만, Node.js는 ES6, CommonJS 방식을 모두 사용할 수 있다. (단, Node.js에서 ES6 방식으로 모듈 관련 문법을 사용하는 경우
package.json파일 내type속성을module로 지정해야 한다.) -
Node.js에서는
var,const,let으로 변수 선언 않을 시 에러가 발생한다.
* 모듈화 관련 문법에서 CommonJS 방식
ES6와 달리, CommonJS는 (1)그 파일의 객체 또는 함수 중 다른 파일에서 호출할 수 있게 할 객체 또는 함수들을 exports라는 이름의 객체의 멤버로 할당하면 (2)그 파일의 경로를 인자로 하는 require()라는 시스템 함수를 호출하여 그 exports 객체를 리턴받아 그 멤버들로서 사용할 수 있다.
예를 들어 module1.js의 코드 내용이 다음과 같다 하자.
1
2
exports.fruit1 = "사과";
exports.fruit2 = "포도";
index.js의 코드 내용은 다음과 같다 하자.
1
2
const my_fruits = require("./module1.js");
console.log(my_fruits.fruit1);
이 경우 사과가 출력된다.
2. Hello world 출력하기
예를 들어, index.js라는 이름의 파일에 다음 내용이 있다 하자.
1
console.log("Hello world");
OS에 Node.js를 설치 후 터미널에 다음 명령어를 입력하면 화면에 Hello world가 출력된다.
1
node index.js
3. Node.js의 패키지 관리 프로그램과 패키지
1) 패키지, 패키지 관리 프로그램, package.json
- npm, Yarn 등의 패키지 관리 프로그램을 이용해 Node.js를 위해 작성한 JavaScript 소스파일과 모듈 소스파일들을 하나의 패키지로 묶어 관리할 수 있으며, 내가 만든 패키지를 온라인 패키지 저장소에 배포할 수도 있고 온라인에 배포돼 있는 패키지를 내가 만든 패키지 안에 포함시킬 수도 있다. 이때 패키지에 관한 명세는 그 패키지에 속하는 소스파일들이 있는 폴더에 package.json이라는 파일을 두어 그 안에 기록하며, 그 package.json 파일을 패키지 관리 프로그램으로 접근하여 그 패키지를 관리할 수 있다.
- package.json 파일은 패키지 관리 프로그램을 통해 패키지를 관리할 때 사용되는 패키지 명세에 관한 파일인데, Node.js로 그 폴더의 JavaScript 소스파일을 실행할 때 이 파일이 반드시 필요한 건 아니지만 특정 경우에는 이 파일이 필요할 때가 있다. (예를 들어, 모듈 관련해 ES6 문법을 사용한 경우 등.)
- npm의 다음 명령어로 간단히
package.json의 초기 포맷을 생성할 수 있다.
1
npm init
이 명령어로 package.json를 생성 시 그 파일에 패키지의 이름, 버전, 설명 등의 명세에 관한 포맷이 JSON 형식으로 초기화돼 기록된다.
2) 의존성
- 어떤 JavaScript 소스파일이 온라인에 배포돼 있는 패키지/모듈을 사용하고 있다면, 그 소스파일은 그 소스파일을 개발할 당시 사용한 패키지/모듈의 그때 당시 버전에 의존한다. 만약 그 소스파일을 그 소스파일을 개발한 환경과 전혀 다른 환경에서 구동하고자 한다면 그 새 환경에 그 소스파일이 사용하는 패키지/모듈의 그 소스파일을 개발할 당시 버전을 그대로 설치를 해야 하는데, 이를 일일이 수동으로 설치하는 것은 다소 번거롭다. 이때 그 소스파일에 관한 package.json 파일에 의존성 관련사항을 추가한 다음 새로운 환경에서 그 패키지를 구동하고자 할 때 패키지 관리 프로그램으로 그 package.json 파일에 접근해 그 패키지가 사용하는 외부 패키지를 정확한 버전으로 설치하게 할 수 있다.
-
외부 패키지를 설치한 다음
package.json파일 내에dependencies속성에 그 패키지명과 버전을 직접 입력할 수도 있는데, 보통 패키지 관리 프로그램으로 외부 패키지를 설치하면 자동으로 그 내역이dependencies속성에 기록된다. -
npm의 다음 명령어로 간단히
package.json파일 내dependencies속성에 기록된 패키지를 모두 자동으로 설치하게 할 수 있다.
1
npm install
- npm의 패키지 설치 명령어는 기본적으로 외부 패키지 설치 시 그 외부 패키지가 현재 폴더에 있는 패키지에만 추가되도록 한다. (가상환경 같은 세팅을 해야만 그 가상환경 전용으로 모듈이 설치되는 파이썬과 다르다.)
3) package.json의 scripts 속성
- package.json의 scripts 속성은 특정 단축명에 터미널 내에서 실행시키고자 하는 터미널 명령어 스크립트를 지정하는 속성으로, 단축명을 지정해 두면 npm, Yarn 같은 패키지 매니저를 통해 굉장히 긴 스크립트도 굉장히 간결하게 실행시킬 수 있다.
예를 들어 package.json의 내용이 다음과 같다 하자.
1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "test1",
"version": "1.0.0",
"description": "test",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Kangwook Lee",
"license": "ISC"
}
이때 다음 명령어를 실행해보자.
1
npm run start
그러면 node index.js 라는 스크립트가 실행된다.