Node.js


📦 NPM

Node Package Manager

  • NPM은 노드의 패키지를 관리하는 매니저
  • npm init -y로 패키기 관리 시작!
  • pakage.json은 node.js 관련 모든 정보를 담고 있음
  • npm install 패키지이름
  • npm uninstall 패키지이름
  • pakage.json 파일만 카피하여 다른 폴더에 두고 npm install만 하게 되면 해당 pakage.json이 가진 패키지를 자동으로 모두 설치함
  • 🌰 File-system

    Node.js의 기본 모듈

    파일 읽기

  • fs.readFile(‘파일위치’, ‘유니코드 포맷’, callback(err, data) {})
  • const fs = require('fs');
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    console.log(err);
    } else {
    console.log(data);
    }
    });

    파일 쓰기

  • fs.writeFile(’작성할 파일명’, ‘작성할 내용’, ‘유니코드 포맷’, callback(err) {})
  • const fs = require('fs');
    const str = '파일 쓰기 테스트';
    fs.writeFile('test1.txt', str, 'utf-8', (err) => {
    if (err) {
    console.log(err);
    } else {
    console.log('파일 작성 완료!');
    }
    });

    fs와 비동기 프로그래밍

  • node.js는 비동기적으로 file을 읽고 쓴다.
  • 예시로 다음과 같은 상황에선 실행 순서가 항상 바뀌게 된다.
  • const fs = require('fs');
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('1번', data.toString());
    });
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('2번', data.toString());
    });
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('3번', data.toString());
    });
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('4번', data.toString());
    });
  • 위와 같은 결과가 나오게되면 의도와 다른 결과가 나올 수 있다.
  • 이를 동기적으로 실행시키려면 callback으로 구현하는 방법이 있다.
  • const fs = require('fs');
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('1번', data.toString());
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('2번', data.toString());
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('3번', data.toString());
    fs.readFile('test.txt', 'utf-8', (err, data) => {
    if (err) {
    throw err;
    }
    console.log('4번', data.toString());
    });
    });
    });
    });
  • 위 코드는 1, 2, 3, 4를 동기적으로 실행하게 된다.
  • 그러나 위와 같은 코드는 ‘콜백 지옥’이라고 불린다.
  • 가독성이 매우 떨어지고 코드 수정이 어렵다.
  • 이를 해결하기 위해 등장한 것이 promise 문법이다.
  • const fs = require('fs').promises;
    fs.readFile('test.txt', 'utf-8')
    .then((data) => {
    console.log('1번', data.toString());
    return fs.readFile('test.txt', 'utf-8');
    })
    .then((data) => {
    console.log('2번', data.toString());
    return fs.readFile('test.txt', 'utf-8');
    })
    .then((data) => {
    console.log('3번', data.toString());
    return fs.readFile('test.txt', 'utf-8');
    })
    .then((data) => {
    console.log('4번', data.toString());
    return fs.readFile('test.txt', 'utf-8');
    })
    .catch((err) => {
    throw err;
    });
  • 부등호 모양으로 들어가지 않아 가독성이 더 좋고 코드 수정이 편하다는 것을 알 수 있다.
  • Async / Await 구문을 사용하면 다음과 같다.
  • const fs = require('fs').promises;
    async function main() {
    let data = await fs.readFile('test.txt', 'utf-8');
    console.log('1번', data);
    data = await fs.readFile('test.txt', 'utf-8');
    console.log('2번', data);
    data = await fs.readFile('test.txt', 'utf-8');
    console.log('3번', data);
    data = await fs.readFile('test.txt', 'utf-8');
    console.log('4번', data);
    }
    main();
  • ES6에서 도입된 문법이니 만큼 가장 간결하다는 것을 알 수 있다.
  • 🥐 모듈 빼기, 가져오기

    // 모듈로 만들 파일
    // ...
    module.exports = router;
    // 모듈을 가져올 파일
    const userRouter = require('./routes/users');
    app.use('/users', userRouter);

    🥪 DOTENV

  • DOTENV는 중요한 정보(서버 접속 정보 등)를 외부 코드에서 확인이 불가능 하도록 도와주는 모듈이다.
  • 모듈을 호출해준다.
  • require('dotenv').config();
  • .env 파일을 최상당 폴더에 만들고 중요한 정보를 .env 파일에 저장한다.
  • PORT = 4000
    MYSQL_USER = root
    MYSQL_PASSWORD = 12341234
    MYSQL_DB = mydb
  • 이를 .gitignore에 추가해준다.
  • 그렇게 되면 깃허브에는 올라가지 않고 코드에서 사용할 수 있다.