3.1 REFL 사용하기
REFL (Read Eval Print Loop): 코드를 읽고 해석하고 결과물을 반환하고 종료할 때 까지 반복하는 것
(자바스크립트는 스크립트 언어이므로 미리 컴파일 하지 않아도 즉석에서 코드실행이 가능)
3.2 JS 파일 실행하기
예제파일 실행하여 파일 디렉터리로 노드 실행
3.3 모듈로 만들기
모듈: 특정한 기능을 하는 함수나 변수들의 집합
보통 파일 하나가 모듈 하나이며 파일별로 코드를 모듈화 할 수 있어 관리가 용이
노드 모듈 종류
- CommonJS 모듈
- ECMAScript 모듈
3.3.1 CommonJS 모듈
- 노드 생태계에서 가장 널리 쓰이는 모듈 (표준 이전부터 쓰였기 때문에 표준이 아니어도 널리 쓰인다.)
cf. exports vs module.export 차이
//한번에 대입 가능
module.export = {
odd,even,
};
//각각의 변수를 exports 객체에 하나씩 대입
exports.odd ="홀수";
exports.even ="짝수";
module.exports와 exports가 같은 객체를 참조하기 때문에 동일하게 동작
주의 할 사항은 exports에는 반드시 객체처럼 속성명과 속성값을 대입해야한다. exports에 다른 값을 대입할 때 참조관계가 끊겨 모듈로서의 기능 상실
module.exports에 함수를 대입한 경우 →exports 변경 불가
exports와 module.exports에는 참조 관계가 있기 때문에 한 모듈 exports 객체와 module.exports를 동시 사용을 지양
3.3.2 ECMAScript 모듈
- 브라우저와 노드 모두 같은 모듈 형식 사용 가능
- mjs 확장자를 사용하지만 js확장자를 사용하면서 ES모듈을 사용하려면 pakage.json에 type:”module” 속성 추가
- CommonJS와는 다르게 import 시 파일경로에서 확장자 , 폴더 내부에서 index.js 생략 모두 불가
→ 서로 호환되지않는 케이스가 많으므로 한 가지 형식 사용을 권장
3.3.3 다이내믹 임포트
다이내믹 임포트 : 조건부로 모듈을 불러오는 것
ES모듈에서는 import라는 함수로 모듈을 동적으로 불러올 수 있음 import는 Promise를 반환하기 때문에 await이나 then을 사용해야함
3.3.4 __filename, __dirname
filename : 현재 파일 명
dirname: 현재 파일 경로
경로 구분자 문제 (/ 와 \) 때문에 보통은 path 모듈과 함께 사용
3.4 노드 내장 객체 알아보기
3.4.1 global
- 브라우저의 window와 같은 전역 객체 (모든 파일에서 접근 가능)
- global안에 값을 대입해 데이터를 공유할 수 있으나, 다른 파일의 값을 사용하고 싶다면 모듈 형식으로 만든 후 명시적으로 값을 불러와서 사용하는 것이 유지보수에 좋음
3.4.2 console
- console.time(레이블) : timeEnd와 함께 대응되어 time~timeEnd 사이 시간을 측정
- console.log(내용): 로그 내용을 콘솔에 표시
- console.error (에러내용): 에러를 콘솔에 표시
- console.dir(객체, 옵션): 객체를 콘솔에 표시할 때 사용
- console.trace(레이블): 에러가 어디서 발생했는지 추적 (에러 위치가 나오지 않을때 사용)
3.4.3 타이머
- setTimeout(콜백함수,밀리초): 밀리초 이후 콜백함수 실행
- setInterval(콜백함수, 밀리초): 밀리초마다 콜백함수 반복 실행
- setImmediate(콜백함수): 콜백 함수 즉시 실행
취소 시 clear 타이머 사용
const timeout = setTimeout(() => {
console.log('1.5초 후 실행');
}, 1500);
const interval = setInterval(() => {
console.log('1초마다 실행');
}, 1000);
const timeout2 = setTimeout(() => {
console.log('실행되지 않습니다');
}, 3000);
setTimeout(() => {
clearTimeout(timeout2);
clearInterval(interval);
}, 2500);
const immediate = setImmediate(() => {
console.log('즉시 실행');
});
const immediate2 = setImmediate(() => {
console.log('실행되지 않습니다');
});
clearImmediate(immediate2);
실행순서 : immediate → interval → timeout → (timeout2와 interval 을 취소하기 때문에 3초후 아무것도 남지않음)
3.4.4 process
process 객체 : 현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있음
- process.env : 시스템의 환경변수, 이외에도 사용자가 임의로 환경변수를 저장할 수 있는 공간이자 서비스의 중요한 키를 저장하는 공간이다. 따라서 중요한 비밀번호는 속성값으로 대체한다.
- process.nextTick(콜백) : 이벤트 루프가 다른 콜백 함수들보다 nextTick의콜백함수를 우선으로 처리하도록 만듦
setImmediate(() => {
console.log('immediate');
});
process.nextTick(() => {
console.log('nextTick');
});
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => console.log('promise'));
//실행순서
nextTick
promise
timeout
immediate
setImmediate는 현재 이벤트 루프 사이클이 끝난 후에 실행되어야 한다.
setTimeout의 콜백 역시 현재 이벤트 루프 사이클이 끝난 후에 실행되어야 하는데 여전히 이벤트 루프 사이클 내부에서 다른작업보다 우선순위가 낮다.
따라서 모두 현재 이벤트 루프사이클이 끝난 후에 실행되어야 하지만 우선순위의 차이 때문에 setTimeout이 먼저 실행된다.
3.4.5 기타 내장 객체
- URL,URLSearchParams: 3.5.3에서 공부
- AbortController, FormData, fetch, Headers, Request, Response, Event, EventTarget: 브라우저에서 사용하던 API가 노드에도 동일하게 생성
- TextDecoder : Buffer → 문자열
- TextEncoder: 문자열 →Buffer
- WebAssembly: 웹어셈블리 처리 담당
3.5 노드 내장 모듈 사용하기
3.5.1 os
일반적인 웹 서비스 제작 시 사용빈도가 낮지만 운영체제별로 다른 서비스를 제공할 때 os 모듈이 유용
- os.type(), os.platform() : 운영체제를 확인할 수 있다.
- os.arch() : 서버의 아키텍쳐 구분 가능
- os.networkInterface() : 서버의 로컬 IP 확인 가능
3.5.2 path
경로의 구분자가 운영체제마다 다르기 때문에 이를 쉽게 조작하도록 도와주는 모듈
cf. path.join vs path.resolve
path.join('/a','/b','c') // 결과 : /a/b/c
path.resolve('/a','/b','c') //결과: /b/c
path.resolve는 /를 만나면 절대 경로로 인식해서 앞의 경로를 무시하고 path.join은 상대경로로 처리한다.
cf2. 상대경로와 절대경로
- 절대경로: 루트폴더나 노드 프로세스가 실행위치의 기준
- 상대경로: 현재 파일이 기준이 되고, 현재 파일과 같은 경로면 . 현재파일보다 한 단계 상위경로일 경우 .. 를 사용해 표현
3.5.3 url
- username, password,origin, searchParams 속성이 존재
- 생성자 안에 주소를 넣어 객체로 만들면 주소가 부분별로 정리
- url.format(객체): 분해된 url 객체를 원상태로 조립
- 주소가 host부분 없이 pathname만 오는 경우 new URL(”/book/gilbut”, “<https://www.gilbut.co.kr>”)처럼 두번째 인수로 host를 적어주어야 함
- search부분 : 보통 주소를 통해 데이터를 전달할 때 사용 ?(물음표)로 시작하고 키=값 형식으로 데이터를 전달, 여러 키의 경우 &로 구분 , search부분을 다루기 위해 searchParams 라는 특수한 객체 생성
- 주요 url 메서드
- getAll(키): 키에 해당하는 모든 값을 가져온다.
- get(키): 키에 해당하는 첫번째 값만 가져온다.
- has(키): 해당 키가 있는지 없는지 검사
- keys(): searchParams의 모든 키를 반복기 객체로 가져온다.
- values(): searchParams의 모든 값을 반복기 객체로 가져온다.
- append(키, 값): 해당 키를 추가하고 같은 키의 값이 있다면 유지하고 하나 더 추가한다.
- set(키, 값): append와 비슷하지만 같은 키의 값들을 모두 지우고 새로 추가
- delete(키): 해당 키 제거
- toString():조작한 searchParams의 객체를 다시 문자열로 만든다. search에 대입하면 주소 객체에 반영
3.5.4 dns
DNS를 다룰 때 사용하는 모듈로 주로 도메인을 통해 IP나 기타 DNS 정보를 얻고자 할 때 사용
- dns.lookup : ip주소 간단히 획득가능
- dns.resolve : ip주소 간단히 획득가능
3.5.5 crypto
다양한 방식의 암호화를 도와주는 모듈
- 단방향 암호화
- 양방향 암호화
3.5.6 util
각종 편의 기능을 모아둔 모듈
- util.deprecate: 첫번째 인수로 넣은 함수를 사용했을 때 사용할 경고메세지가 출력되고 두번째 인수로 경고메세지 내용을 넣으면 된다.
- util.promisify: 콜백패턴을 프로미스 패턴으로 바꾼다. async/await 패턴까지 사용가능
3.5.7 worker_threads
노드에서 멀티 스레드 방식으로 작업하는 방법
3.5.8 child_process
노드에서 다른 프로그램을 실행하고 싶거나 명령어를 수행하고 싶을 때 사용하는 모듈이다. 이 모듈을 통해 다른 언어의 코드를 실행하고 결괏값을 받을 수 있다.
3.6 파일 시스템 접근하기
fs모듈은 파일 시스템에 접근하는 모듈로 파일을 생성하거나 삭제하고, 읽거나 쓸 수 있다. 또한 폴더도 만들거나 지울 수 있다.
3.6.1 동기 메서드와 비동기 메서드
노드는 주로 비동기 방식으로 처리하지만 몇몇 메서드는 동기 방식으로 사용하는데 특히 fs모듈이 그렇다.
cf.동기와 비동기, 블로킹과 논블로킹
- 동기와 비동기: 백그라운드 작업 완료 확인 여부
- 블로킹과 논블로킹: 함수가 바로 return 되는지 여부
3.6.2 버퍼와 스트림 이해하기
노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간을 마련해두며 파일 데이터를 메모리에 저장한 뒤 사용자가 조작할 수 있도록 한다.
이 버퍼를 직접 다루는 클래스가 Buffer이다.
- from(문자열): 문자열 → 버퍼
- toString(버퍼): 버퍼 → 문자열
- concat(배열): 배열 안에 든 버퍼를 하나로 합침
- alloc(바이트): 빈 버퍼 생성
3.6.3 기타 fs 메서드 알아보기
- fs.access(경로, 옵션 , 선택): 폴더나 파일에 접근할 수 있는지 체크
- fs.mkdir(경로, 콜백): 폴더를 만드는 메서드
- fs.open(경로, 옵션, 선택): 파일의 아이디를 가져오는 메서드
- fs.rename(기존 경로, 새 경로 ,콜백): 파일의 이름을 바꾸는 메서드
- fs.readdir(경로, 콜백): 폴더 안의 내용물을 확인하는 메서드
- fs.unlink(경로, 콜백): 파일 삭제
- fs.rmdir(경로, 콜백): 폴더 삭제
'BE > Node.js 교과서' 카테고리의 다른 글
4장 http 모듈로 서버 만들기 (1) | 2023.11.03 |
---|---|
2장 알아둬야 할 자바스크립트 (1) | 2023.10.31 |
1장 노드 시작하기 (1) | 2023.10.31 |