본문 바로가기

블록체인_9기/💚 Node.js

24강(과제X)_230427_nodejs(Nodejs란?, REPL, 런타임 환경, 파일 실행 모드, 모듈, 내장모듈, 내장객체, 웹서버)

728x90

 

 

 

 


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
Windows_NT

3. os.platform()
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.js

const 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에

 

 

 

 

 

 

728x90