일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자바스크립트
- til
- 장고 프로젝트 순서
- Bookmark
- Algorithm
- 장고
- Node.js
- Django Blog
- ART_Cinema
- Blog
- 예술영화추천
- JavaScript
- 프로젝트
- passport.js
- 알고리즘
- 타사인증
- 개발
- MyPick31
- 장고 개발 순서
- 북마크만들기
- MYSQL
- 파이썬 웹프로그래밍 장고
- Exercism
- 독립영화플랫폼
- mongodb
- 북마크앱
- 장고 프로젝트
- join()
- Django
- python
- Today
- Total
Juni_Dev_log
(node.js) [Part.2] 노드 간단하게 살펴보기 - 모듈 사용하기(Module) 본문
노드에서 모듈 사용하기
하나의 함수 안에 모든 기능을 넣는 것보다 기능별로 여러 개의 함수로 나눈 후, 필요한 함수만 가져다 사용하면 다른 곳에서도 함수를 재사용할 수 있기 때문에 효율적으로 프로그램을 만들 수 있다.
또한, 각각의 기능을 나누어 프로그램 관리가 더 쉬워진다.
코드를 하나의 파일이 아니라 여러 개의 파일로 나누어 만들 때에도 이러한 장점을 그대로 살릴 수 있다.
메인 파일의 코드 중에서 독립적인 기능은 별도 파일로 분리할 수 있으며, 메인 파일에서는 전체적인 실행 순서나 흐름만으로 제어한다.
이렇게 분리된 파일을 노드에서는 모듈이라고 부른다.
모듈이란 별도의 파일로 분리된 독립 기능의 모음이라서 모듈을 만들어 놓으면 다른 파일에서 모듈을 불러와 사용할 수 있다.
각각의 기능을 분리시킬 때에는 단순히 별도의 파일에 코드를 나누어 놓는다고 끝나는 것이 아니다.
분리되어 있는 모듈 파일을 불러와서 사용할 수 있는 방법도 함께 만들어줘야한다.
노드는 이 과정에서 export 전역 객체를 사용한다.
모듈을 만들 때는 module1.js 처럼 별도의 자바스크립트 파일을 만든 후, 그 코드에서 exports 객체를 사용한다.
export 객체의 속성으로 변수나 함수를 지정하면 그 속성을 main.js 와 같은 메인 자바스크립트 파일에서 불러와 사용할 수 있다.
모듈을 불러올 때는 require() 메소드를 사용하며, 모듈로 만들어 둔 파일의 이름을 이 메소드의 파라미터로 전달한다.
require() 메소드를 호출하면 모듈 객체가 반환되는데, 모듈에서 exports 객체에 설정한 속성들은 이 모듈 객체를 통해 접근할 수 있다.
여기서 주의해야할 점은 exports 외에 module.exports 를 사용할 수 있다는 것이다.
exports에는 속성을 추가할 수 있어서 여러 개의 변수나 함수를 각각의 속성으로 추가할 수 있다.
이에 반해, module.exports에는 하나의 변수나 함수 또는 객체를 직접 할당한다. 일반적으로는 객체를 토대로 할당하며, 이렇게 할당된 객체 안에 넣어 둔 변수나 함수를 메인파일에서도 사용할 수 있다.
▶ exports 를 사용할지 module.exports 를 사용할지 혼동되는가?
여기에서는, exports와 module.exports 라는 것을 사용할 수 있고, 어떤 것을 사용하는가에 따라서 메인 파일에서 모듈을 불러와 사용하는 방식이 약간 다를 수 있다는 것 정도만 이해하면 된다.
나중에 더 살펴보자.
더하기 함수를 모듈로 간단히 분리하기
ch02_test4.js 파일을 만들고 코드를 입력한다.
var calc = {};
calc.add = function(a,b){
return a+b;
}
console.log('모듈로 분리하기 전 -- calc.add 함수 호출 결과 : %d',calc.add(10,10));
calc 객체를 만들고 그 객체에 add 속성을 추가하고 더하기 함수를 할당했다.
이렇게 만든 함수는 calc.add() 와 같은 형태로 호출할 수 있다.
이 코드 중에서 더하기 함수를 속성으로 추가했던 calc 객체를 별도의 파일로 분리하면 모듈 파일이 만들어진다.
calc.js 파일을 만들고, 더하기 함수에 해당하는 코드를 넣어보자.
exports.add = function(a,b){
return a+b;
}
exports 객체에 add 속성이 추가된다. 메인 파일에서 이 파일을 모듈로 불러들이면 add 함수를 호출하여 사용할 수 있다. 모듈 파일을 불러들여 사용하는 파일을 만들어보자. ch02_test5.js를 만든다.
var calc = require('./calc');
console.log('모듈로 분리한 후 -- calc.add 함수 호출 결과 : %s',calc.add(10,10));
이렇게 만든 ch02_test5.js 파일은 메인 파일이며, calc.js 모듈 파일을 불러와서 사용할 수 있다.
calc.js 를 모듈로 불러오기전에, 먼저 require() 함수를 호출한다.
이 때 파일 이름 전체를 다 사용하지 않고, 확장자를 뺀 calc라는 이름만 사용한다.
파일 이름 앞에 붙은 ./ 를 붙인 것을 보면 파일 이름은 상대 패스로 지정하였다는 것을 알 수 있다.
이렇게 불러들인 모듈을 calc 변수에 할당했다.
만약, 모듈의 이름만 지정하면 해당 파일을 찾아 불러들이지만 만약 파일이 없다면 폴더 이름을 찾아 그 안에 있는 파일을 불러들이기도 한다.
require('./calc') 처럼 지정하면, calc.js 파일을 찾아보고 파일이 없는 경우에는 calc 폴더가 있는지 확인한다.
만약 calc 폴더가 있다면, 그 안에 있는 index.js 파일을 불러들인다.
여기에서는 메인 파일에 정의한 calc 변수가 모듈 파일에서 사용한 exports 객체와 같다.
이렇게 하면 모듈 파일에서 exports.add로 추가한 add 속성을 메인 파일의 calc 객체에서도 접근할 수 있다.
그래서 calc.add() 코드로 함수를 호출할 수 있게 된 것이다.
함수를 호출하여 사용하는 코드는 모듈로 분리하기 전과 후가 다르지 않다.
즉, 모듈로 분리하기 전에도 calc.add() 코드를 사용했고 분리한 후에도 calc.add() 코드를 사용했다.
하지만, 모듈로 분리한 후에는 별도의 자바스크립트 파일이 만들어지므로 하나의 기능은 모듈로 정의해두면 필요에 따라서 원하는 모듈만 불러들어 사용할 수 있다.
module.exports 로 메인 파일에 더하기 함수 호출하기
exports 가 아닌, module.exports 를 사용했을 때 메인 파일에서 어떻게 더하기 함수를 호출할 수 있는지 알아보자.
프로젝트에 새로운 자바스크립트 파일 calc2.js 를 만든다.
var calc ={};
calc.add = function(a,b){
return a+b;
}
module.exports = calc;
더하기 함수를 만들었지만, exports의 속성으로 만들지는 않았다.
calc 객체를 만들고 그 객체의 속성으로 더하기 함수를 할당한 후, 마지막에는 module.exports에 calc 객체를 할당했다.
이렇게 코드를 만들면, calc 객체는 모듈을 불러들인 쪽에서 그대로 사용할 수 있다.
ch02_test5.js 파일에 코드를 추가한다.
...
var calc = require('./calc2');
console.log('모듈로 분리한 후 -- calc2.add 함수 호출 결과 : %s',calc2.add(10,10));
외장 모듈 사용하기
다른 사람이 만든 모듈을 사용하는 방법에 대해서 알아보자.
process.env 속성을 사용해서 OS 환경 변수를 확인해보자. 이 과정을 이번엔느 모듈을 사용해서 확인해보자. 시스템 환경 변수를 확인하는 기능을 다른 사람이 모듈어 만들어 둔 것이 있는데, 이러한 모듈을 외장 모듈이라고 한다.
시스템 환경 변수에 접근할 수 있는 모듈의 이름은 nconf이며, 이 모듈은 설정과 관련된 유용한 기능 뿐 아니라 시스템 환경변수를 접근하는 기능도 포함하고 있다.
ch02_test6.js 파일을 만든 후, 다음 코드를 입력한다.
var nconf = require('nconf');
nconf.env();
console.log('OS 환경 변수의 값 : %s', nconf.get('OS'));
nconf 가 만들어져 있으므로 require() 함수를 호출하여 불러들인다.
직접 만든 모듈이 아니라면 상대 패스가 아닌 모듈의 이름만 지정해서 불러온다.
nconf 모듈은 그 모듈 안에 정의한 env() 함수를 호출하면 환경 변수에 대한 정보를 가져와서 속성으로 보관한다.
다른 사람이 만든 모듈을 다운로드하여 설치하려면, npm 패키지를 사용하면 된다.
npm 의 역할은 무엇인가?
npm은 Node Package Manager 의 약자로 노드의 패키지를 사용할 수 있도록 설치 및 삭제 등을 지원하는 프로그램이다.
npm 프로그램은 인터넷에 올려 공유하는 노드 패키지를 다운로드하여 설치할 수 있도록 도와준다.
명령 프롬프트를 열고 nodejs 폴더 안에 있는 NodeExample1 폴더로 이동한 후, nconf 패키지를 설치한다.
npm install nconf
설치한 후에, ch02_test6.js 를 실행하면 확인할 수 있다.
npm으로 설치한 패키지는 어디있을까?
npm으로 설치한 외부 패키지는 그 폴더 안에 만들어진 node_modules 폴더 안에 설치된다.
폴더를 들어가보면 nconf 폴더가 있는 것을 확인할 수 있다.
그렇다면 프로젝트로별로 패키지 설치가 가능하다고 이해할 수 있다.
그런데 새로운 프로젝트를 만들었다면 매번 npm으로 외부 패키지를 설치해야할까? 그렇지 않다.
만약, 모든 프로젝트에 적용하고 싶다면 [node_modules] 폴더를 프로젝트들의 상위 폴더인 [brackets-nodejs] 폴더로 옮기면 해결된다.
또는 패키지를 설치할 때부터 상위 폴더에 설치하면된다.
메인 파일이 실행될 때는 먼저 현재 폴더에 node_modules 가 있는지 확인하고, 만약 없다면 상위 폴더를 검색한다. 그래도 못 찾으면 상위 폴더를 순차적으로 검색한다.
만약, 설치한 외부 패키지가 많다면 다시 설치해야한다. 노드에서는 외부 패키지의 수만큼 npm 명령을 입력해야하는 번거로움을 없앨 수 있도록 package.json 파일 안에 설치한 패키지들의 정보를 넣어 둘 수 있다.
npm init
질문이 나오면, name: 질문에는 node를 입력하고, 나머지는 계속 Enter 를 누른다.
끝까지 작성하면 현재 폴더에 package.json 파일이 만들어진다. 다음은 프로젝트 파일 안에 만든 package.json 파일의 내용이다.
{
"name": "node",
"version": "1.0.0",
"description": "",
"main": "calc.js",
"dependencies": {
"nconf": "^0.10.0"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
package.json 파일 안에 프로젝트에 대한 기본 정보가 들어있다.
이제 명령 프롬프트를 열고 nconf 모듈을 삭제한 후 다시 설치한다. 다시 설치할 때는 npm 명령어에 --save 옵션을 추가한다.
npm uninstall nconf
npm install nconf --save
이렇게 설치하면 dependencies 속성이 추가된 것을 확인할 수 있다.
...
"dependencies": {
"nconf": "^0.10.0"
},
...
이 프로젝트에서 사용한 모듈을 다른 PC에서 그대로 사용하고싶다면 package.json 파일만 다른 PC로 옮긴 후, 다음 명령을 입력하면 그 안에 들어있는 모든 패키지가 한꺼번에 설치된다.
npm init
이 명령은 package.json 파일을 찾은 후, 그 안에 있는 dependencies 속성의 값을 참조하여 패키지를 설치한다.
'Theorem (정리) > node.js' 카테고리의 다른 글
(node.js) [Part.3] 노드와 자바스크립트 - 배열 이해하기 (0) | 2020.11.30 |
---|---|
(node.js) [Part.3] 노드와 자바스크립트 - 자바스크립트의 객체와 함수 이해하기 (0) | 2020.11.27 |
(node.js) [Part.2] 노드 간단하게 살펴보기 - process 객체(argv, env, exit() ) (0) | 2020.11.19 |
(node.js) [Part.2] 노드 간단하게 살펴보기 - 노드 실행하기, log() , dir(), time() , timeEnd() (0) | 2020.11.18 |
(node.js) [Part.1] 노드로 만들 수 있는 대표적인 서버와 용도 - 개발 도구 설치하기 (0) | 2020.11.17 |