728x90
목차
024
Nodejs란?
- nodejs 자체가 웹 서버가 아닌, 자바스크립트를 사용해서 서버측의 코드들을 작성하고 서버를 구축할 수 있게 도와준다.
- 개발생산성을 위해 npm을 통해 모듈을 제공한다.
- nodejs가 자체적으로 모듈의 문법을 만들어 모듈 시스템을 구축하였다.
npm(Node Package Manager)
- 개발자들이 작성한 자신의 모듈을 공유할 수 있는 패키지 저장소이다.
- npm을 사용하면 모듈을 쉽게 설치받아서 사용할 수 있다.
- nodejs가 개발된 이유는 웹 서버 개발을 하기 위해서도 있지만, 방대한 오픈소스 생태계를 구축하기여 개발자들이 편리하게 개발할 수 있도록 개발 생산성을 향상시켜주기 위함이기도 하다.
V8 Javascript
- V8은 웹 브라우저를 만드는데 기반을 제공하는 구글에서 개발한 오픈소스 자바스크립트 엔진이다.
- Chrome V8 Javascript 엔진으로 'bulid'된 서버 측 자바스크립트 런타임 환경이다.
- 브라우저와 런타임 환경이 다르다.
- build가 되었다는것은, 코드를 컴파일러를 통해 실행파일로 변환하는 작업이라고 보면된다.
- V8 Javascript 엔진은 2008년도에 오픈소스로 공개되었고, 구글에서 개발한 js엔진을 사용하며, '비동기 I/O (Input / Output)'와 '이벤트 기반의 아키텍처'를 채택해 속도가 빠르고 성능이 좋다.
- V8은 자바스크립트 코드를 실행하기 전에 최적화된 머신코드로 컴파일하는 엔진이다.
- 자바스크립트 속도개선을 위해 고안되었으며, 자바스크립트 엔진은 웹 특성상 유저와 상호작용을 위해서 즉시성이 있는 인터프리터 방식을 사용하는데 코드가 많아질 수록 속도가 느려져 복잡한 기능을 구현하기가 어려워지므로 속도 향상을 위해 머신코드로 번역을 하는 것이다.
nodejs의 블로킹과 논블로킹
- nodejs에서 '비동기I/O' 작업을 진행하는 동안 또 다른 작업을 실행할 수 있다. (nodejs의 장점)
- I/O 작업이 완료될 때까지 기다리면서 다른 코드를 또 실행시킬 수 있다.
- Input / Output(파일시스템): 네트워크, 디스크 등 데이커를 읽거나 쓰는 무거운 작업
- 블로킹: 한 작업이 끝날 때까지 다른 작업을 수행하지 않는 것이다.
- 블로킹 I/O 작업은 수행하는 동안 다른 코드의 실행이 중단된다.
- 논블로킹: I/O작업을 기다리는 동안 다른 코드들을 실행할 수 있게 하는 것이다.
- nodejs의 모든 I/O작업은 비동기적으로 실행되고 블로킹을 하지 않는다.
nodejs의 이벤트 기반의 아키텍쳐
- nodejs의 가장 큰 특징으로 이벤트 기잔의 아키텍쳐가 있다.
- 이벤트 기반의 프로그래밍은 이벤트가 발생하면 콜백함수를 실행시키는 방식이다.
- 이벤트 기반의 프로그래밍을 작성하면 비동기식 처리가 가능하고 좋은 성능과 확장성을 가질 수 있다.
- 이벤트 기반
- 이벤트를 실행시키면 이벤트로 등록한 작업을 수행하는 것이다.
- 우리가 자바스크립트에서 '클릭'같은 이벤트에 콜백함수를 작성해놓고 이벤트 기반의 특정 이벤트가 발생되면 등록시킨 콜백함수를 호출해서 실행시킨다. 이런 내용을 이벤트 리스너에 콜백함수를 등록한다.
- nodejs는 이벤트가 발생하면 이벤트에 등록된 콜백 함수를 호출하고 이벤트를 다 처리하면 다음 이벤트 발생까지 기다린다.
Node.js의 REPL
- REPL (Read - Eval - Print - Loop)의 약자이다.
- 콘솔 환경에서 코드를 입력하면 즉시 실행시켜 결과를 반환해주는 인터페이스를 말한다.
- 자바스크립트 코딩 중 간단한 코드는 바로 확인할 수 있다는 장점이 있다.
- nodejs의 코드를 테스트하고 실행할 수 있도록 해주는 대화형 콘솔이다.
REPL 사용해보기
- REPL 시작: ctrl + ' ~ '을 눌러 터미널을 열고 'node'를 입력하여 실행시킵니다.
// 자바스크립트 내부 const str = "hello nodejs"; console.log(str);
> D:\test > node
Welcome to Node.js v18.16.0.
>str
'hello nodejs'
> console.log(str);
hello nodejs
undefined
- 출력된 값 다음에는 함수의 반환값이 나온다. 따라서 마지막에 입력한 'console.log(str)'은
- 출력된 값: hello nodejs
- 반환값: undefined
✏️ REPL 커맨드
- Ctrl+C – 현재 명령어를 종료합니다.
- Ctrl+C (2번) – Node REPL 을 종료합니다.
- Ctrl+D – Node REPL을 종료합니다.
- 위/아래 키 – 명령어 히스토리를 탐색하고 이전 명령어를 수정합니다.
- Tab – 현재 입력란에 쓴 값으로 시작하는 명령어 / 변수 목록을 확인합니다.
- .help – 모든 커맨드 목록을 확인합니다.
- .break – 멀티 라인 표현식 입력 도중 입력을 종료합니다.
- .clear – .break 와 같습니다.
- .save filename – 현재 Node REPL 세션을 파일로 저장합니다.
- .load filename – Node REPL 세션을 파일에서 불러옵니다
✏️ REPL 명령어
- node -v – nodejs의 설치버전을 확인합니다.
Nodejs의 런타임 환경
런타임(Runtime)이란?
- 런타임은 '어떤 프로그램이 실행되고 있는 동안의 동작'을 가리킨다.
- 예를들어, Javascript의 경우
- 브라우저에서 실행이 되면 런타임 환경은 '브라우저'가 되고
- nodejs에서 실행이 되면 런타임 환경은 'nodejs'가 되는 것이다.
- 브라우저와 nodejs는 런타임 환경이 다르므로 전역객체의 명칭또한 다르다.
- 브라우저의 경우: window
- nodejs의 경우: global
Nodejs 파일 실행 모드
- node 구문 뒤에 파일의 경로를 작성해주면 된다.
- 예를 들어, node ./index/index.js
모듈
- 모듈이란, 어플리케이션을 구성하는 개별적인 요소를 말한다.
- 하나의 큰 프로그램의 작은 단위로, 모듈은 각각의 파일 단위로 구성되어 있다.
- 파일의 내용은 필요한 기능의 함수나, 변수들이 포함되어 있는 것이다.
- 필요에 따라 명시적으로 로드한다.
- 어플리케이션에 분리되어 개별적으로 존재하다가 어플리케이션의 로드에 의해 어플리케이션의 일원이 된다.
- 기능별로 분리되어 작성되므로 개발 효율과 유지보수를 편리하게 해준다.
모듈화 시켜보자
exports.js
const BlockClass = [
{
name : "안녕",
age : 1,
comment : function(){
console.log(this.name + "이야.")
}
},{
name : "안녕2",
age : 1,
comment : function(){
console.log(this.name + "이야.")
}
}
]
module.exports = BlockClass;
- 원래 이 내용을 다른 js파일에서 실행시키면 오류가 나지만, 해당 내용을 모듈로 내보내서 다른 파일에서 가져와 모듈화시켜서 사용할 수 있다.
- 해당 파일의 리턴값을 내보내 줄 수 있다.
require.js
const BlockClass = require('./index2.js') //.js는 생략 가능
console.log(BlockClass);
- 모듈을 가져오는 방법이다.
- 외부의 모듈을 모듈화할 수 있는 메소드가 require 메소드를 사용해서 외부의 모듈을 현재 내용에 모듈화 시켜줄 수 있다.
node.REPL
ps D:\test> node require.js
[ { name: '안녕', age: 1, comment: [Function: comment] },
{ name: '안녕2', age: 1, comment: [Function: comment] } ]
nodejs의 내장 모듈
- nodejs에서는 미리 만들어 놓은 모듈을 내장 모듈이라 한다.
전역변수 (Glocal Variable)
- node.js 내부의 객체를 다루는 객체로 활용
- exports
- require
- module
- __filename : 현재 실행 중인 경로를 포함 파일의 이름
ps D:\test> node index4.js
D:\test\index4.js
- __dirname : 현재 실행 중인 파일의 경로
ps D:\test> node index4.js
D:\test
os모듈
- 서버의 기본적인 하드웨어 자원들의 정보를 확인할 때 주로 사용한다.
- os.type(), os.platform() : 운영체제를 확인할 수 있다.
- os.arch() : 서버의 아키텍쳐 구분 가능
- os.networkInterface() : 서버의 로컬 IP 확인 가능
1. OS
const os = require('os'); console.log(os);
ps D:\test> node index4.js
{
arch: [Function: arch] {
[Symbol(Symbol.toPrimitive)]: [Function (anonymous)]
},
availableParallelism: [Function: getAvailableParallelism] {
[Symbol(Symbol.toPrimitive)]: [Function (anonymous)]
},
.
.
.
EOL: '\r\n',
devNull: '\\\\.\\nul'
}
2. OS.type()
const os = require('os'); console.log(os.type());
ps D:\test> node index4.js
3. os.platform()
Windows_NT
const os = require('os'); console.log(os.platform());
ps D:\test> node index4.js
win32
4. os.arch()const os = require('os'); console.log(os.arch());
ps D:\test> node index4.js
x64
5. os.networkInterface()
const os = require('os'); console.log(os.networkInterfaces());
ps D:\test> node index4.js
{
'Wi-Fi': [
{
adress: ...
.
.
.
Nodejs의 내장 객체
global
- nodejs의 전역객체이다.
- 브라우저의 window와 같은 개념이라고 생각하면 된다. 브라우저와는 런타임 환경이 다르기 때문에 전역객체도 다른 것이다.
- 노드에는 DOM이 없기 때문에 window와 document객체는 사용할 수 없다.
- 모든 파일에 접근 가능하며, global을 생략하여 사용할 수 있다.
- 예를들어, 원래는 global.console.log() 가 console.log()로 사용할 수 있듯이
index5.js
// module을 생략해서 작성할 수 있다. console.log(module.exports === exports); // module.exports === module.exports와 같음 //결과: true exports.obj = {a : 1}; exports.add = () => { return 2; } function add2(){ console.log("나는 함수임") } exports.temp = add2;
index6.jsconst BlockClass = require("./index5"); // require 설명. const require = (path) => { // 1. 해당 파일의 (path)를 가져오고 // 2. 해당 소스코드를 실행시킨다. // 3. retrun module.exports } console.log(BlockClass.obj); console.log(BlockClass.add()); BlockClass.temp();
ps D:\test> node index6.js
true
{ a: 1 }
2
나는 함수임
- global 속성에 값을 대입하여 파일간에 데이터를 공유할 수 있지만, 규모가 커질수록 유지보수가 힘들어질 수 있으므로 남용하는 것은 좋지 않다.
console
- 노드에서 console은 디버깅을 위해 사용된다.
- console.log()
- console.dir()
- 객체의 속성을 계층구조로 출력한다.
- console.time()
- 작업 소요 시간을 추적하는데 사용할 수 있는 타이머를 시작한다.
- 각 타이머에 고유한 이름을 지정하고 지정된 페이지에서 최대 10,000개의 타이머를 실행할 수 있다.
- 매개변수로 시작할 테스트 이름을 문자열로 작성한다.
- console.timeEnd()
- 중지할 타이머의 이름을 매개변수에 문자열로 작성하면 코드를 종료하여 시간을 출력한다.
global.console.time() //코드 시작 시간. global.console.timeEnd() //코드 종료 후 시간 출력.
ps D:\test> node index4.js
default: 0.071ms
- console.error()
- 콘솔에 오류를 출력할 때 사용한다.
- console.table()
- 배열 또는 객체를 표 형태로 보여주는 메소드이다.
global.console.table({a:{name : "안녕"},b:{name : "안녕2"},c:{name : "안녕3"}})
ps D:\test> node index4.js
┌─────────┬─────────┐
│ (index) │ name │
├─────────┼─────────┤
│ a │ '안녕' │
│ b │ '안녕2' │
│ c │ '안녕3' │
└─────────┴─────────┘
현재파일의 경로, 파일명
- _ _dirname: 현재 디렉토리 경로
- _ _filename: 현재 파일의 경로
console.log(__filename); console.log(__dirname);
ps D:\test> node index4.js
D:\경일_블록체인\강의\230427\index4.js
D:\경일_블록체인\강의\230427
process
- process.env : 시스템의 환경 변수를 알수 있다. 시스템 환경 변수는 노드에 직접 영향을 미치기도 한다.
- process.execPath : 노드의 경로
- process.version : 설치된 노드의 버전
- process.cpuUsage() : 현재 cpu 사용량
- process.arch : 프로세서 아키텍처 정보
- process.platform : 운영체제 플랫폼 정보
- process.pid : 현재 프로세스의 아이디
- process.uptime() : 프로세스가 시작된후 흐른 시간
- process.cwd() : 현재 프로세스 실행되는 위치
- process.exit() : 실행중인 노드 프로세스를 종료 한다. 서버 환경에서 이 함수를 사용하면 서버가 멈추므로 특수한 경우를 제외하고는 서버에서 잘 사용하지 않는다.
웹 서버
웹서버를 만들어보자
1. http 내장 모듈을 가져온다.
const http = require("http");
2. createServer 메소드로 서버 객체를 만들어준다.
const server = http.createServer((req, res) => {
//처리를 다 하고 응답하는 end 메소드 (해당 내용을 응답한 후 종료)
res.end("server on");
});
3. 포트를 지정해준다.
- Port는 네트워크 프로세스를 나눠주기 위해서 사용한다.
- 시스템 예약 포트 이외의 사용하지 않을 것 같은 포트들을 사용하면 된다.
- 1024번 까지 사용하므로 1025~65535번 안에서 사용해야한다.
- 개발 시 일반적으로 8000, 8080, 3000번을 많이 사용한다.
const PORT = 4000;
여기까지 작성하고 실행시키면 바로 실행이 끝나자마자 종료된다.
4. 서버 객체의 listen 메소드를 호출해서 클라이언트의 요청을 대기 상태로 만들어준다.
- 이벤트 루프를 동면서 요청이 오기까지 대기하다가 요청이 오면 응답해준다.
- listen 메소드에 첫 번째 매개변수로 port를 전달한다.
server.listen(PORT,()=>{
// 콜백 함수를 등록해서
// 성공적으로 서버가 열린것인지 확인 가능하다.
console.log("서버가 잘 열려있어요." + PORT + "에");
});
5. 웹 페이지 주소창에 "localhost:4000"을 입력한다.
ps D:\test> node index7.js
서버가 잘 열려있어요.4000에
더보기
- REPL
- 런타임
- 모듈
- V8 Javascript
728x90
'블록체인_9기 > 💚 Node.js' 카테고리의 다른 글
29강(과제X)_230508_Node.js(MVC 패턴으로 게시판 페이지 제작) (1) | 2023.05.09 |
---|---|
28강_Node.js (express, ejs, mysql2, path로 게시판 만들기) (0) | 2023.05.08 |
27강(과제X)_230502_Nodejs(express, get / post, path, ejs) (0) | 2023.05.03 |
26강(과제X)_230501_Nodejs(HTTP프로토콜, fs모듈, npm, mysql 연결) (0) | 2023.05.02 |
25강(과제X)_230428_Node.js(OSI 전송계층, TCP, UDP, TCP Server, client, Mysql) (0) | 2023.05.01 |