Node.js의 기본적인 사용법에 대해 알아봅니다.

로컬 실행

node test.js

명령줄 인자 (Arguments)

process.argv.forEach((val, index) => {
    console.log(`${index}: ${val}`);
});

결과:

node chrome.js aa
0: /usr/local/bin/node
1: /path/to/chrome.js
2: aa

로그 출력

console.log('This example is different!');
console.log("Example app listening at http://%s:%s", host, port);

이벤트 (Observer 패턴)

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 이벤트 핸들러 생성
var myEventHandler = function () {
    console.log('I hear a scream!');
}

// 이벤트에 핸들러 할당
eventEmitter.on('scream', myEventHandler);

// 'scream' 이벤트 발생
eventEmitter.emit('scream');

프로세스 종료

process.exit([code])

모듈 시스템

Node.js는 모듈 시스템을 통해 코드를 분리하고 재사용합니다.

CommonJS (require/module.exports)

// math.js - 모듈 정의
function add(a, b) {
    return a + b;
}

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

module.exports = { add, multiply };

// app.js - 모듈 사용
var math = require('./math');
console.log(math.add(2, 3));       // 5
console.log(math.multiply(4, 5));  // 20

내장 모듈 사용

Node.js는 다양한 내장 모듈을 제공합니다:

var fs = require('fs');       // 파일 시스템
var path = require('path');   // 경로 처리
var http = require('http');   // HTTP 서버/클라이언트
var os = require('os');       // 운영 체제 정보
var url = require('url');     // URL 파싱

파일 시스템 (fs 모듈)

파일 읽기

var fs = require('fs');

// 비동기 읽기
fs.readFile('data.txt', 'utf8', function(err, data) {
    if (err) throw err;
    console.log(data);
});

// 동기 읽기
var data = fs.readFileSync('data.txt', 'utf8');
console.log(data);

파일 쓰기

// 비동기 쓰기 (파일 생성 또는 덮어쓰기)
fs.writeFile('output.txt', 'Hello Node.js!', function(err) {
    if (err) throw err;
    console.log('File written successfully');
});

// 파일에 내용 추가
fs.appendFile('output.txt', '\nNew line', function(err) {
    if (err) throw err;
    console.log('Content appended');
});

디렉토리 작업

// 디렉토리 생성
fs.mkdir('new_folder', { recursive: true }, function(err) {
    if (err) throw err;
});

// 디렉토리 내용 읽기
fs.readdir('./', function(err, files) {
    if (err) throw err;
    files.forEach(function(file) {
        console.log(file);
    });
});

// 파일/디렉토리 삭제
fs.unlink('file.txt', function(err) {
    if (err) throw err;
});

HTTP 서버 생성

Node.js의 핵심 기능 중 하나는 HTTP 서버를 쉽게 생성할 수 있다는 점입니다:

var http = require('http');

var server = http.createServer(function(req, res) {
    // 요청 URL에 따라 라우팅
    if (req.url === '/') {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end('<h1>Home Page</h1>');
    } else if (req.url === '/api/data') {
        res.writeHead(200, {'Content-Type': 'application/json'});
        res.end(JSON.stringify({ message: 'Hello API' }));
    } else {
        res.writeHead(404, {'Content-Type': 'text/html'});
        res.end('<h1>404 Not Found</h1>');
    }
});

server.listen(3000, function() {
    console.log('Server running on port 3000');
});

환경 변수

// 환경 변수 읽기
var port = process.env.PORT || 3000;
var nodeEnv = process.env.NODE_ENV || 'development';

console.log('Port:', port);
console.log('Environment:', nodeEnv);

실행 시 환경 변수 설정:

PORT=8080 NODE_ENV=production node app.js

비동기 처리 패턴

Node.js에서 비동기 처리는 핵심 개념입니다.

콜백 패턴

function fetchData(callback) {
    setTimeout(function() {
        callback(null, 'Data loaded');
    }, 1000);
}

fetchData(function(err, data) {
    if (err) {
        console.error(err);
        return;
    }
    console.log(data);
});

Promise 패턴

function fetchData() {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve('Data loaded');
        }, 1000);
    });
}

fetchData()
    .then(function(data) {
        console.log(data);
    })
    .catch(function(err) {
        console.error(err);
    });

async/await 패턴

async function loadData() {
    try {
        var data = await fetchData();
        console.log(data);
    } catch (err) {
        console.error(err);
    }
}

loadData();

NPM (Node Package Manager)

프로젝트 초기화

npm init          # 대화형 초기화
npm init -y       # 기본값으로 초기화

패키지 설치

npm install express           # 프로덕션 의존성
npm install --save-dev jest   # 개발 의존성
npm install -g nodemon        # 글로벌 설치

자주 사용하는 명령어

명령어 설명
npm install package.json의 모든 의존성 설치
npm start package.json의 start 스크립트 실행
npm test 테스트 스크립트 실행
npm run <script> 커스텀 스크립트 실행
npm list 설치된 패키지 목록
npm outdated 업데이트 가능한 패키지 확인

에러 처리

Node.js에서 에러 처리는 애플리케이션의 안정성을 위해 매우 중요합니다:

// 처리되지 않은 예외 캐치 (마지막 방어선)
process.on('uncaughtException', function(err) {
    console.error('Uncaught Exception:', err.message);
    process.exit(1);
});

// 처리되지 않은 Promise rejection 캐치
process.on('unhandledRejection', function(reason, promise) {
    console.error('Unhandled Rejection:', reason);
});

uncaughtException 이벤트는 마지막 방어선으로만 사용하고, 가능한 한 try-catch나 Promise의 catch 핸들러로 에러를 처리하는 것이 좋습니다.