17. 코드 정리하고 나누기 (모듈 시스템)/17.3 CommonJS (Node.js 방식)

17.3.2 require로 불러오기 - 편리한 배달 서비스

thejavascript4kids 2025. 7. 25. 04:19

📘 17.3.2 require로 불러오기 - 편리한 배달 서비스

가끔 저녁 시간이 되면 무엇을 먹을지 고민이 될 때가 있어요. 그럴 때면 스마트폰을 꺼내 배달 앱을 켜곤 하죠. 몇 번의 터치만으로 멀리 있는 맛집의 음식이 우리 집 문 앞까지 도착해요. 정말 놀라운 일이에요.

프로그래밍에도 그런 편리한 배달 서비스가 있어요. 우리가 필요한 코드를 다른 파일에서 가져다주는 require라는 특별한 도구 말이에요. 오늘은 이 편리한 배달 서비스에 대해 이야기해보려고 해요.

🧠 새로운 단어들과 친해지기

단어 쉬운 설명
require 다른 파일에서 만든 코드를 가져오는 명령어
모듈 캐싱 한 번 가져온 코드를 기억해두었다가 다시 사용하는 기능
구조 분해 할당 큰 상자에서 필요한 것만 골라서 꺼내는 편리한 방법

✨ require가 뭐예요?

require는 동네 마트의 배달 서비스와 같은 역할을 해요.

어머니가 "참기름이 떨어졌네"라고 하시면, 동네 마트에 전화를 걸어 "참기름 한 병만 배달해주세요"라고 주문하곤 했어요. 그러면 마트 아저씨가 오토바이를 타고 와서 참기름을 문 앞에 놓고 가셨죠.

require도 정확히 같은 일을 해요. "이 파일에서 저 코드 좀 가져다주세요"라고 하면, require가 그 파일에 가서 코드를 가져다줘요.

그런데 require에는 특별한 기능이 있어요. 한 번 배달받은 음식(코드)은 냉장고에 보관해두었다가, 같은 음식이 또 필요하면 새로 주문하지 않고 냉장고에서 꺼내 쓸 수 있어요.

🎯 왜 require를 사용할까요?

1. 코드를 재사용할 수 있어요

한 번 만든 좋은 코드를 여러 파일에서 복사해서 붙여넣을 필요 없이, require로 가져와서 사용하면 돼요.

2. 파일을 깔끔하게 정리할 수 있어요

모든 코드를 하나의 파일에 다 넣으면 너무 복잡해지지만, 기능별로 파일을 나누고 필요할 때 require로 가져와서 쓰면 훨씬 정리가 잘 돼요.

3. 다른 사람이 만든 도구를 쉽게 사용할 수 있어요

인터넷에 있는 유용한 코드들을 쉽게 가져다 쓸 수 있어요.

4. 메모리를 절약할 수 있어요

같은 코드를 여러 번 가져와도 메모리에는 하나만 저장되어 있어요.

⚙️ require 사용 방법

require를 사용하는 방법은 생각보다 간단해요.

방법 1: 전체 모듈 가져오기

// greet.js
module.exports = function(name) {
  return `안녕하세요, ${name}님!`;
};

// app.js
const greet = require('./greet.js');
console.log(greet("민수")); // "안녕하세요, 민수님!"

방법 2: 여러 기능이 있는 모듈 가져오기

// math.js
module.exports = {
  add: function(a, b) { return a + b; },
  subtract: function(a, b) { return a - b; }
};

// app.js
const math = require('./math.js');
console.log(math.add(5, 3));      // 8
console.log(math.subtract(5, 3)); // 2

방법 3: 필요한 부분만 골라서 가져오기

// calculator.js
exports.multiply = function(a, b) { return a * b; };
exports.divide = function(a, b) { return a / b; };

// app.js
const { multiply, divide } = require('./calculator.js');
console.log(multiply(4, 3)); // 12
console.log(divide(12, 3));  // 4

주의사항:

  • ./는 "현재 폴더에서"라는 뜻이에요
  • ../는 "상위 폴더에서"라는 뜻이에요

🧪 실제 예제로 연습하기

🔹 예제 1: 학교 급식 메뉴 관리

// menu.js
const weeklyMenu = {
  "월요일": "김치찌개, 밥, 계란말이",
  "화요일": "카레라이스, 치킨너겟",
  "수요일": "비빔밥, 미역국",
  "목요일": "스파게티, 마늘빵",
  "금요일": "불고기덮밥, 김치"
};

function getMenuByDay(day) {
  if (weeklyMenu[day]) {
    return `${day}: ${weeklyMenu[day]}`;
  } else {
    return `${day}은(는) 급식이 없는 날입니다.`;
  }
}

function getWeeklyMenu() {
  let menuList = "📅 이번 주 급식 메뉴:\n";
  for (let day in weeklyMenu) {
    menuList += `${day}: ${weeklyMenu[day]}\n`;
  }
  return menuList;
}

module.exports = {
  getMenuByDay: getMenuByDay,
  getWeeklyMenu: getWeeklyMenu
};

// school-app.js
const menu = require('./menu.js');

console.log("🍽️ 학교 급식 정보 시스템");
console.log(menu.getMenuByDay("수요일"));  // "수요일: 비빔밥, 미역국"
console.log(menu.getWeeklyMenu());        // 전체 주간 메뉴

🔹 예제 2: 게임 캐릭터 관리

// character.js
function Character(name, level) {
  this.name = name;
  this.level = level || 1;
  this.hp = level * 20;
  this.exp = 0;
}

Character.prototype.getInfo = function() {
  return `${this.name} | 레벨: ${this.level} | HP: ${this.hp}`;
};

Character.prototype.levelUp = function() {
  this.level++;
  this.hp += 20;
  return `레벨업! 현재 레벨: ${this.level}`;
};

Character.prototype.gainExp = function(amount) {
  this.exp += amount;
  if (this.exp >= this.level * 100) {
    this.exp = 0;
    return this.levelUp();
  }
  return `경험치 ${amount} 획득!`;
};

module.exports = Character;

// game.js
const Character = require('./character.js');

console.log("⚔️ 게임 시작!");

const player = new Character("용사", 2);
console.log(player.getInfo());      // "용사 | 레벨: 2 | HP: 40"
console.log(player.gainExp(150));   // "경험치 150 획득!"
console.log(player.gainExp(50));    // "레벨업! 현재 레벨: 3"

🚨 자주 하는 실수들

❌ 실수 1: 경로 표시 빼먹기

// 잘못된 방법
const math = require('math.js');     // ❌ ./ 빼먹음!

// 올바른 방법
const math = require('./math.js');   // ✅ 경로 표시 필요!

❌ 실수 2: 파일 이름 오타

// 잘못된 방법
const calc = require('./calculater.js');  // ❌ 오타!

// 올바른 방법
const calc = require('./calculator.js');  // ✅ 정확한 파일명!

✏️ 연습 문제를 시작하기 전에

이제 여러분이 직접 require를 사용해볼 시간이에요. 처음에는 경로를 헷갈리거나 파일명을 틀릴 수도 있어요. 마치 새로운 동네에 이사를 가서 처음에는 마트가 어디 있는지 몰라서 헤매는 것처럼 말이에요.

하지만 몇 번 사용하다 보면 자연스럽게 익숙해질 거예요. 그리고 이 방법을 익혀두면 나중에 큰 프로젝트를 할 때 정말 유용하게 쓸 수 있어요. 천천히 따라해보세요.

문제 1: 동물 소리 모듈 만들기

// animals.js
exports.dog = function() {
  return "멍멍!";
};

exports.cat = function() {
  return "야옹!";
};

exports.cow = function() {
  return "음매!";
};

// zoo.js
const animals = require('./animals.js');

console.log("🐕 개:", animals.dog());  // "개: 멍멍!"
console.log("🐱 고양이:", animals.cat()); // "고양이: 야옹!"
console.log("🐄 소:", animals.cow());   // "소: 음매!"

문제 2: 필요한 부분만 가져오기

// shapes.js
exports.circle = function(radius) {
  return 3.14 * radius * radius;
};

exports.rectangle = function(width, height) {
  return width * height;
};

exports.triangle = function(base, height) {
  return (base * height) / 2;
};

// area-calculator.js
const { circle, rectangle } = require('./shapes.js');

console.log("원 넓이:", circle(5));         // 78.5
console.log("사각형 넓이:", rectangle(4, 6)); // 24

📝 정리하기

오늘은 require에 대해 배웠어요:

  1. require는 다른 파일에서 만든 코드를 가져오는 명령어예요
  2. 모듈 캐싱 기능으로 같은 코드를 여러 번 가져와도 메모리를 절약해요
  3. 구조 분해 할당으로 필요한 부분만 골라서 가져올 수 있어요
  4. 경로 표시를 정확히 해야 해요 (./, ../)
  5. module.exports와 함께 사용해서 코드를 모듈화할 수 있어요

require를 잘 사용하면 Node.js에서 더 체계적인 프로그램을 만들 수 있어요!

✅ 학습 완료 체크리스트

학습 내용 이해했나요?
require의 기본 개념
전체 모듈과 부분 모듈 가져오기
구조 분해 할당 사용
파일 경로 정확히 표시하기
실전 예제 따라하기

📂 마무리 정보

오늘 배운 17.3.2 내용이 여러분의 자바스크립트 지식 상자에 잘 저장되었나요? 다음 시간에는 더 재미있는 내용으로 만나요!

기억할 점: require는 동네 마트의 배달 서비스처럼 필요한 코드를 편리하게 가져다주는 고마운 도구예요!



🚀 더 체계적인 JavaScript 학습을 원하신다면?
이 포스팅에서 다룬 내용을 실제로 실습해보세요!
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
📝 실시간 코드 실행 📊 학습 진도 관리 👥 체계적 커리큘럼
📚 171개 체계적 학습레슨 · 📋 855개 4지선다 연습문제 · 🆓 완전 무료 · ⚡ 즉시 시작