์ด๊ธฐ JavaScript๋ ์น ํ์ด์ง์ ๊ฐ๋จํ ๋์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋์์ต๋๋ค. ํ์ง๋ง ์ ์ฐจ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง๊ณ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ๊ณ ๋ คํ ๋ชจ๋ํ(Moduleization)๊ฐ ์ค์ํ ์์๋ก ๋ ์ฌ๋์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก JavaScript๋ ํ๋์ ์ ์ญ ์ค์ฝํ(Global Scope)์์ ์คํ๋๋ฏ๋ก, ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํ์ ํ ๋ ์ ์ญ ๋ณ์์ ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ๋ชจ๋ ์์คํ ์ด ๋ฑ์ฅํ๊ฒ ๋์์ต๋๋ค.
๋ชจ๋ํ์ ์ด๊ธฐ ๋ฐฉ์ ์ค ํ๋๋ ์ฆ์ ์คํ ํจ์ ํํ์(IIFE, Immediately Invoked Function Expression)์ ํ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ์ด ๋ฐฉ์์ ์ ์ญ ๋ณ์์ ์ค์ผ์ ๋ง๊ธฐ ์ํด ์ฌ์ฉ๋์์ต๋๋ค.
(function() {
var privateVariable = "์ด ๋ณ์๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.";
function privateFunction() {
console.log("์ด ํจ์๋ ์ธ๋ถ์์ ํธ์ถํ ์ ์์ต๋๋ค.");
}
})();
Node.js๊ฐ ๋ฑ์ฅํ๋ฉด์ ์๋ฒ ํ๊ฒฝ์์๋ JavaScript๋ฅผ ํ์ฉํ ์ ์๊ฒ ๋์๊ณ , ์ด์ ๋ง๋ ๋ชจ๋ ์์คํ
์ธ CommonJS๊ฐ ๋์
๋์์ต๋๋ค. CommonJS๋ require
์ module.exports
๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ถ๋ฌ์ค๊ณ ๋ด๋ณด๋ผ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
// ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ
module.exports = {
sayHello: function() {
console.log("Hello, CommonJS!");
}
};
// ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
const myModule = require('./myModule');
myModule.sayHello(); // Hello, CommonJS!
CommonJS์ ๋๊ธฐ์ ๋ก๋ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ชจ๋์ ๋ถ๋ฌ์ค๋ AMD(Asynchronous Module Definition) ๋ฐฉ์์ด ๋ฑ์ฅํ์ต๋๋ค. ๋ํ์ ์ผ๋ก RequireJS
๊ฐ ์ฌ์ฉ๋์์ต๋๋ค.
define(['moduleA', 'moduleB'], function(moduleA, moduleB) {
moduleA.doSomething();
moduleB.doSomething();
});
2015๋
, ES6(ECMAScript 2015)์์ ๊ณต์์ ์ธ ๋ชจ๋ ์์คํ
์ด ๋์
๋์์ต๋๋ค. import
์ export
๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ถ๋ฌ์ค๊ณ ๋ด๋ณด๋ผ ์ ์์ผ๋ฉฐ, ์ต์ JavaScript ํ๊ฒฝ์์๋ ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ์์
๋๋ค.
// ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ
export function greet() {
console.log("Hello, ES6 Modules!");
}
// ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
import { greet } from './myModule.js';
greet(); // Hello, ES6 Modules!
โ ์ฅ์
์์ ์ดํด๋ณธ ๋ชจ๋ ์์คํ ์ ๋ฐ์ ๊ณผ ํจ๊ป, JavaScript ํ๋ก์ ํธ์์ ๋ค์ํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐํ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์กด์๋ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ๋ค์ด๋ก๋ํ์ฌ ํ๋ก์ ํธ ํด๋์ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํด์ผ ํ๋ ๋ถํธํจ์ด ์์์ต๋๋ค.
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="lightbox.js"></script>
<script src="fancybox.js"></script>
์ด๋ฌํ ๋ฐฉ์์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด 2010๋ , npm(Node Package Manager)์ด ๋ฑ์ฅํ์์ต๋๋ค.
npm์ ์ฌ์ฉํ๋ฉด ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ค์นํ ์ ์์ต๋๋ค.
npm install express
์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด node_modules
ํด๋์ ํด๋น ํจํค์ง๊ฐ ์ค์น๋๊ณ , package.json
ํ์ผ์ ์ถ๊ฐ๋์ด ํ๋ก์ ํธ์ ์์กด์ฑ์ ์๋์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
package.json
ํ์ผ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ํจํค์ง ๋ชฉ๋ก๊ณผ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"express": "^4.17.1",
"lodash": "^4.17.21"
}
}
ํ์๋ค์ด ํ๋ก์ ํธ๋ฅผ ๋ค์ด๋ก๋ํ ํ ํ ์ค๋ง ์ ๋ ฅํ๋ฉด ๋์ผํ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
npm install
npm์ ๋ฐ๋ณต์ ์ธ ์์
์ ์๋ํํ ์ ์๋๋ก scripts
์น์
์ ์ง์ํฉ๋๋ค.
"scripts": {
"start": "node app.js",
"test": "jest"
}
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ๋ค์ ๋ช ๋ น์ด๋ง ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
npm start
npm์ ๋ฑ์ฅ ์ดํ, ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ค์ํ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๋ค์ด ๋ฑ์ฅํ์ต๋๋ค.
Yarn (2016๋
, Facebook ๊ฐ๋ฐ)
npm๋ณด๋ค ๋ ๋น ๋ฅธ ์๋์ ์ผ๊ด๋ ํจํค์ง ๊ด๋ฆฌ๋ฅผ ๋ชฉํ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
pnpm
๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ๊ณ ๋น ๋ฅธ ์ค์น ์๋๋ฅผ ์ ๊ณตํ๋ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ์
๋๋ค.
์ด๋ฌํ ๋๊ตฌ๋ค์ ํ๋ก์ ํธ์ ํน์ฑ๊ณผ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
๋ฌธ์ ์ | npm ๋ฑ์ฅ ์ด์ | npm ๋ฑ์ฅ ์ดํ |
---|---|---|
ํจํค์ง ์ค์น | ์ง์ ๋ค์ด๋ก๋ | npm install ๋ช
๋ น์ด๋ก ๊ฐ๋จํ๊ฒ ์ค์น |
์์กด์ฑ ๊ด๋ฆฌ | ์๋์ผ๋ก ๊ด๋ฆฌ | package.json ์ ํตํด ์๋ ๊ด๋ฆฌ |
๋ฒ์ ์ถฉ๋ | ๊ฐ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ ๋ฒ์ ์ฌ์ฉ ๊ฐ๋ฅ | package-lock.json ์ ํตํด ๋์ผํ ๋ฒ์ ์ ์ง |
์คํ ์๋ํ | ๋ช ๋ น์ด๋ฅผ ์ง์ ์ ๋ ฅํด์ผ ํจ | npm ์คํฌ๋ฆฝํธ๋ก ๊ฐ์ํ |
npm์ ๋์ ์ผ๋ก JavaScript ๊ฐ๋ฐ ํ๊ฒฝ์ด ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ๋์์ผ๋ฉฐ, ํ์ฌ๋ ํ๋ก ํธ์๋(React, Vue)์ ๋ฐฑ์๋(Node.js) ๊ฐ๋ฐ์์ ํ์์ ์ธ ๋๊ตฌ๋ก ์๋ฆฌ ์ก์์ต๋๋ค.