โ ์์ด ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ํ๊ธฐ ๋ณด๋ค ์ฝ๋ค. โ
- Larry Wall
Perl ์ธ์ด์ ์ฐฝ์์

require vs import ๋ฌธ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๋ชจ๋์ ๋ถ๋ฌ์ค๋ ๋ฌธ๋ฒ ๋๊ฐ์ง ( require / exports ) ์ ( import / export ) ํค์๋๋ฅผ ์ ํ๊ฒ ๋๋๋ฐ, ์ด ๋์ ๋น์ทํ๋ฉด์๋ ๋ฌ๋ผ ๊ฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐํ๋๋ฐ ์์ด ํผ๋์ ์ค๋ค.
๋๋ค ์ธ๋ถ์ ํ์ผ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋๋ฅผ ๋ถ๋ฌ์จ๋ค๋ ๊ฐ์ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ง๋ง, ์ ํ ๋ค๋ฅธ ๋ฌธ๋ฒ ๊ตฌ์กฐ๋ฅผ ์ง๋๊ณ ์๋ค.
( require / exports ) ๋ NodeJS์์ ์ฌ์ฉ๋๊ณ ์๋ CommonJS ํค์๋์ด๊ณ Ruby ์ธ์ด ์คํ์ผ๊ณผ ๋น์ทํ๋ค๋ผ๊ณ ๋ณผ์ ์๋ค.
( import / export ) ๋ ES6(ES2015)์์ ์๋กญ๊ฒ ๋์
๋ ํค์๋๋ก์ Java๋ Python ์ธ์ด ๋ฐฉ์๊ณผ ๋น์ทํ๋ค.
์๋ฅผ ๋ค์ด, ์๋ 2์ค์ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ ๋ชจ๋์ ์ฝ๋๋ฅผ ๋ถ๋ฌ์ค๋ ๋์ผํ ์์ ์ ์ํํ๊ณ ์์ง๋ง ๋ฌธ๋ฒ ๊ตฌ์กฐ๊ฐ ๋ค๋ฆ์ ์์ ์๋ค.
/* CommonJS */
const name = require('./module.js');
/* ES6 */
import name from './module.js'
์ ์ฒ๋ผ import ์ require ๋ ํ์ฐํ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ ๊ตฌ๋ถํ๋๋ฐ ์์ด ๋ฌด๋ฆฌ๊ฐ ์๋ค.
ํ์ง๋ง, export ์ exports ๋ ๋จ์๋ ๋ณต์๋์ ์ฐจ์ด ๋๋ฌธ์ ๋ง์ ์ด๋ณด ๊ฐ๋ฐ์๋ค์ด ํผ๋ํด ํ๋ค.
/* CommonJS */
const name = '๊ณ ์์ด';
module.exports = name;
/* ES6 */
const name = '๊ณ ์์ด';
export default name;
[ ES6 ์ CommonJS ์ export(๋ด๋ณด๋ด๊ธฐ) ์ฐจ์ด์ ]
CommonJS์ ES6๋ผ๋ ๋ชจ๋ ์์คํ ์์๋exports๊ฐ์ฒด๋ผ๋ ๊ฐ๋ ์ด ์กด์ฌํ๋ค.exports๋ ๋ชจ๋๋ก๋ถํฐ ๋ด๋ณด๋ด์ง๋ ๋ฐ์ดํฐ๋ค์ ๋ด๊ณ ์๋ ํ๋์ ๊ฐ์ฒด์ด๋ค.
์ฌ๋ฌ๋ถ์ ๋ ธ๋ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋module.exports =๋ผ๋ ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ๊ตฌ๋ฌธ์ ์์ฃผ ์จ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ES6์export default๊ตฌ๋ฌธ์ด, CommonJS์module.exports๊ตฌ๋ฌธ ๋์์ ๋์ฒดํ๊ธฐ ์ํ ๋ฌธ๋ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
require์ import์ ์ฃผ์ ์ฐจ์ด์ ์ ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
require()๋ CommonJS๋ฅผ ์ฌ์ฉํ๋ node.js๋ฌธ์ด์ง๋งimport()๋ ES6์์๋ง ์ฌ์ฉrequire()๋ ํ์ผ (์ดํ๊ฐ ์๋)์ ๋ค์ด์๋ ๊ณณ์ ๋จ์ ์์ผ๋ฉฐimport()๋ ํญ์ ๋งจ ์๋ก ์ด๋require()๋ ํ๋ก๊ทธ๋จ์ ์ด๋ ์ง์ ์์๋ ํธ์ถ ํ ์ ์์ง๋งimport()๋ ํ์ผ์ ์์ ๋ถ๋ถ์์๋ง ์คํํ ์ ์๋ค. (๊ทธ๋ ์ง๋ง import ์ ์ฉ ๋น๋๊ธฐ ๋ฌธ๋ฒ์ผ๋ก ํ์ผ ์ค๊ฐ์ ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ๋ฅผ ํ ์ ์๋ค. ์ฐธ๊ณ ๊ธ)- ํ๋์ ํ๋ก๊ทธ๋จ์์ ๋ ํค์๋๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์๋ค
- ์ผ๋ฐ์ ์ผ๋ก
import()๋ ์ฌ์ฉ์๊ฐ ํ์ํ ๋ชจ๋ ๋ถ๋ถ ๋ง ์ ํํ๊ณ ๋ก๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ ํธ๋๋ค. ๋ํrequire()๋ณด๋ค ์ฑ๋ฅ์ด ์ฐ์ํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ค.
๋ชจ๋ ์ ์ฒด ๋ด๋ณด๋ด๊ธฐ / ๊ฐ์ ธ์ค๊ธฐ
CommonJs ๋ฌธ๋ฒ (require / exports)
// ๋ชจ๋ ์ ์ฒด๋ฅผ export, ํ์ผ๋ด ํ๋ฒ๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
const obj = {
num: 100,
sum: function (a, b) {
console.log(a + b);
},
extract: function (a, b) {
console.log(a - b);
},
};
module.exports = obj;
const obj = require('./exportFile.js');
obj.num; // 100
obj.sum(10, 20); // 30
obj.extract(10, 20); // -10
ES6 ๋ฌธ๋ฒ (import / export)
// ๋ชจ๋ ์ ์ฒด๋ฅผ export, ํ์ผ๋ด ํ๋ฒ๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
const obj = {
num: 100,
sum: function (a, b) {
console.log(a + b);
},
extract: function (a, b) {
console.log(a - b);
},
};
export default obj;
// ์ ์ฒด ์์ฒด๋ฅผ import ํ ๊ฒฝ์ฐ ์ค๊ดํธ ์์ด ๊ทธ๋ฅ ์
import obj from './exportFile.js';
obj.num; // 100
obj.sum(10, 20); // 30
obj.extract(10, 20); // -10
๋ชจ๋ ๊ฐ๋ณ ๋ด๋ณด๋ด๊ธฐ / ๊ฐ์ ธ์ค๊ธฐ
CommonJs ๋ฌธ๋ฒ (require / exports)
// ๋ฉค๋ฒ๋ฅผ ์ง์ ์ผ์ผํ export
exports.name = 'Ann'; // ๋ณ์์ export
exports.sayHello = function() { // ํจ์์ export
console.log('Hello World!');
}
exports.Person = class Person { // ํด๋์ค์ export
constructor(name){
this.name = name;
}
}
const { name, sayHello, Person } = require('./exportFile.js');
console.log(name); // Ann
sayHello(); // Hello World!
const person = new Person('inpa');
[ CommonJs ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์ ์ฃผ์ ์ฌํญ ]
CommonJs ๋ฐฉ์์ผ๋ก ๋ชจ๋์ ๋ด๋ณด๋ผ๋๋ ES6์ฒ๋ผ ๋ช ์์ ์ผ๋ก ์ ์ธํ๋ ๊ฒ์ด ์๋๋ผ ํน์ ๋ณ์๋ ๊ทธ ๋ณ์์ ์์ฑ์ผ๋ก ๋ด๋ณด๋ผ ๊ฐ์ฒด๋ฅผ ์ธํ ํด์ค์ผ ํ๋ค.
ํนํ, ์ ์ผ ํ๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ๋ฐ๋ก ์ ์ฌํด ๋ณด์ด๋ export ๋ณ์์ module.exports ๋ณ์๋ฅผ ์ํฉ์ ๋ง๊ฒ ์ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ง ๊ท์น๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค.
1. ์ฌ๋ฌ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ด๋ณด๋ผ ๊ฒฝ์ฐ โexport.๋ณ์์ ๊ฐ๋ณ ์์ฑ์ผ๋ก ํ ๋น
2. ๋ฑ ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ด๋ณด๋ผ ๊ฒฝ์ฐ โmodule.exports = ๊ฐ์ฒด์์ฒด์ ํ ๋น
ES6 ๋ฌธ๋ฒ (import / export)
// ๋ฉค๋ฒ๋ฅผ ์ง์ ์ผ์ผํ export
export const name = 'Ann'; // ๋ณ์์ export
export function sayHello() { // ํจ์์ export
console.log('Hello World!');
}
export class Person { // ํด๋์ค์ export
constructor(name){
this.name = name;
}
}
// ----------------------- OR ----------------------- //
// ๋ฉค๋ฒ๋ฅผ ๋ฐ๋ก ๋ฌถ์ด์ export
const name = 'Ann';
function sayHello() {
console.log('Hello World!');
}
class Person {
constructor(name){
this.name = name;
}
}
export {name, sayHello, Person}; // ๋ณ์, ํจ์, ํด๋์ค๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑํ์ฌ export
import { name, sayHello, Person } from './exportFile.js';
console.log(name); // Ann
sayHello(); // Hello World!
const person = new Person('inpa');
// ----------------------- OR ----------------------- //
// ๊ฐ๋ณ๋ก export ๋๊ฑธ * ๋ก ํ๋ฒ์ ๋ฌถ๊ณ as ๋ก ๋ณ์นญ์ ์ค์, ๋ง์น ์ ์ฒด export default ๋๊ฑธ import ํ ๊ฒ ์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ
import * as obj from './exportFile.js';
console.log(obj.name); // Ann
obj.sayHello(); // Hello World!
const person = new obj.Person('inpa');
Node.js ์์ import ํค์๋ ์ฌ์ฉ ๋ฐฉ๋ฒ
๋น๋ก ์ ์์ ์ผ๋ก ๋
ธ๋์ CommonJS๋ฅผ ๋์ฒดํ ์๋ ์์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ๋
ธ๋ ํ๋ก์ ํธ์์ import ํค์๋๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ ์ค์ ์ ํ ์ ์๋ ๋ฐฉ๋ฒ ๋ํ ์กด์ฌํ๋ค.
๊ณผ๊ฑฐ์๋ import, export๋ฅผ ์ธ์์ํค๊ธฐ ์ํด ๋ฐ๋ก .mjs๋ผ๋ ํ์ฅ์๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ํค์๋๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์๋ค.
์๋ฅผ๋ค์ด app.js ๋์ ์ app.mjs ๋ก ์์ค ํ์ผ์ ๋ง๋๋ ์์ผ๋ก ๋ง์ด๋ค.
ํ์ง๋ง ์ด์ ๋ package.json์ ํตํด์ ๊ฐํธํ๊ฒ ์ค์ ํ ์ ์์ด์ ํ์ฅ์๋ฅผ ๋ฐ๊พธ์ง ์์๋ import, export๋ฅผ ์ธ ์ ์๊ฒ ๋์๋ค.
์ฐธ๊ณ ๋ก ๋ ธ๋ ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ์ ๋ฐ๋ผ --experimental-modules ๋ฅผ ๋ถ์ฌ์ ์คํํ๋ ๋ฐฉ์์ ์ฌ๋ผ์ก๋ค.
๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ๊ทธ์ json ์์ฑ์ "type": "module" ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
{
"type": "module"
}

๋ค์์ express ๋ชจ๋์ import ํค์๋๋ก ๋ฐ์์ ์๋ฒ๋ฅผ ์คํํ๋ ์ํ ์ฝ๋์ด๋ค.
// const express = require('express');
import express from 'express';
const app = express();
app.get('/', (req, res) => {
res.send('<h1>Hello World!</h1>');
});
app.listen(3000, () => {
console.log('3000๋ฒ ํฌํธ ์๋ฒ ์์');
});
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.