데브코스 20일차 ( 24.11.08 금 ) Node JS

워니·2024년 11월 10일
0

Programmers Front-end

목록 보기
20/27

[Section 01] Node.JS 기본


< 01. REPL 사용하기 >

  • REPL(읽기-평가-출력 루프)은 개발자가 자바스크립트 코드를 즉시 실행하고 결과를
    확인할 수 있는 환경

1. REPL 사용 가이드

1.1. 시작하기

  • Node.js REPL을 시작하려면 터미널이나 명령 프롬프트에서 node 명령어를 입력합니다.
node
  • REPL이 시작되면 다음과 같은 프롬프트가 표시됩니다:
>
  • 이제 JavaScript 코드를 입력할 수 있습니다.

1.2. 기본 명령어 실행

  • REPL 프롬프트에서 JavaScript 코드를 입력하고 Enter 키를 누르면 결과가 출력됩니다.
> 1 + 1
2
> console.log("Hello, World!")
Hello, World!

1.3. 변수와 함수 사용

  • 변수와 함수를 정의하고 사용할 수 있습니다.
> const greet = (name) => `Hello, ${name}!`;
> greet("Alice")
'Hello, Alice!'

1.4. 멀티라인 코드 작성

  • REPL에서 멀티라인 코드를 작성할 경우, 각 줄의 끝에 세미콜론(;)을 사용하지 않고 Enter 키를 누르면 자동으로 다음 줄로 넘어갑니다. 만약 괄호나 중괄호가 열려 있다면, Enter를 누르면 계속 입력할 수 있습니다.
> function add(a, b) {
...   return a + b;
... }
> add(2, 3)
5

1.5. 내장 모듈 사용

  • Node.js의 내장 모듈을 REPL에서 사용할 수 있습니다. 예를 들어, fs 모듈을 사용하여 파일 시스템 작업을 수행할 수 있습니다.
> const fs = require('fs');
> fs.readdirSync('.')
[ 'file1.txt', 'file2.txt', ... ]

1.6. 명령어 히스토리

  • REPL에서는 이전에 입력한 명령어를 위아래 화살표 키를 사용하여 쉽게 탐색할 수 있습니다.

1.7. 종료하기

  • REPL을 종료하려면 다음 중 하나를 사용합니다:
    • Ctrl + C를 두 번 누르기
    • .exit 입력 후 Enter 누르기

< 02. JS 파일 실행하기 >

1. JavaScript 파일 생성

  • 실행할 JavaScript 파일을 생성합니다. 텍스트 편집기를 열고 아래와 같이 간단한 JavaScript 코드를 작성해 보세요.

예시: app.js 파일

// app.js
console.log("Hello, Node.js!");
  • 이 파일을 원하는 위치에 저장합니다.

2. 터미널에서 파일 실행하기

  • 터미널(또는 명령 프롬프트)을 열고, JavaScript 파일이 있는 디렉토리로 이동합니다. cd 명령어를 사용하여 디렉토리를 변경합니다.
cd /path/to/your/file
  • 그 후, 다음 명령어를 입력하여 JavaScript 파일을 실행합니다:
node app.js

3. 결과 확인

  • 이제 터미널에 다음과 같은 출력이 나타납니다:
Hello, Node.js!
  • 이것은 JavaScript 파일이 성공적으로 실행되었음을 의미합니다.

4. 인수 전달하기

  • Node.js를 통해 JavaScript 파일에 인수를 전달할 수 있습니다. 이를 통해 스크립트를 더 유용하게 만들 수 있습니다.

예시: 인수 처리

app.js 파일을 수정하여 인수를 출력해 보겠습니다:

// app.js
const args = process.argv.slice(2);
console.log("Arguments:", args);
  • 이제 인수를 추가하여 파일을 실행합니다:
node app.js arg1 arg2
  • 출력 결과는 다음과 같습니다:
Arguments: [ 'arg1', 'arg2' ]

5. 모듈 사용하기

  • Node.js에서는 여러 모듈을 사용할 수 있습니다. 기본 내장 모듈을 사용하여 파일 시스템 작업 등을 수행해 보겠습니다.

예시: 파일 읽기

readFile.js 파일을 생성하고 다음 코드를 작성합니다:

// readFile.js
const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

example.txt 파일을 같은 디렉토리에 만들고 몇 가지 텍스트를 추가합니다. 그런 다음, 다음 명령어로 파일을 실행합니다:

node readFile.js

6. 비동기 작업 처리

  • Node.js는 비동기 프로그래밍을 지원합니다. 비동기 코드를 작성하는 방법은 다음과 같습니다.

예시: 비동기 함수

// asyncExample.js
const fs = require('fs').promises;

async function readFileAsync() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readFileAsync();
  • 이 파일을 실행하면 example.txt의 내용이 출력됩니다.

< 03. Node.JS 모듈 만들기 >

1. 모듈이란?

  • 모듈은 관련된 코드와 기능을 그룹화하여 재사용성을 높이고, 코드의 가독성과 관리성을 향상시키기 위해 사용됩니다. Node.js에서는 모듈을 통해 여러 파일로 코드를 나눌 수 있습니다.

2. 모듈 생성하기

2.1 기본 모듈 생성

  • 모듈은 JavaScript 파일로 만들 수 있으며, module.exports를 사용하여 외부에서 사용할 수 있는 기능을 정의합니다.

예시: math.js 파일

// math.js
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;

module.exports = {
  add,
  subtract
};
  • 이 파일은 두 개의 함수(addsubtract)를 외부로 내보냅니다.

2.2 모듈 사용하기

  • 모듈을 사용하려면 require() 함수를 사용하여 모듈을 가져옵니다.

예시: app.js 파일

// app.js
const math = require('./math');

const sum = math.add(5, 3);
const difference = math.subtract(5, 3);

console.log(`Sum: ${sum}`);
console.log(`Difference: ${difference}`);

2.3 실행하기

  • 터미널에서 app.js를 실행하여 결과를 확인합니다:
node app.js
  • 출력 결과는 다음과 같습니다:
Sum: 8
Difference: 2

3. 내장 모듈 사용하기

  • Node.js는 다양한 내장 모듈을 제공합니다. 이들 모듈을 사용하여 파일 시스템, HTTP 서버 등을 쉽게 구현할 수 있습니다.

    3.1 파일 시스템 모듈 사용 예시

    예시: fileSystem.js 파일
    // fileSystem.js
    const fs = require('fs');
    
    fs.writeFileSync('example.txt', 'Hello, Node.js!');
    console.log('File written successfully');
    • 이 코드를 실행하면 example.txt 파일이 생성됩니다.

4. 패키지 모듈 만들기

  • Node.js에서 npm을 사용하여 패키지를 만들 수 있습니다. 다음 단계로 패키지를 만들고 배포하는 방법을 알아보겠습니다.

    4.1 패키지 초기화

    • 프로젝트 디렉토리를 만들고 npm init 명령어를 사용하여 package.json 파일을 생성합니다.

      mkdir my-module
      cd my-module
      npm init -y

      4.2 모듈 파일 작성

    • index.js 파일을 만들고 모듈 코드를 작성합니다.

      예시: index.js

      // index.js
      const greet = (name) => `Hello, ${name}!`;
      module.exports = greet;

      4.3 패키지 배포하기

    1. npm 로그인: npm 계정이 필요합니다. npm login 명령어를 사용하여 로그인합니다.

    2. 조직(Organizations)를 생성합니다.

    3. package.json 파일의 name 값을 생성한 조직 이름/모듈이름 형태로 바꿔줍니다.(ex 조직이름이 kisudevel 이라면 @kisudevel/my-module

    4. 패키지 배포: npm publish 명령어로 패키지를 배포합니다.

      image.png

    • 이제 다른 프로젝트에서 이 모듈을 설치하고 사용할 수 있습니다.

      4.4 패키지 사용하기

    • 다른 프로젝트에서 이 모듈을 설치하려면 다음 명령어를 사용합니다:

      npm install my-module
    • 설치 후, 다음과 같이 사용할 수 있습니다:

      const greet = require('@kisudevel/my-module');
      console.log(greet('Alice')); // Hello, Alice!

[Section 02] Node.JS 심화


04. Node.JS 내장 객체

  • Node.js 환경에서 기본으로 제공되는 객체
  • 별도로 require이나 import와 같은 문법을 사용하지 않아도 접근해서 사용 가능
객체/함수설명예제
global전역 객체global.someVar = 'Hello';
console출력 및 디버깅 도구console.log('로그');
setTimeout일정 시간 후 1회 실행setTimeout(() => {}, 1000);
setInterval일정 간격 반복 실행setInterval(() => {}, 1000);
__filename현재 파일의 절대 경로console.log(__filename);
__dirname현재 파일의 디렉터리 경로console.log(__dirname);
module현재 모듈 객체module.exports = {}
exports모듈 내보내기 객체exports.someFunc = () => {};
require모듈 가져오기const fs = require('fs');
process프로세스 관련 정보 및 제어console.log(process.platform);
process.env환경 변수 접근process.env.NODE_ENV
process.nextTick이벤트 루프가 끝난 후 콜백 실행process.nextTick(() => {});
process.exit프로세스 종료process.exit(0);

1. global 객체

  • Node.js에서는 모든 모듈이 독립된 스코프를 가지지만,
    global 객체에 등록된 변수나 함수는 어디서나 접근 가능
  • 브라우저의 window 객체와 유사
global.appName = 'My App';
console.log(appName); // 'My App'
  • Tip: global 객체에 중요한 값을 등록하는 것은 권장되지 않습니다. 모듈 간의 의존성 문제를 초래할 수 있기 때문입니다.

2. console 객체

  • 다양한 출력 방법 제공
  • 주요 메서드 및 예
console.log('일반 로그');           // 일반 출력
console.error('에러 메시지');        // 에러 출력
console.warn('경고 메시지');         // 경고 출력
console.info('정보 메시지');         // 정보 출력
console.table([{ name: 'Node' }, { name: 'React' }]);  // 객체 표 형태로 출력

console.time('timer');  // 타이머 시작
setTimeout(() => {
  console.timeEnd('timer');  // 타이머 종료 및 경과 시간 출력
}, 500);

3. timer 함수

  • 타이머를 통해 비동기 작업 수행 가능
  • 브라우저에서는 window 객체이지만, node에서는 global 객체에 들어가 있음
  • 주요 타이머 함수 설명 및 예제

3.1. setTimeout

  • 설명: 지정된 시간 후에 콜백 함수를 한 번 실행합니다.
setTimeout(() => console.log('2초 후 실행'), 2000);

3.2. setInterval

  • 설명: 주기적으로 콜백 함수를 실행합니다.
let count = 0;
const interval = setInterval(() => {
  console.log(`1초마다 실행: ${++count}`);
  if (count === 5) clearInterval(interval);  // 5회 후 중단
}, 1000);

3.3. setImmediate

  • 설명: 이벤트 루프의 현재 작업이 끝난 직후 실행됩니다.
setImmediate(() => console.log('이벤트 루프 종료 후 즉시 실행'));

4. 공통 속성 __filename / __dirname

  • __filename: 현재 파일의 절대 경로
  • __dirname: 현재 디렉터리의 절대 경로
  • 예제
console.log(__filename);  // /path/to/your/file.js
console.log(__dirname);   // /path/to/your
  • 실용 예제: 파일 경로 조작 시 사용됩니다.
const path = require('path');
const filePath = path.join(__dirname, 'data.json');
console.log(filePath);  // /path/to/your/data.json

5. module 객체와 exports 객체

  • 모듈은 Node.js의 핵심 개념으로, 각 파일은 독립된 모듈로 간주됩니다.
  • 예제: 모듈 내보내기와 가져오기
// a.js
const greeting = 'Hello';
module.exports = { greeting };
// b.js
const { greeting } = require('./a');
console.log(greeting);  // 'Hello'
  • Tip: exportsmodule.exports의 참조입니다. 하지만 객체 전체를 덮어쓸 때는 module.exports를 사용해야 합니다.

6. require 함수

  • require는 다른 모듈이나 파일을 가져올 때 사용합니다.
  • 예제
const os = require('os');  // 내장 모듈
console.log(os.platform());  // 'win32' 또는 'linux'

const customModule = require('./customModule');  // 사용자 정의 모듈
console.log(customModule);
  • Tip: require는 캐싱되므로 같은 모듈이 여러 번 호출되어도 처음 한 번만 로드됩니다.

7. process 객체

  • process는 현재 실행 중인 Node.js 프로세스에 대한 정보를 제공합니다.
  • 주요 속성과 메서드

7.1. process.env: 환경 변수 접근

process.env.NODE_ENV = 'development';
if (process.env.NODE_ENV === 'development') {
  console.log('개발 모드');
} else {
  console.log('프로덕션 모드');
}
  • Tip: 환경 변수는 애플리케이션의 설정을 외부에서 제어할 수 있는 중요한 방법입니다.
  • 초기값 지정 방법 NODE_ENV=development node app.js
    • 터미널에 NODE_ENV=development(원하는 초기값) node app.js(파일명) 작성
  • 환경설정 파일 : npm init -y
    • package.json파일을 빠르게 생성하는 명령어
    • -y 옵션을 사용하면 기본 설정을 자동으로 채택
    • package.json파일을 생성할 때 하나씩 설정할 필요 없이 기본값으로 자동 생성
    • 생성 이후 파일을 열어 필요한 설정을 수동으로 변경 가능
    • 이 파일은 프로젝트 환경 설정에 중요한 역할을 함

7.2. process.cwd(): 현재 작업 디렉터리

  • __dirname과 같음
  • 단, process.cwd()는 프로그램이 실행된 작업 디렉토리를 반환
    • 프로그램이 실행될 때 기준이 되는 디렉토리를 말하며, 프로그램을 실행한 위치에 따라 값이 달라질 수 있음
  • __dirname은 현재 파일이 위치한 디렉토리 경로 반환
    • 파일 자체의 위치와 관련되어 있어, 프로그램을 실행한 위치와 관계 없음
console.log(process.cwd());  // 현재 실행 중인 디렉터리 경로

7.3. process.platform: 운영 체제 확인

console.log(process.platform);  // 실행 중인 운영 체제 확인
// 'win32', 'darwin', 'linux'

7.4. process.nextTick(): 현재 이벤트 루프가 끝난 후 실행

console.log('첫 번째');
process.nextTick(() => console.log('nextTick 실행'));
console.log('두 번째');
  • 출력 결과:
    첫 번째
    두 번째
    nextTick 실행

7.5. process.exit(): 프로세스 종료

if (process.env.NODE_ENV !== 'production') {
  console.error('개발 모드에서는 종료할 수 없습니다.');
  process.exit(1);  // 에러 코드 1로 종료
}

< 05. Node.JS 내장 모듈 >

  • Node JS에서 제공하는 모듈화 된 코드를 의미, 라이브러리(코드 조각)
  • require()로 불러와서 사용해야 됨
  • fs, path, http, url, os
  • 터미널 창에 npm install dotenv 작성
  • 환경변수를 다룰 때 도움을 주는 라이브러리 (외부 모듈)

1. OS 모듈 (os)

  • 운영 체제 관련 정보를 제공합니다.
  • 주요 메서드와 예제
const os = require('os');

console.log('플랫폼:', os.platform()); // 'win32', 'linux', 'darwin' 등
console.log('CPU 아키텍처:', os.arch()); // 'x64' 등
console.log('CPU 정보:', os.cpus()); // CPU 코어 정보
console.log('메모리(총량):', os.totalmem()); // 총 메모리 (바이트 단위)
console.log('메모리(사용 가능):', os.freemem()); // 사용 가능한 메모리
console.log('네트워크 인터페이스:', os.networkInterfaces()); // 네트워크 정보
console.log('호스트 이름:', os.hostname()); // 호스트 이름
console.log('시스템 업타임:', os.uptime(), '초'); // 시스템 가동 시간
  • 활용 예제: 서버 환경의 CPU와 메모리 정보를 확인하여 서버 최적화에 사용할 수 있습니다.

2. Path 모듈 (path)

  • 파일 및 디렉터리 경로를 조작하는 유틸리티입니다.
  • 주요 메서드와 예제
const path = require('path');

const filePath = '/user/local/bin/file.txt';

console.log('확장자:', path.extname(filePath)); // '.txt'
console.log('디렉터리명:', path.dirname(filePath)); // '/user/local/bin'
console.log('파일명:', path.basename(filePath)); // 'file.txt'
console.log('절대 경로:', path.resolve('bin', 'file.txt')); // /current/dir/bin/file.txt
console.log('경로 결합:', path.join('/user', 'local', 'bin')); // '/user/local/bin'
  • 활용 예제: 파일 및 디렉터리 경로를 동적으로 생성하고 조작할 때 사용합니다.

3. URL 모듈 (url)

  • URL 문자열을 파싱하고 조작합니다.
  • 일반적인 주소가 url
  • url + ? ~~ 의미를 부여해주는 문자열을 쿼리스트링, 물음표 붙여야 됨
  • 주요 메서드와 예제
const { URL } = require('url');

const myURL = new URL('https://example.com:8000/path?name=John#fragment');

console.log('호스트:', myURL.host); // 'example.com:8000'
console.log('경로명:', myURL.pathname); // '/path'
console.log('쿼리:', myURL.searchParams.get('name')); // 'John'
console.log('프래그먼트:', myURL.hash); // '#fragment'
  • 활용 예제: 웹 서버에서 URL 파라미터를 쉽게 추출할 수 있습니다.

4. Querystring 모듈 (querystring)

  • 쿼리 문자열을 파싱하고 조작합니다.
  • 주요 메서드와 예제
const querystring = require('querystring');

const query = 'name=John&age=30';
const parsed = querystring.parse(query);

console.log(parsed); // { name: 'John', age: '30' }
console.log(querystring.stringify(parsed)); // 'name=John&age=30'
// url + queryString 조합
const { URL } = require('url');
const querystring = require('querystring');
const myURL = new URL(
  'https://example.com:8000/path?name=John&age=20#fragment'
);
const q = querystring.parse(myURL.searchParams.toString());
console.log(q.name); // John
console.log(q.age); // 20
  • 활용 예제: GET 요청의 쿼리 파라미터를 처리할 때 유용합니다.

5. Crypto 모듈 (crypto)

  • 암호화와 해싱 기능을 제공합니다.
  • 주요 메서드와 예제

5.1. 해시 생성

const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('Hello').digest('hex');
console.log('SHA-256 해시:', hash);

5.2. 암호화와 복호화

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return encrypted;
}

function decrypt(encryptedText) {
  const decipher = crypto.createDecipheriv(algorithm, key, iv);
  let decrypted = decipher.update(encryptedText, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

const encrypted = encrypt('Hello World');
console.log('암호화된 텍스트:', encrypted);
console.log('복호화된 텍스트:', decrypt(encrypted));

< 하루 정리 >

"타자 연습"
이 네 글자로 오늘 하루를 정리할 수 있을 것 같다.
너무 빠른 속도의 수업으로 강사님이 작성하시는 코드를 받아적기에 바빴고,
어떤 내용인지 이해는 당연히 안 됐을 뿐더러 뭘 하고 있는지 조차 몰랐다..
비단 나의 문제만은 아니었고 다른 팀원들도 똑같은 얘기를 하는 걸 보니
문제가 확실히 있어보인다.
코드 작성을 중간에 틀리기라도 한다면 그 이후에 작성된 것들은 그냥 날려야한다.
이게 뭘 하고 있는지.. 갑자기 왜 이렇게 수업이 되어 버렸는지 모르겠다..

모두를 데려가는 수업이 아니라 따라오는 사람만 데려가는 그런 수업
정말 눈물이 왈칵 터질 것 같이 가슴이 많이 먹먹하고 머리가 아팠다.

뭘 어디서부터 어떻게 해야될 지를 몰라서 너무 답답하다.
그나마 필기와 강의 노트를 보면서 어떤 내용을 했는지 감은 잡았지만,
정신적으로 너무 힘들다.

팀원들이 모두 응원을 해주고 도움을 주기 위해서 노력해주는게
말로 표현이 다 안 될 정도로 감사하다...

내 지인이 비전공에다가 그동안 그 어떤 관련 공부를 해보지 않은 사람이라면
난 무조건 말릴 예정이다.
아예 하지 말라는 게 아니라 전반적인 얕은 공부는 하고 들어야한다.
제로베이스의 사람들에겐 그리 친절하진 않은 수업이다.

물론 지금까지 계속 그래왔던 것은 아니다.
정말 꼼꼼하게 차근차근 알려주셨고 그때까지만 해도 잘 따라갔다.
근데 우리 수업에 공부를 오래해왔던 사람들이 있다는 걸 강사님께서 아시고
그때부터 달라지기 시작한 것 같다.
대다수가 그렇다보니 소수에 해당하는 나 같은 사람은 어쩔 수 없는 것 같다.

나처럼 되돌아갈 수 없는 사람들은 어떻게든 이 악물고 버티고 공부하겠지만
그게 아닌 사람들은 바로 포기할 수 있을 것 같다.
그래도 난 이 공부가 정말 재밌다. 그래서 더 버틸 수 있는 것 같기도 하고
잘하고 싶은 욕심이 너무 커서 나를 괴롭게 만드는 것 같기도 하다.

그리고 잠을 서서히 줄여나가야겠다.
잘 하는 분들도 새벽까지 공부하는데 내가 12시까지만 공부하는게 말이 안된다.
지치더라도 어쩔 수 없을 것 같다...

나이 먹고 늦게 공부를 하는 만큼 
힘들고 지칠 때 그 누구한테도 쉽게 터놓지 못한다는게
많이 외로운 것 같다.

그래도 오늘처럼 내일도 힘내서 하루를 또 버텨보자
profile
첫 시작!

0개의 댓글