노드의 기능(3): 노드의 내장 모듈

리린·2021년 6월 6일
0

node.js

목록 보기
5/16

노드 내장 모듈

  • 버전마다 차이 존재
  • 운영체제, 클라이언트가 요청한 주소에 대한 정보 등 매우 유용함

os 모듈

  • 운영체제의 정보를 가져다줌
  • 일반적인 웹 서비스를 제작할 때는 사용빈도 높지 않음
  • 운영체제별로 다른 서비스를 제공하고 싶을 경우 OS모듈이 유용
  • 대표적인 메서드
    os.arch():process.arch와 동일
    os.platform():process.platform과 동일
    os.type(): 운영체제의 종류를 보여줌
    os.uptime(): 운영체제 부팅 이후 흐른 시간을 보여줌. (process.uptime():노드의 실행 시간)
    os.hostname(): 컴퓨터의 이름을 보여줌
    os.release(): 운영체제의 버전을 보여줌
    os.homedir(): 홈 디렉터리 경로를 보여줌
    os.tmpdir(): 임시 파일 저장 경로를 보여줌
    os.cpus(): 컴퓨터의 코어 정보를 보여줌
    os.cpus().length: 코어의 개수가 나옴(그러나 노드에서 싱글 스레드 프로그래밍을 하면 어차피 코어 1개만 사용함-단, cluster모듈을 사용하는 경우 코어 개수에 맞춰서 프로세스 늘리기 가능)
    os.freemem():사용 가능한 메모리(RAM)를 보여줌
    os.totalmem(): 전체 메모리 용량을 보여줌
  • 코드
const os = require('os');
console.log('운영체제 정보---------------------------------');
console.log('os.arch():', os.arch());
console.log('os.platform():', os.platform());
console.log('os.type():', os.type());
console.log('os.uptime():', os.uptime());
console.log('os.hostname():', os.hostname());
console.log('os.release():', os.release());
console.log('경로------------------------------------------');
console.log('os.homedir():', os.homedir());
console.log('os.tmpdir():', os.tmpdir());
console.log('cpu 정보--------------------------------------');
console.log('os.cpus():', os.cpus());
console.log('os.cpus().length:', os.cpus().length);
console.log('메모리 정보-----------------------------------');
console.log('os.freemem():', os.freemem());
console.log('os.totalmem():', os.totalmem());
  • 실행결과:
$ node os
운영체제 정보---------------------------------
os.arch(): x64  //process.arch와 동일
os.platform(): win32 //process.platform과 동일
os.type(): Windows_NT //운영체제의 종류를 보여줌
os.uptime(): 53354 //운영체제 부팅 이후 흐른 시간을 보여줌.  
cf. process.uptime(): 노드의 실행 시간
os.hostname(): DESKTOP-RRANDNC //컴퓨터의 이름을 보여줌
os.release(): 10.0.18362 //운영체제의 버전을 보여줌
경로---------------------------------
os.homedir(): C:\Users\zerocho //홈 디렉터리 경로를 보여줌
os.tmpdir(): C:\Users\zerocho\AppData\Local\Temp 
//임시 파일 저장 경로를 보여줌
cpu 정보---------------------------------
os.cpus(): [ { model: 'Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz',
    speed: 2904,
    times: { user: 970250, nice: 0, sys: 1471906, idle: 9117578, irq: 359109 } },
    // 컴퓨터의 코어 정보를 보여줌. 
    다른 코어가 있다면 나머지 코어의 정보가 나옴
  ]
os.cpus().length: 6
//코어의 개수가 나옴
(그러나 노드에서 싱글 스레드 프로그래밍을 하면 어차피 코어 1개만 사용함
-단, cluster모듈을 사용하는 경우 코어 개수에 맞춰서 
프로세스 늘리기 가능)
메모리 정보---------------------------------
os.freemem(): 23378612224 
//사용 가능한 메모리(RAM)를 보여줌
os.totalmem(): 34281246720 
//전체 메모리 용량을 보여줌

path

  • 폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈
  • 운영체제별로 경로 구분자(\,/) 가 다르기 때문에 필요하다
    (예시)
    윈도우: C:\Users\ZeroCho
    POSIX(유닉스 기반 운영체제-맥과 리눅스):/home/zerocho
  • 메서드
    filename: 현재 파일의 경로 표시
    dirname: 현재 폴더의 경로 표시
    path.sep: 경로의 구분자. 윈도는 \, POSIX는 /
    path.delimiter: 환경 변수의 구분자. 윈도는 세미콜론;, POSIX는 :
    process.env.PATH: 여러 경로가 나타남
    path.dirname(경로): 파일이 위치한 폴더 경로
    path.extname(경로): 파일의 확장자
    path.basename(경로, 확장자): 파일의 이름(확장자 포함)을 표시. 파일의 이름만 표시하고 싶다면 basename의 두 번째 인수로 파일의 확장자를 넣으면 됨
    path.parse(경로): 파일 경로를 root, dir, base, ext, name으로 분리
    path.format(객체): path.parse()한 객체를 파일 경로로 합침
    path.normalize(경로): /나 \를 실수로 여러 번 사용했거나 혼용했을 때 정상적인 경로로 변환
    path.isAbsolute(경로): 파일의 경로가 절대경로인지 상대경로인지를 true나 false로 알림
    path.relative(기준경로, 비교경로): 경로를 두 개 넣으면 첫 번째 경로에서 두 번째 경로로 가는 방법을 알림
    path.join(경로, …): 여러 인수를 넣으면 하나의 경로로 합침. 상대경로인 ..(부모 디렉터리)과 .(현 위치)도 알아서 처리
    path.resolve(경로, …): path.join()과 비슷하지만 차이 존재(절대경로)
  • 코드
const path = require('path');
const string = __filename;
console.log('path.sep:', path.sep);
console.log('path.delimiter:', path.delimiter);
console.log('------------------------------');
console.log('path.dirname():', path.dirname(string));
console.log('path.extname():', path.extname(string));
console.log('path.basename():', path.basename(string));
console.log('path.basename - extname:', path.basename(string, path.extname(string)));
console.log('------------------------------');
console.log('path.parse()', path.parse(string));
console.log('path.format():', path.format({
  dir: 'C:\\users\\zerocho',
  name: 'path',
  ext: '.js',
}));
console.log('path.normalize():', path.normalize('C://users\\\\zerocho\\\path.js'));
console.log('------------------------------');
console.log('path.isAbsolute(C:\\):', path.isAbsolute('C:\\'));
console.log('path.isAbsolute(./home):', path.isAbsolute('./home'));
console.log('------------------------------');
console.log('path.relative():', path.relative('C:\\users\\zerocho\\path.js', 'C:\\'));
console.log('path.join():', path.join(__dirname, '..', '..', '/users', '.', '/zerocho'));
console.log('path.resolve():', path.resolve(__dirname, '..', 'users', '.', '/zerocho'));
  • 콘솔 결과
$ node path
path.sep: \  //경로의 구분자. 윈도는 \, POSIX는 /
path.delimiter: ; //환경 변수의 구분자. 윈도는 세미콜론;, POSIX는 :
//process.env.PATH: 여러 경로가 나타남
------------------------------
path.dirname(): C:\Users\zerocho // 첫번째 인자 경로. 파일이 위치한 폴더 경로
path.extname(): .js // 첫번째 인자 경로. 파일의 확장자
path.basename(): path.js // 첫번째 인자 경로. 파일의 이름(확장자 포함)을 표시. 파일의 이름만 표시하고 싶다면 basename의 두 번째 인수로 파일의 확장자를 넣으면 됨
path.basename - extname: path
------------------------------
path.parse() {
path.basename(): path.js
path.basename - extname: path
------------------------------
path.parse() {
  root: 'C:\\',
  dir: 'C:\\Users\\zerocho',
  base: 'path.js',
  ext: '.js',
  name: 'path'
}
// 첫번째 인자 경로. 파일 경로를 root, dir, base, ext, name으로 분리
path.format(): C:\users\zerocho\path.js
// 첫 번째 인자 객체. 
path.parse()한 객체를 파일 경로로 합침
path.normalize(): C:\users\zerocho\path.js
// 첫 번째 인자 경로. /나 \를 실수로 여러 번 사용했거나 혼용했을 때 정상적인 경로로 변환
------------------------------
path.isAbsolute(C:\\): true
path.isAbsolute(./home): false
// 첫 번째 인자 경로. 파일의 경로가 절대경로인지 상대경로인지를 true나 false로 알림
------------------------------
path.relative(): ..\..\.. 
//첫 번째 인자 기준경로. 두 번째 인자 비교경로.
첫 번째 경로에서 두 번째 경로로 가는 방법을 알림
path.join(): C:\Users\zerocho
//여러 인수를 넣으면 하나의 경로로 합침. 상대경로인 ..(부모 디렉터리)과 .(현 위치)도 알아서 처리
path.resolve(): C:\zerocho
//path.join()과 비슷하지만 차이 존재(절대경로)
  • path.join vs path.resolve :
    /를 만날 때, path.resolve는 절대 경로(루트 폴더나 노드 프로세스가 실행되는 위치 기준)로 인식하며 앞의 경로를 무시하지만 path.join은 상대 경로(현재 파일이 기준-require.main이 기준 )로 처리한다
path.join('/a','/b','c'); /* 결과: /a/b/c */
path.resolve('/a','/b','c'); /* 결과: /b/c */
  • \를 사용하는 경우 vs \를 사용하는 경우
    js문자열에서는 \를 사용(특수문자이므로)
    그렇지 않은 경우 \를 사용
    복잡하지만, path를 사용하면 모든 걸 해결

다른 스타일 경로 사용

  • 윈도우에서 POSIX 스타일 경로 사용
    : path.posix.sep 혹은 path.posix.join()
  • POSIX에서 윈도우 스타일 경로 사용
    : path.win32.sep 혹은 path.win32.join()

url

  • 인터넷 주소를 쉽게 조작하도록 도와주는 모듈
  • 두 가지 방식
    (노드7 버전 이후) WHATWG
    (예전 노드부터 사용) 기존 url
  • 기존 노드를 사용해야 할 경우:
    host 부분 없이 pathname 부분만 오는 주소일 경우
    예시: /book/bookList.apsx
  • 도해: 위쪽은 기존, 아래쪽은 WHATWG 형식

url 모듈 설명

  • new URL('주소') :
    WHATWG 방식
    정리된 주소
    username, password, origin, searchParams(?표로 시작. 키=값 형식으로 데이터 전달. 여러 키가 있을 경우 &로 구분) 등 속성이 존재
  • url.parse(주소) :
    기존 방식.
    분해된 주소
    auth(username 과 password 대신), query(searchParams 대신) 등 속성이 존재
  • url.format(객체) :
    WHATWG 방식 url 과 기존 노드의 url 모두 사용 가능.
    분해되었던 url객체를 다시 원래 상태로 조립.
  • 코드
const url = require('url');
const { URL } = url;
const myURL = new URL('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor');
console.log('new URL():', myURL);
console.log('url.format():', url.format(myURL));
console.log('------------------------------');
const parsedUrl = url.parse('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor');
console.log('url.parse():', parsedUrl);
console.log('url.format():', url.format(parsedUrl));
  • 콘솔
new URL(): URL {
  href: 'http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor',
  origin: 'http://www.gilbut.co.kr',
  protocol: 'http:',
  username: '',
  password: '',
  host: 'www.gilbut.co.kr',
  hostname: 'www.gilbut.co.kr',
  port: '',
  pathname: '/book/bookList.aspx',
  search: '?sercate1=001001000',
  searchParams: URLSearchParams { 'sercate1' => '001001000' },
  hash: '#anchor'
}
url.format(): http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor
------------------------------
url.parse(): Url {
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: 'www.gilbut.co.kr',
  port: null,
  hostname: 'www.gilbut.co.kr',
  hash: '#anchor',
  search: '?sercate1=001001000',
  query: 'sercate1=001001000',
  pathname: '/book/bookList.aspx',
  path: '/book/bookList.aspx?sercate1=001001000',
  href: 'http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor'
}
url.format(): http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor

WHATWG의 searchParams 알아보기

  • WHATWG 설명
    WHATWG는 search 부분을 searchParams 라는 특수 객체로 반환하므로 유용.
  • search
    search는 주소를 통해 데이터를 전달할 때 사용됨.
    search는 물음표(?)로 시작하고, 그 뒤에 키=값 형식으로 데이터를 전달
  • searchParams의 장점(vs query)
    query는 querystring 모듈을 이용해야 하기 때문
  • 메서드
    .getAll(키): 키에 해당하는 모든 값들을 가져옴. category 키에는 nodejs와 javascript라는 두 가지 값 존재
    .get(키): 키에 해당하는 첫 번째 값만 가져옴
    .has(키): 해당 키가 있는지 없는지를 검사
    .keys(): searchParams의 모든 키를 반복기(iterator)(ES2015 문법) 객체로 가져옴
    .values(): searchParams의 모든 값을 반복기 객체로 가져옴
    .append(키, 값): 해당 키를 추가. 같은 키의 값이 있다면 유지하고 하나 더 추가
    .set(키, 값): append와 비슷하지만, 같은 키의 값들을 모두 지우고 새로 추가
    .delete(키): 해당 키를 제거
    .toString(): 조작한 searchParams 객체를 다시 문자열로 만듬. 이 문자열을 search에 대입하면 주소 객체에 반영됨.
  • 코드
const { URL } = require('url');
const myURL = new URL('http://www.gilbut.co.kr/?page=3&limit=10&category=nodejs&category=javascript');
console.log('searchParams:', myURL.searchParams);
console.log('searchParams.getAll():', myURL.searchParams.getAll('category'));
console.log('searchParams.get():', myURL.searchParams.get('limit'));
console.log('searchParams.has():', myURL.searchParams.has('page'));
console.log('searchParams.keys():', myURL.searchParams.keys());
console.log('searchParams.values():', myURL.searchParams.values());
myURL.searchParams.append('filter', 'es3');
myURL.searchParams.append('filter', 'es5');
console.log(myURL.searchParams.getAll('filter'));
myURL.searchParams.set('filter', 'es6');
console.log(myURL.searchParams.getAll('filter'));
myURL.searchParams.delete('filter');
console.log(myURL.searchParams.getAll('filter'));
console.log('searchParams.toString():', myURL.searchParams.toString());
myURL.search = myURL.searchParams.toString();
  • 콘솔 결과
searchParams: URLSearchParams {
  'page' => '3',
  'limit' => '10',
  'category' => 'nodejs',      
  'category' => 'javascript' } 
searchParams.getAll(): [ 'nodejs', 'javascript' ]
searchParams.get(): 10
searchParams.has(): true
searchParams.keys(): URLSearchParams Iterator { 'page', 'limit', 'category', 'category' }
searchParams.values(): URLSearchParams Iterator { '3', '10', 'nodejs', 'javascript' }
[ 'es3', 'es5' ]
[ 'es6' ]
[]
searchParams.toString(): page=3&limit=10&category=nodejs&category=javascript

querystring

  • 설명
    기존 노드의 url을 사용할 때, search부분을 사용하기 쉽게 객체로 만드는 모듈
  • 코드
profile
개발자지망생

0개의 댓글