Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

랄지 IT

Node.js 정리 본문

Node.js

Node.js 정리

바낭나 2021. 3. 2. 04:54

NNode.js란, 

자바스크립트 런타임 환경으로

서버사이드 애플리케이션 개발에 사용하는 소프트웨어 플랫폼이다. 

 

* 런타임 환경(runtime environment)

1. 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태

  (*가상머신: 컴퓨팅 환경을 소프트웨어로 구현한 것)

2. 운영제체 위에서 또는 운영체제 자체에서 실행되며 위 계층이 사용하거나 필요한 서비스를 제공하는 환경

 

 

Node.js 특징

- Non_blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 Request 처리 성능을 가짐

- 데이터를 실시간으로 처리하여 빈번한 I/O가 발생하는 SPA에 적합하나, 

  CPU 사용률이 높은 에플리케이션에는 권장하지 않음

 

  * Non_blocking: 대기시간(blocking)이 없다.

    호출 직후 프로그램으로 부터 제어가 돌아옴으로서 시스템 호출 종료를 기다리지 않고 다음 처리로 넘어갈 수 있다.

 

  * 싱글 페이지 애플리케이션(SPA): 서버로부터 완전한 새로운 페이지를 불러오지 않고

    현재의 페이지를 동적으로 다시 작성함으로써 사용자와 소통하는 웹 애플리케이션이나 웹사이트를 말한다

 

 

Node.js 설치

- 공식사이트 nodejs.org 에서 install 할 수 있다. 

- (왼쪽) LTS버전: 장기적으로 안정된 지원이 보장 *권장

- (오른쪽) Current 버전: 최신기능 제공, 업데이트 발생중 (안정적이지 않을 수 있음)

- 노드를 설치하면, npm도 동시에 설치된다. 

  * npm는 자주 업데이트 되므로, 최신버전으로 npm 업데이트 필요할 수도 있다. 

  * npm install -g npm@latest

- 설치된 노드를 업데이트 하기 위해서 버전 매니저인 n 설치가 필요하다. 

- 캐시 강제 삭제 명령어: npm cache clean -f

- 설치에 실패하였거나, 버전이 변경 되지 않는 경우, 노드가 설치된 해당 폴더를 삭제후, 재설치한다. 

 

 

 


REPL

- Read Eval Print Loop : 입력 수행 출력 반복 

- 대부분의 언어가 제공하는 가상환경으로, 간단한 코드를 직접 실행해 결과를 확인해 볼 수 있다. 

- 명령어: node 

- ctrl + c 키를 두번 실행하면 REPL을 종료할 수 있다.

- 노드 파일을 실행하려면 ' node 파일명 '을 입력한다. (확장자는 생략가능함)

 

 

 

 

HTTP Server

- 노드는 http 서버 모듈을 내장하고 있어서 (아파치 등의) 별도의 웹서버를 설치할 필요가 없다. 

- 아래와 같이 js 파일 작성후, 'node 파일명'으로 실행해주면 웹서버를 실행할 수 있다. 

 

const http = require('http'); // 모듈 로딩후, 변수에 할당 

 

http.createServer(request, response) => { // http 모듈의 메소드 사용하여 http서버 객체 생성

   response.statusCode = 200;

   response.setHeader('Content-Type', 'text/plain');

   response.end('hellow world');

}).listen(3000); // 메소드가 반환한 HTTP 서버 객체의 listen 메소드에 포트번호 전달하여 서버 실행함

 

 

 

 

모듈이란,

애플리케이션을 구성하는 개별적 요소이다. 

일반적으로 파일단위로 분리되어 있으며 필요에 따라 명시적으로 모듈을 로드한다. 

모듈을 기능별로 분리되어 작성되므로 개발효율성과 유지보수성의 향상을 기대할 수 있다. 

 

대부분의 언어는 모듈기능을 가지고 있지만, 자바스크립트는 모듈기능이 없었기 때문에 두가지 방법이 제안되었다. 

1. CommonJS 방식: AMD에 비해 문법이 간단, 동기방식으로 동작 

2. AMD 방식: CommonJS에 비해 문법이 다소 까다로우며, 비동기 방식으로 동작한다. 

 

Node.js는 CommonJS 방식을 채택하였고,

(현재는 독자적인 진화를 거쳐, 동일하진 않지만) 

기본적으로 CommonJS의 방식을 따르고 있다. 

 

 

 

패키지 설치

- 노드에서 사용할 수 있는 모듈인 패키지를 설치할 때는 npm install 명령어 뒤에 설치할 패키지 이름을 지정한다. 

- 지역 설치와 전역 설치 옵션이 있으며, 별도의 옵션을 지정하지 않으면 지역으로 설치된다. 

1. 지역 설치: 해당 프로젝트 내에서만 사용이 가능함

  npm install 패키지명

2. 전역 설치: 전역에서 참조할 수 있음 

  npm install -g 패키지명

 

패키지 관리

- 노드 프로젝트는 많은 패키지를 사용하고, 관리하므로 package.json 파일을 통해 프로젝트 정보와 패키지 의존성을 관리한다. 

- npm init 명령어를 통해 package.json을 관리할 수 있다.

- npm init -y 기본 설정 값으로, package.json 파일을 생성한다. 

- dependencies 항목에는, 해당 프로젝트가 의존하는 패키지들(참조 모듈)의 이름과 버전을 명시한다. 

- devDependencies에는 개발시에만 사용하는 개발용 의존 패키지를 명시한다. (개발시에만 필요하고, 배포할 필요는 없는 패키지들)

- package.json에 모든 의존 패키지를 명시한 후, npm install 명령어를 사용하면 명시된 패키지를 한번에 설치할 수 있다. 

- npm install 패키지명@버전 - 해당 패키지 버전을 지정하여 설치할 수 있다. 

- package.json의 dependencies의 버전 앞에 ^(캐럿)이 추가되면 업데이트를 허용한다는 의미이다. (캐럿 추가후, npm install 하게 되면, 최신 버전으로 자동 업데이트 된다.)

- npm은 유의적 버전을 지원한다. 

  1.7.3 

  1 => (첫번째) 메이저버전 넘버

  7 => (두번쨰) 마이너버전 넘버

  3 => (세번째) 패치버전 넘버

~(릴트)는 패치버전 범위 내에서 업데이트 한다.

^(캐럿)은 마이너버전 범위 내에서 업데이트 한다.

- 패키지 제거: npm uninstall 패키지명 (전역 삭제시 -g 옵션 추가하면 됨)

 

 

 

 

 

노드 모듈 

- 노드는 모듈 단위로 각 기능을 분할할 수 있다. 

- 모듈은 파일과 1대1의 대응관계를 가지며, 하나의 모듈은 자신만의 독립적인 실행 영역(스코프)를 가지게 된다. 

- 모듈은 module.exports 또는 exports 객체를 통해 정의하고 외부로 공개한다.

  그리고 공개된 모듈은 require 함수를 사용하여 임포트 한다. 

- exports : 모듈을 파일로 작성하고, 외부에 공개할 대상을 exports 객체의 프로퍼티 또는 메소드에 정의한다. 

  그리고 모듈을 전역 함수 require()를 이용하여 추출한다. (import시 모듈의 확장자는 생략가능)

- module.exports: 하나의 값(원시타입, 함수, 객체)을 할당할 수 있다. (객체를 사용하여 복수의 기능을 하나로 묶어 사용할 수도 있음.)

  * exports: 객체가 전달 / module.exports: 값이 전달 

- require 함수의 인수에는 파일 뿐만 아니라, 디렉터리를 지정할 수도 있다. 

  모듈을 명시하지 않고, require 함수를 호출(여러 파일 담긴 디렉토리명 호출)하면 해당 디렉터리의 index.js를 로드한다. 

- 코어 모듈: 노드가 기본으로 포함하고 있는 모듈. 패스 명시X. 예) http

- 외부 패키지: npm을 통해 설치한 외부패키지 역시 패스 명시X. 예) mongoose

- 파일 모듈: 코어모듈과 외부패키지 이외에는 모두 파일 모듈이고, 파일모듈 로딩시, 패스 명시해야함. 

  예) const foo = require('./lib/foo');

 

 

 

파일 업로드 기능이 있는 어플리케이션을 만들기 위해서는, 

1. 웹페이지를 제공해야 한다 => HTTP서버 필요

2. 서버는 URL요청별로 다르게 응답해야한다. => 라우터 필요

3. 라우터를 이용해야 요청을 만족시키기 위해 => 실제적인 요청 핸들러가 필요

4. 라우터는 들어오는 어떠한 POST 데이터도 다룰 수 있어야함. => 요청 데이터 핸들링 필요

5. URL이 요청되었을때, 내용을 표시할 필요도 있음 => 뷰 로직 필요

6. 사용자가 이미지 업로드 할 수 있어야 하므로, => 업로드 핸들링 필요함 

 

 

Node.js는 이벤트기반 비동기방식이다. 

동시작업을 event loop을 실행해서 처리하며, 단일 쓰레드이기 때문에 접속 수에 관계없이 메모리 사용량과 같은 시스템 리소스 사용량에 변화가 거의 없어 대규모 네트워크 프로그램을 개발하기에 적합한 형태이다. 

다만, 단일 쓰레드이기 때문에 서버에 문제가 발생하는 순간, 서버는 정지하게 된다. 

 

 

 

뷰와 콘트롤러 로직을 한곳에 구현하는 것은 바람직하지 않다. 

모든 소프트웨어 개발의 핵심은 복잡성을 극복하는 것이다.

프로그램은 작은 프로그램의 조합으로 만들어지는데, 훨씬 쉽게 복잡해지는 경향이 있다. 

소프트웨어 엔지니어링에서 강조하는 원리 중 하나는 관심사의 분리이다. 

즉, 성직이 다른(관심사가 다른)것들 각각을 따로 분리해서 생각하자는 것이다. 

 

 

 

http 모듈로 웹서버를 생성하면, 일반적 웹서버가 수행하여야 할 많은 일들을 직접 처리해야 하는데 

이것이 꽤 번거로운 일이다. 

Express와 같은 프레임워크를 사용하면 이러한 문제는 쉽게 해결할 수 있다. 

Express는 라우팅, 에러 핸들링, 스태틱 파일 제공 등 일반적 웹서버가 제공해야 하는 서비스를 쉽게 구현할 수 있는 장점이 있다. 

 

Express 사용 예)

 

var express = require('express');

var app = express();

 

app.get('/', function(req, res){

   res.send('hellow world');

});

 

app.listen(8888, function(){

   console.log(..)

});

 

 

 

 

비밀 설정 정보 관리

- 애플리케이션을 개발할때, 외부에 알려지면 안되는 민감한 정보들을 사용할 때가 있다. 세션키, db접속 정보 등...

- 이런 정보들은 어떤 형태이든 코드내에 포함되어야 하는데, 일반적으로 3가지 방법을 사용한다. 

1. 코드내에 하드코드 하기(권장하지 않음)

2. 설정파일 사용하기(1보다 나으나, 파일만 따로 빼놓은것으로, 역시 권장X)

3. command-line에서 argument 요구하기(1,2보다는 안전하지만, 매번 민감정보를 입력해야하는 번거로움이 있음)

  * nopt 패키지 사용

4. 환경변수 사용하기 (OS내에 환경변수에 저장해놓는 것, 권장함)

  * export 를 사용하여 SESSION_SECRET(키)에 값을 저장해 놓고, 노드에서 불러들여서 사용한다.

  * 코드 내에서 환경변수에 접근할 때는 node.js의 process.env를 사용한다. 

  * 사용예)

  var app = express()

  app.use(session({secret: process.env: SESSION_SECRET}))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Node.js' 카테고리의 다른 글

Express 정리  (0) 2021.03.10