- 버전마다 차이 존재
- 운영체제, 클라이언트가 요청한 주소에 대한 정보 등 매우 유용함
- 운영체제의 정보를 가져다줌
- 일반적인 웹 서비스를 제작할 때는 사용빈도 높지 않음
- 운영체제별로 다른 서비스를 제공하고 싶을 경우 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 //전체 메모리 용량을 보여줌
- 폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈
- 운영체제별로 경로 구분자(\,/) 가 다르기 때문에 필요하다
(예시)
윈도우: 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()
- 인터넷 주소를 쉽게 조작하도록 도와주는 모듈
- 두 가지 방식
(노드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부분을 사용하기 쉽게 객체로 만드는 모듈- 코드