반응형

# REPL 사용

  • 자바스크립트는 스크립트 언어라 즉석에서 코드를 실행할 수 있다.
  • REPL이라는 콘솔을 제공 (Read / Evaluate / Print / Loop)
  • 윈도에서는 명령 프롬프트, 맥이나 리눅스에서는 터미널에 node 입력 (cmd 또는 VS Code 파워쉘(Ctrl + `(백틱))에서 node 입력 / node exit의 경우 .exit 입력 또는 Ctrl + C 입력)

  • repl의 경우 한줄 짜리 코드 실행 등에만 사용 (평소에는 거의 사용하는일 없음)

 

# JS 파일을 만들어서 실행하기

  • 자바스크립트 파일을 만들어 통째로 코드를 실행하는 방법 
아무 폴더(디렉터리)에서 helloWorld.js 생성
node [자바스크립트 파일 경로]로 실행
실행 결괏값이 출력됨

  • VS Code 파워쉘 -> cmd 변경 (아래와 같이 우측 하단 + 클릭하여 cmd로 변경) (파워쉘 사용의 경우 추후 문제발생 가능성 있다고 함)

 

# 모듈 생성 (module.exports / require)

  • 모듈 : 특정한 기능을 하는 함수나 변수들의 집합
  • 모듈로 만들면 여러 프로그램에서 재사용 가능
  • module.exports : 모듈로 생성
  • const 변수명 = require('경로'); 로 받아서 사용.
  • 객체를 넘겨서 사용할 경우

  • 배열을 넘겨서 사용할 경우

  • 구조분해 할당도 가능하여 아래와 같이 func.js에서 사용 가능
# 기존
const value = require('./var');

console.log(value);


# 구조 분해 할당
const { odd, even } = require('./var');
  • module.exports로 넘겨받은걸 또 module.exports하여 다른쪽으로 넘길수 있음.
const { odd, even } = require('./var');

function checkOddOrEven(number) {
    if (number % 2 ) {
        return odd;
    } else {
        return even;
    }
}


module.exports = {
    checkOddOrEven,
    odd,
    even,
};
  • module.exports는 파일에서 단 한번만 사용해야 함.
  • var.js
const odd = '홀수입니다.';
const even = '짝수입니다.';

module.exports = {odd, even};
  • func.js
const { odd, even } = require('./var');

function checkOddOrEven(number) {
    if (number % 2 ) {
        return odd;
    } else {
        return even;
    }
}


module.exports = checkOddOrEven;
  • index.js
const { odd, even } = require('./var'); // 구조분해 할당 시 속성명, 변수명 동일하게 해야 됨
const checkNumber = require('./func');  // 변수명은 임의로 설정 가능

function checkStringOddOrEven(str) {
    if (str.length % 2) {
        return odd;
    } else {
        return even;
    }
}

console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));
  • ES2015 모듈_자바스크립트 자체 모듈 시스템 문법이 생김. 아직 노드에서의 지원은 완벽하지 않음. mjs 확장자를 사용해야 함. 크게는 require 대신 import / module.exports 대신 export default를 쓰는 것으로 바뀜
  • func.mjs
import { odd, even } from './var';

function checkOddOrEven(num) {
    if (num % 2 ) {
        return odd;
    } else {
        return even;
    }
}


export default checkOddOrEven;

 

# 노드의 내장 객체

## global과 콘솔, 타이머

1. global

  • 브라우저의 window같은 역할
  • 모든 파일에서 접근 가능
  • window처럼 생략 가능(console, require도 global의 속성)
  • global 속성에 값을 대입하면 다른 파일에서도 사용 가능하다. (하지만, 이렇게 하는건 좋지 않음.)
1. globalA.js
module.exports = () => global.message;

2. globalB.js
const A = require('./globalA');

global message = '안녕하세요.';
console.log(A());

2. console 객체

  • 브라우저의 console 객체와 매우 유사.
  • console.time / console.timeEnd : 시간 로깅
  • console.error : 에러 로깅
  • console.log : 평범한 로그
  • console.dir : 객체 로깅
  • console.trace : 호출스택 로깅 (함수 안에서 사용하면 호출스택 보여줌)
  • console.table([{ name: '제로', phone: '123-123'}, { name: '케이', phone: '125-125'}]) : 테이블 형식으로 보여줌

3. 타이머 메서드

  • set 메서드에 clear 메서드가 대응됨
  • setTimeout(콜백 함수, 밀리초) : 주어진 밀리초(1000분의 1초) 이후에 콜백 함수를 실행
  • setInterval(콜백 함수, 밀리초) : 주어진 밀리초마다 콜백 함수를 반복 실행
  • setImmediate(콜백 함수) : 콜백 함수를 즉시 실행
  • clearTimeout(아이디) : setTimeout을 취소
  • clearInterval(아이디) : setInterval을 취소
  • clearImmediate(아이디) : setImmediate를 취소 
  • setTimeout / setInterval / setImmediate : 함수를 백그라운드로 보내는 대표적인 비 동기 코드
1. 2초 후 hello 출력
setTimeout(() => console.log('hello'), 2000)


2. 2초 마다 kkkkk 출력
const hello = setInterval(() => console.log('kkkkk'), 2000)
 
clearInterval(hello)	// 종료 시(hello 변수 취소)


3. 바로 실행
setImmediate(() => console.log('hi'))

## exports와 this

  • __filename : 현재 파일 경로
  • __dirname : 현재 폴더(디렉터리) 경로
  • __ (언더바 2개 붙은것. dunderscore 라고 함)
  • path 등에 사용.
  • 1개만 exports 하는 경우 module.exports / 2개 이상 exports 하는 경우 exports. 사용. (exports. 사용한 경우 module.exports 사용하면 안됨)
const odd = '홀수 입니다.';
const even = '짝수 입니다.';

module.exports === exports === {} // 초기값이 빈 객체임.


1. 1가지만 넣고 싶을 때 (1개만 exports)
const { odd, even } = require('./var');

function checkOddOrEven(number) {
    if (number % 2 ) {
        return odd;
    } else {
        return even;
    }
}

module.exports = chcekOddOrEven;


2. 2개 이상 넣고 싶을때 예_1 (2개 이상 exports)
module.exports === exports === { odd, even }

module.exports = {
	odd,
    even,
}

2-1. 2개 이상 넣고 싶을 때 예_2 (2개 이상 exports)
exports.odd = odd;
exports.even = even;
이때 exports를 사용했다면 module.exports를 사용하면 안됨. 
(module.exports 하는 순간 기존에 위에 exports.odd 등이 참조관계가 바뀌어 무시됨)
  • this는 전역객체를 가리킴. (this === module.exports === { } === exports)
console.log(this);  // global ?
// console.log(this === module.exports === {} === exports}
console.log(this === module.exports);

function a() {
    console.log(this === global);    
}

a();

출력결과 :
{}
true
true

## require의 특징

  • require가 제일 위에 올 필요는 없음
  • require.cache에 한 번 require 한 모듈에 대한 캐싱 정보가 들어있음. ( require로 파일을 한 번 불러오면 불러온 파일을 읽고 캐시에 저장해 둠, 그래서 두 번째 불러올땐 실제 파일을 읽는게 아닌 캐시(메모리)에 저장된 파일을 읽는다. (효율적) )
  • require.main은 노드 실행 시 첫 모듈을 가리킴.
다른 파일을 실행만 하고싶은 경우.
(다른 파일을 실행만 하고 다른 파일에 있는 변수 등을 가져오고 싶지 않을 때)
require('./var');
  • 자바스크립트를 node로 실행할 경우 해당 파일들은 거의 모듈이 됨. (빈 객체를 다른 파일에서 사용할 수 있게 되는 모듈이 됨)
  • require.main으로 어떤 파일을 실행한건지 알아낼 수 있다.
  • 캐시를 delete 해서 초기화 할 순 있지만 사용하진 않음. (내장객체를 손대는 건 위험한 행동)
  • 캐싱 : 하드디스크에 있는 정보를 메모리로 옮겨오는 걸 캐싱이라고 함.

## 순환참조

  • 아래와 같이 순한참조(무한 사이클) 일어나는 경우 
1. dep1.js
require('./dep2');

2. dep2.js
require('./dep1');

위의 경우 무한 사이클 발생.
  • 노드가 자동으로 순환참조를 막아줌 (순환참조 발생 시 빈 객체로 바꿔버림 {} )
1. dep1.js
require('./dep2');

2. dep2.js
require('./dep1');

module.exports = {
	hello: 'zero';
};

이 경우 dep1.js로 돌아갔을 때 빈 객체{} 로 바꿔버림
  • 순환참조는 직관적이지 않으므로 순환참조가 발생하는 상황을 만들지 않도록 하는게 좋음.

## process

  • 노드에서 process 입력 시 다양한 값들이 보임
process.version	// 설치된 노드의 버전

process.arch	// 프로세서 아키텍처 정보 x64, arm, ia32 등의 값일 수 있음.

process.platform	// 운영체제 플랫폼 정보. win32, linux나 darwin, freebsd 등의 값일 수 있음.

process.pid	// 현재 프로세스의 아이디. 프로세스를 여러 개 가질 때 구분할 수 있음.

process.uptime()	// 프로세스가 시작된 후 흐른 시간. 단위는 초

process.execPath	// 노드의 경로

process.cwd()	// 현재 프로세스가 실행되는 위치. (=노드 명령어를 어디서 실행됐는지. 자주 사용됨)

process.cpuUsage()	// 현재 cpu 사용량.
  • process.env : 시스템 환경 변수들이 들어있는 객체
비밀키(데이터베이스 비밀번호, 서드파티 앱 키 등)를 보관하는 용도로도 사용.

환경 변수는 process.env로 접근 가능.
const secretId = process.env.SECRET_ID;
const secretCode = process.env.SEVRET_CODE;

일부 환경 변수는 노드 실행 시 영향을 미친다.
예) NODE_OPTIONS(노드 실행 옵션) / UV_THREADPOOL_SIZE(스레드풀 개수)
max-old-space-size는 노드가 사용할 수 있는 메모리를 지정하는 옵션.
  • process.nextTick(콜백) : 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선적으로 처리함
너무 남용하면 다른 콜백 함수들 실행이 늦어진다.

비슷한 경우로 promise가 있다. (promise도 nextTick 처럼 우선순위가 높음)
  • process.exit(코드) : 현재의 프로세스를 멈춤
코드가 없거나 0이면 정상 종료

이외의 코드는 비 정상 종료를 의미함.

process.exit(1); // 서버에서 에러 났다는걸 알리고, 종료하기 위해 사용.
반응형

+ Recent posts