이번 포스팅에서는 프로그래밍을 할 때 자주 마주치게 되는 모듈(modules)이라는 것의 개념과 Node.js에서 package를 설치한 후 모듈을 사용할 때 쓰는 require 문법에 대해 알아보도록 하자.
모듈(module) ??
모듈에 대해 얘기하기에 앞서 모듈, 패키지, 라이브러리에 대한 개괄적인 의미를 먼저 알아 보자. 모듈이란 특정 기능들이 구현되는 코드들이 적혀있는 파일을 의미한다. 그리고 이러한 모듈들을 묶어서 하나의 상위 폴더에 넣어 놓은 것을 패키지, 여러 모듈과 패키지들의 묶음을 라이브러리라고 한다.
프로그래밍을 할 때 우리는 한 파일 안에서 코드들을 작성하고 해당 파일을 실행시켰을 때 어떠한 기능들이 실행되게끔 한다. 그런데 만들고자 하는 애플리케이션의 복잡도가 증가할수록 작성해야만 하는 코드들의 양은 기하급수적으로 늘어나게 된다. 한 파일 안에서 관련된 모든 코드들을 작성하고 관리하기란 매우 버겁고 어려운 일이 아닐 수 없다. 이럴 때 우리는 다른 파일에 적혀있는 코드들을 가져와서 내가 작성하고 있는 파일 안에서 실행되게끔 해줄 수 있는데 이 때 사용하는 것이 바로 모듈이다. 모듈이란 쉽게 말해 파일을 가져와서 쓸 수 있게끔 만든 시스템이라고 생각하면 된다.
require("...")
require는 Node.js에서 모듈을 불러올 때 사용하는 함수이다. 한가지 알고 넘어가야 할 것은 require 문법은 JavaScript의 표준 문법이 아니라는 사실이다. 표준에는 없는 문법이지만 Node.js에서는 require 문법을 사용하고 있다. 그렇다면, Node.js에서 require 문법을 사용해서 모듈을 불러오는 이유는 무엇일까? 이는 Node.js에서 JavaScript 파일이 돌아가는 방식과 브라우저에서 JavaScript 파일이 돌아가는 방식이 다르기 때문이다.
브라우저 위에서 JavaScript 파일들이 실행되는 것을 살펴보면 모듈을 사용하지 않고도 여러 개의 JavaScript 파일에서 작성된 코드들이 마치 하나의 파일 안에서 작성된 코드들처럼 연결되어 실행되는 것을 확인할 수 있다. 분명 여러개의 파일로 나뉘어서 작성된 코드들인데 브라우저 위에서는 모듈을 사용하지 않아도 별 문제 없이 제대로 작동하는 것이다. 이는 Node.js와 브라우저가 JavaScript 파일을 읽고 실행시키는 방식이 다르기 때문이다. 브라우저는 내가 가지고 있는 모든 JavaScript 파일을 읽고 해석해서 결과물을 만들어주기 때문에 파일이 몇개로 쪼개져 있든 브라우저에게는 그저 하나의 JavaScript 파일로 인식될 뿐이다. 다시 말해, 브라우저는 입력받은 모든 텍스트들을 전부 읽고 해석한 다음 실행을 해주기 때문에 파일들이 여러개로 쪼개져 있어도 마치 쪼개져 있는 파일들의 코드들이 이어 붙여진 것과 같은 효과로 모든 파일들이 하나로 합쳐진 것과 같은 결과물을 얻을 수 있는 것이다.
하지만 Node.js는 기본적으로 실행시키고 싶은 파일 하나만을 실행시킨다. Node.js는 내가 실행시킨 하나의 파일에 대해서만 결과물을 만들어 주기 때문에 JavaScript 내용이 많아지게 되면 한 파일 안에 모든 것을 적어야만 하는 문제가 발생할 수 있다. 그래서 Node.js는 하나의 파일을 실행할 때 해당 파일 뿐만 아니라 다른 파일에 있는 정보들도 가져올 수 있는 시스템을 만들었는데 그게 바로 모듈인 것이다. 그리고 require 함수를 통해 모듈들을 가져오면 한 파일 안에서 다른 파일에서 작성된 JavaScript 코드들이 실행될 수 있도록 하였다.
module.exports = " " , require("...")
이제 module.exports를 사용해 특정 JavaScript 파일에 있는 내용들을 모듈화시킨 후 다른 JavaScript 파일에서 사용하는 방법에 대해 알아보자.
아래와 같이 main.js 와 data.js 두 개의 파일이 있다고 해보자.
// main.js
// 메인 실행 파일
const data = require("./data.js")
console.log(data.name) // output : "bitkunst"
console.log(data.age) // output : 20
console.log(data.height) // output : 180
// data.js
// 데이터 파일
const obj = {
name: "bitkunst",
age: 20,
height: 180
}
module.exports = obj;
main.js 파일에서 data.js에 있는 변수들을 가져와서 사용하고 싶다면 우선 data.js 파일에서 module.exports 를 통해 원하는 내용을 모듈화시켜 내보내줘야 한다. module.exports = "내보내고 싶은 객체" 형태로 사용하며 data.js 파일에 있는 obj 객체를 내보내기 위해서는 위의 코드에서처럼 module.exports = obj 를 작성해주면 된다.
// 어떠하 데이터를 내보낼 것인지 정해줘야만 한다.
// module.exports = '내보내고 싶은 객체' 형태로 작성해 준다.
module.exports = obj;
main.js 파일에서는 data.js 파일에 있는 내용들을 가져와서 사용하고 싶기 때문에 require 함수를 사용해 data.js에 있는 내용들을 가져올 수 있도록 해야 한다. require("모듈로 불러올 파일") 형태로 작성해서 사용하며 위의 코드에서처럼 data라는 변수에 data.js 파일에 있는 내용들을 담아서 사용할 수 있다.
// main.js에서 require("./data.js")를 사용해 data.js의 데이터를 가져올 수 있다.
// 가져온 내용들을 변수에 담아서 사용할 수 있다.
const data = require("./data.js")
지금까지 설명한 내용들만으로도 module.exports와 require를 사용하는 데에는 아무런 문제가 없다. 하지만 한발짝 더 나아가서 data.js 파일에서 작성한 module.exports 에 대해 조금 더 살펴보도록 하자. 브라우저가 window라는 내장객체를 가지고 있는 것처럼 Node.js에도 module이라는 내장객체가 존재한다. module.exports 를 통해 모듈로 내보내고 싶은 객체를 정하지 않은 상태에서 console.log(module)을 통해 module 객체를 살펴보면 아래와 같다.
// data.js
const obj = {
name: "bitkunst",
age: 20,
height: 180
}
// module.exports = obj
console.log(module);
module 객체의 exports 속성값이 빈 객체로 되어 있는 것을 확인할 수 있다. 이제 module.exports = obj 를 사용해 obj 객체를 모듈화시키면 module 객체의 exports 속성값이 어떻게 변하는지 확인해 보자.
// data.js
const obj = {
name: "bitkunst",
age: 20,
height: 180
}
module.exports = obj
console.log(module);
여기서 우리는 require 함수가 특정 파일의 module 객체에 있는, exports 속성값에 담겨 있는 내용을 가져오는 역할을 한다는 사실을 알 수 있다. require("./data.js") 를 사용하면 require 함수는 data.js 파일을 실행시키고 data.js 파일의 module 객체의 exports에 있는 속성값의 내용을 가져오는 것이다. 다시말해, module.exports = " "를 통해 module 객체의 exports 속성값에 어떠한 내용을 넣어주면, 다른 파일에서 require 함수로 모듈화한 파일을 불러왔을 때 exports에 있는 내용들을 가져와서 사용하는 것이라고 할 수 있다.
이상으로 module의 개념과 module.exports 를 이용해 특정 파일을 모듈화시키고 require를 통해 모듈화시킨 파일의 내용을 가져와서 사용하는 방법에 대해 알아보았다.
'Node > Node.js' 카테고리의 다른 글
Node.js - path 라이브러리 (0) | 2022.03.15 |
---|---|
Node.js 실행하기 (with Visual Studio Code) (0) | 2022.02.02 |
Linux CLI 명령어 정리 (Ubuntu 사용) (0) | 2022.01.25 |
Node.js 설치하기 (Windows - WSL , macOS - Homebrew) (0) | 2022.01.25 |
Node.js 환경설정 (WSL2 설치하기) (3) | 2022.01.25 |