BioPlayground

🧬
목록으로

코드 모듈화 — 파일 분리와 구조 정리

하나의 거대한 파일 대신 여러 파일로 코드를 나누는 이유와 방법을 Node.js 예시로 배웁니다.

중급
|
8
|
검증 완료 (2026-07)
코드 구조모듈파일 분리재사용유지보수
진행률0/18 (0%)

코드 모듈화 — 파일 분리와 구조 정리

이 토픽을 마치면

코드를 왜 여러 파일로 나눠야 하는지 이해하고, Node.js의 require/module.exports 패턴으로 직접 파일을 분리할 수 있습니다.


왜 파일 하나에 다 쓰면 안 되는가

프로젝트가 작을 때는 app.js 하나에 모든 코드를 넣어도 됩니다. 하지만 코드가 500줄, 1000줄을 넘어가면 문제가 생깁니다.

  • 찾기 어려움: "로그인 로직이 어디였지?" → 스크롤을 한참 내려야 함
  • 충돌: 여러 사람이 같은 파일을 수정하면 git merge 충돌이 빈번
  • 재사용 불가: A 프로젝트에서 만든 유틸 함수를 B 프로젝트에서 쓰려면 복사-붙여넣기

모듈화는 이 문제를 해결합니다. 하나의 파일 = 하나의 역할로 분리하는 것입니다.


Node.js에서 파일 분리하기

Node.js는 module.exports로 내보내고, require()로 가져옵니다.

javascript
// math.js — 계산 유틸리티 모듈
function add(a, b) {
  return a + b;
}

function multiply(a, b) {
  return a * b;
}

module.exports = { add, multiply };
javascript
// app.js — 메인 파일에서 가져다 쓰기
const math = require('./math');

console.log(math.add(3, 5));       // 8
console.log(math.multiply(4, 7));  // 28

math.js는 계산만 담당합니다. app.js는 그 함수를 가져다 쓸 뿐, 계산 로직을 알 필요가 없습니다. 이것이 관심사 분리(Separation of Concerns) 원칙입니다.


실전 폴더 구조

규모가 커지면 폴더로 묶습니다. 아래는 Express 프로젝트의 전형적인 구조입니다.

text
project/
├── app.js              # 진입점 — 서버 시작
├── routes/
│   ├── users.js        # /users 관련 라우트
│   └── posts.js        # /posts 관련 라우트
├── controllers/
│   ├── userController.js
│   └── postController.js
├── models/
│   └── db.js           # 데이터베이스 연결
└── utils/
    └── helpers.js      # 공용 유틸리티 함수

routes/는 URL 경로를, controllers/는 비즈니스 로직을, models/는 데이터 처리를 담당합니다. 각 폴더가 하나의 역할을 맡으므로, "사용자 관련 버그"가 나오면 routes/users.jscontrollers/userController.js만 보면 됩니다.


ES Modules — 최신 문법

Node.js 14+ 또는 브라우저에서는 import/export 문법(ES Modules)을 쓸 수 있습니다.

javascript
// math.mjs (또는 package.json에 "type": "module" 설정)
export function add(a, b) {
  return a + b;
}

export function multiply(a, b) {
  return a * b;
}
javascript
// app.mjs
import { add, multiply } from './math.mjs';

console.log(add(3, 5));       // 8
console.log(multiply(4, 7));  // 28

requireimport는 같은 목적이지만, import는 정적 분석이 가능해서 번들러(Webpack, Vite)가 불필요한 코드를 제거(tree-shaking)할 수 있습니다. 새 프로젝트에서는 ES Modules를 권장합니다.


핵심 정리

질문
왜 나누나?찾기 쉽고, 재사용 가능하고, 협업 충돌 줄임
어떻게 나누나?module.exports + require (CommonJS) 또는 export + import (ESM)
기준은?하나의 파일 = 하나의 역할 (관심사 분리)
폴더 구조는?routes / controllers / models / utils 등 역할별 분류

파일을 나누는 습관은 코드가 100줄일 때부터 시작하는 것이 좋습니다. 나중에 1000줄이 되고 나서 나누려면 이미 엉켜 있어서 고통스럽습니다.