3. 노드기능알아보기
3 노드기능 알아보기
3.1 REPL 사용하기
R : Read, 읽고
E : Eval, 평가하고
P : Print, 출력하고
L : Loop, 반복하고
3.2 JS 파일 실행하기
기본적인 js 파일 실행. node 명령어로 실행
function helloNode() {
console.log('Hello Node');
}
function helloWorld() {
console.log('Hello World');
helloNode();
}
helloWorld();3.3 모듈로 만들기
모듈 : 특정한 기능을 하는 함수나 변수들의 집함
파일하나 모듈하나로 설정하는게 관리에 용이
module.exports 객체에 저장하면 다른 파일에서 require()를 통해 임포트 할 수 있음
모듈화를 통해 독립적인 실행파일을 작성하고, 재사용 높은 프로그래밍이 가능해진다.
3.4 노드 내장 객체 알아보기
Dom의 window location 같은 내장 객체처럼, Node에도 내장객체가 존재.
내장객체란 이미 만들어져 있는 객체로 그냥 전역적으로 사용이 가능한 객체들을 말함
책에서는 자주 사용되는 객체만 다룸. 궁금한건 문서 참조
global 전역객체로.. 데이터를 공유하여 사용할 수도 있으나 권장 x, 변경 되는 정보를 나중에 찾는데 어려움 발생..
console 디버깅, 로깅의 기본 객체
console.time : node 프로세스의 실행시간.
시작시간console.timeEnd : .time과 대응되는 레이블과 쌍을 이룸.
끝난시간console.log : 로깅
console.error : 에러정보 출력
console.dir : 객체 정보 출력
console.trace : 에러 추적
타이머 타이머 기능, 내장 콜백함수에 의해 비동기처리 됨. 3가지 함수가 있다
setTimeout(callback, ms) : 가장 많이쓰임, ms 밀리초 후 callback 실행
setInterval(callback, ms) : callback ms 밀리초 만큼 지난 후 반복실행.
setImmediate(callback) : callback 즉시 실행.
clearTimeout(아이디) : setTimeout을 취소
clearInterval(아이디) : setInterval을 취소
clearImmediate(아이디) : setImmediate을 취소
setTimeout(callback, 0)과 setImmediate(callback) 차이
실행 순서의차이. 파일시스템 접근, 네트워킹 같은 I/Odml 특수한 경우, setImmediate 우선권 높음. 그러나 항상 먼저실행되는건 아님.. 점유에 따라 달라지는것 같음. 헷갈리지 않도록 setTimeout(callback, 0) 사용하지 않는 것을 권장
filename, dirname 해당 내용은
path 모듈에서 자세히 다룸 __filename : 현재 파일의 절대 경로 __dirname : 현재 파일의 디렉토리 절대 경로module, exports module.exports === exports ->
true즉 같은 객체. exports로 사용해도 되나 통일성을 위해 그냥 module. 을 붙여 사용하자 exports를 재정의 할 경우 모듈과 연결이 끊어지므로 주의 필요process 현재 실행 중인 node 프로세스의 정보를 알 수 있음
process.env
나중에
dotenv 모듈사용 서버의 중요한 키 정보를 저장함process.nextTick(callback)
이벤트루프가 다른 콜백함수보다 nextTick 함수의 우선순위를 높게 잡아
우선 처리process.nextTick, Promise를
마이크로태스트라고 따로 구분지음 -> 쌓이는 큐 영역이 다름마이크로태스크 > 태스트 이므로, 남발하는 경우 이벤트루프에서 다른 콜백함수를 실행하지 못하는 경우가 발생할 수 있음
process.exit(코드)
정상종료 : 0, 비정상종료 : 1 / 프로그램을 수동적으로 강제 종료 시킴
3.5 노드 내장 모듈 사용하기
노드에서 제공하는 모듈, 많은 것이 있지만 주로사용하는 것 위주로
OS 운영체제 정보를 가져올 수 있음. 웹 브라우저에서는 가져올 수 없지만..
node의 경우 싱글스레드이므로 코어수가 몇개든 간에 하나밖에 사용을 할 수 밖에 없다. 그러나
cluster모듈을 사용하면 코어 개수에 맞춰 프로세스를 늘릴 수 있다.path 파일, 폴더경로 관련한 모듈.
Windows타입과 POSIX(유닉스 기반 OS)로 나뉨
url
인터넷 주소를 쉽게 조작하도록 도와주는 모듈```javascript
const url = require('url');
const URL = url.URL;
// format const myURL = new URL('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor'); console.log(myURL); console.log(url.format(myURL)); console.log('-------------------------------');
// parse const parseUrl = url.parse('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor'); console.log(parseUrl); console.log(url.format(parseUrl));
querystring
WHATWG 방식의 url 대신 노드의 url을 사용할 때
search부분을 사용하기 쉽게 객체로 만드는 모듈```javascript
const url = require('url');
const querystring = require('querystring');
const parseUrl2 = url.parse('http://www.gilbut.co.kr/book/bookList.aspx?page=3&limit=10&category=node&category=javascript'); const query = querystring.parse(parseUrl2.query); console.log(query); console.log(querystring.stringify(query));
/ (출력문) [Object: null prototype] { page: '3', limit: '10', category: [ 'node', 'javascript' ] } page=3&limit=10&category=node&category=javascript /
createHash(알고리즘) : 해시알고리즘 명시. md5(x), sha1(x), sha256, sha512
update(문자열) : 문자열 변환
digest(인코딩) : 인코딩 할 알고리즘 명시.
base64, hex, latin1
현재주로 사용되는 알고리즘
pbkdf2, bcrypt, scrypt 로 암호화
pbkdf2는 단순하여 뒤에 2개보다 취약하므로, 보안이 중요한 경우 뒤에 2개를 사용, 주로 scrypt
salt라는 문자열을 붙이고 -> 해시 알고리즘을 반복해서 적용
양방향 : 암복호화.
```javascript
// deprecate 됨.
const cipher = crypto.createCipher('aes-256-ccm', '열쇠');
let result = cipher.update('암호화 할 문장', 'utf8', 'base64');
result += cipher.final('base64');
console.log('암호화 : ', result);
const decipher = crypto.createDecipher('aes-256-ccm', '열쇠'); let result2 = decipher.update(result, 'base64', 'utf8'); result2 += decipher.final('utf8'); console.log(result2);
3.6 파일 시스템 접근
fs 모듈 : 파일시스템에 접근하는 모듈
readFile의 반환 -> Buffer라는 형식으로 반환
동기, 비동기 / 블로킹, 논블로킹
동기, 비동기: 함수가 바로 return 되는지 여부블로킹, 논블로킹: 백그라운드 작업 완료 여부동기/블로킹 , 비동기/논블로킹이 대부분
동기 : readFileSync, 비동기 : readFile
버퍼와 스트림 이해하기
IO 처리 방식
버퍼 이용 : 데이터를 모아서 전송하는 방식
스트림 이용 : 데이터를 조금씩 지속적으로 전송하는 방식
Buffer
한글 3바이트로 인식
버퍼는 1바이트 단위
from(문자열) : 문자열 -> 버퍼 / length : 버퍼크기 (바이트단위)
toString(버퍼) : 버퍼 -> 문자열. base64, hex 같은 인코딩 명시->변환
concat(배열) : 배열의 버퍼를 연결해서 하나로 만들어줌
스트림
나눠서 보냄.
chunk라고함require('fs') 모듈 호출
fs.createReadStream(파일경로, 옵션)으로 생성 (읽기)
.on 메서드를 통해 이벤트 등록. data : 시작, end : 끝, error : 에러처리
highWaterMark 옵션 : 자르는 바이트 크기. 기본 : 64KB
fs.createWriteStream(파일경로, 옵션)으로 생성 (쓰기)
finish 이벤트 등록
wirte(문자열) : 저장할 문자열
end() : 종료 후 처리 -> 이때 finish 이벤트가 실행 됨
파이프
스트리 연결
읽고 쓰고 -> 파일복사 기능
```javascript
const readStream1 = fs.createReadStream('./readme4.txt');
const writeStream1 = fs.createWriteStream('./write3.txt');
readStream1.pipe(writeStream1); // 읽고 -> 쓰기 pipe로 연결
// 수동 구현 readStream1.on('data', args => { writeStream1.write(args); // 읽어서 쓰기 }); readStream1.on('end', args => { writeStream1.end(); // 끝나면 end 호출하여 처리 완료 }); readStream1.on('error', err => { console.log(" error : ", err); });
// zlib 이용 -> gz 파일 압축 const zlib = require('zlib'); const readStream2 = fs.createReadStream('./readme4.txt'); const gzip = zlib.createGzip(); const writeStream2 = fs.createWriteStream('./readme4.txt.gz'); readStream2.pipe(gzip).pipe(writeStream2); // 읽어서 gz로 묶고, 파일 쓰기 ```
기타 fs 메서드
파일 및 폴더 접근, 생성
fs.access(경로, 옵션, 콜백) : 폴더나 파일 접근여부 체크 -> 파일폴더 없는 경우
에러코드 : ENOENTF_OK : 파일존재여부
R_OK : 읽기권한여부
W_OK : 쓰기권한여부
fs.mkdir(경로, 콜백) : 폴더 만들기
fs.open(경로, 콜백) : 파일 열기
fs.rename(기존경로, 새경로, 콜백) : 파일이름 변경
```javascript
const fs = require('fs');
// 파일 접근 fs.access('./folder', fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, (err) => { if (err) { if (err.code === 'ENOENT') { // 폴더, 파일 없는 경우 console.log('폴더 없음'); fs.mkdir('./folder', (err1) => { // 폴더 생성 if (err1) { throw err1; } console.log('폴더 생성 완료 !'); fs.open('./folder/file.js', 'w', (err2, fd) => { // 파일만들기 : w(쓰기), r(읽기), a(기존파일에 추가) if (err2) { throw err2; } console.log('빈파일 생성 완료', fd); // fd : 파일아이디 -> fd로 read, write 가능 // fs.write(fd, "console.log('생성가능?');", (err3, written) => { // console.log(written); // }); fs.rename('./folder/file.js', './folder/newFile.js', err3 => { // 이름변경 if (err3) { throw err3; } console.log('이름변경 성공'); }); }); }); } else { throw err; } } else { console.log('이미 폴더 있음'); } });
3.7 이벤트 이해하기
이벤트를 만들고, 호출하고, 삭제 할 수 있음.
events모듈 사용
on(등록이벤트명, 콜백) : 이벤트명으로 콜백 함수 등록, 호출시 콜백함수 실행 ->
추가 가능addListener(이벤트명, 콜백) : on과 같은 기능
once(이벤트명, 콜백) : 콜백이 한번만 실행됨. 여러번 호출 해도 실행은 안되고, 에러는 안남
emit(이벤트명) : 이벤트 호출
removeAllListeners(이벤트명) : 등록된 이벤트를 전부 삭제.
removeListener(이벤트명,리스너) : 해당이벤트를 하나 삭제
off(이벤트명, 콜백) :
노드10버전부터 추가-> removeListener로 추가listenerCount(이벤트명) : 이벤트에 연결된 이벤트 갯수
3.8 예외처리하기
노드의 경우 싱글스레드이기 때문에 에러가나면 서버가 그대로 죽는다.
멀티스레드 환경인 경우 스레드가 하나 죽더라도, 서버가 죽지는 않기 때문에, 노드의 경우 예외처리에 각별히 신경을 써야함
에러가 발생 할 것 같은 부분에 try~catch문을 사용하여 예외처리를 하면 서버가 멈추지 않는다! throw를 하는 경우 반드시 try~catch로 잡아줘야 한다
uncaughtException 는 최후의 보류 수단으로.. 복구작업을 넣어둬도 완벽히 복구된다는 보장이 없다. 서버 운영은 에러와 싸움이다...
Last updated
Was this helpful?