반응형
# 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); // 서버에서 에러 났다는걸 알리고, 종료하기 위해 사용.
반응형
'인프런 강의 학습 > Node.js 교과서' 카테고리의 다른 글
Node.js 학습_노드 내장 객체 worker_threads / child_process (0) | 2021.10.03 |
---|---|
Node.js 학습_노드 내장모듈 (0) | 2021.10.03 |
Node.js 학습_자바스크립트 문법(화살표 함수) (0) | 2021.10.02 |
Node.js 학습_자바스크립트 문법(호출 스택 / 이벤트 루프 / const, let / 템플릿 문자열, 객체 리터럴) (0) | 2021.09.30 |
Node.js 학습_노드 설치 / VS Code 설치 (0) | 2021.09.30 |