안드로이드&IOS 앱 개발자 양성

안드로이드&iOS 앱 개발자 양성(88일차) - Node.js

HRuler 2020. 9. 10. 19:17

** Node

- 구글에서 만든 V8 자바스크립트 엔진을 사용해서 애플리케이션을 개발할 수 있도록 해주는 자바스크립트(웹 브라우저에서만 동작하는 언어) 환경

- 서버 환경을 구성할 수 있고 애플리케이션 제작 가능

- 단일 스레드(Node 14에서는 멀티 스레드 가능)를 기반으로 하는 Non-Blocking I/O
- Native 언어로 만들어진 서버 환경보다는 속도가 느릴 수 있다.

- 짧은 시간에 대량의 클라이언트 요청을 처리하는데 적합하다.

  대량의 데이터를 조회하고 긴 처리 시간을 갖는 애플리케이션에는 부적합하다.
- 웹과 동작하는 서버를 구현할 때 다른 언어를 공부할 필요가 없기 때문에 Learning curve가 짧아서 많이 사용한다.

  MEAN(MERN) : MongoDB, Express.js, Angular.js(React.js), Node.js : Full Stack

1. 특징

- 이벤트 기반 : 이벤트가 발생했을 때 지정한 내용을 수행하는 방식이다.

  이벤트를 등록하는 함수를 이벤트 리스너라고 하고 이벤트가 발생했을 때 호출되는 함수를 콜백함수라고 한다.
- Non-Blocking I/O

  실행을 할 때 대부분이 비동기 방식

  하나의 작업이 끝나기를 기다렸다가 다음 작업을 하지 않고 작업을 수행하는 도중에 다른 작업을 수행한다.

- Single Thread

  Node 14 버전부터는 Multi Thread를 지원한다.

- Server로서의 Node : 링크드 인, 우버나 월 마트, 넷플릭스 등이 서버로 사용 - 국내에서는 Naver, 배달의 민족, 모바일 서버에 사용한다.

- 장점

  멀티 스레드 방식에 비해 자원 소모가 적다.

  I/O 작업이 많은 서버에 적합하다.

  자바스크립드를 사용 - JSON 형식과 호환이 쉽다.

  Learning curve가 짧다.

- 단점

  CPU 코어를 하나만 사용한다.

  CPU 작업이 많은 서버로는 부적합하다.

  어중간한 성능을 갖는다.

  작업의 큰 경우에는 아직도 Java + Spring Boot로 구현한다.

- 서버 이외의 노드

  자바스크립트 런타임이기 때문에 웹 브라우저에서 동작하는 애플리케이션 개발이 가능하고 자바스크립트 런타임을 데스크탑에 설치하면 데스크 탐에서 동작하는 애플리케이션도 작성이 가능하다.

  웹 프레임워크 : Angular, React, Vue 등

  모바일 프레임워크 : React Native, ionic 등

  데스크 탑 프레임워크 : Electron(Atom Editor, Slack, Microsoft의 VSCode-요즘 가장 많이 사용하는 IDE)

2. 설치

1) 다운로드 : nodejs.org

- LTS 버전 : 안정화된 버전

- CURRENT 버전 : 최신 버전

- 홀수 버전 : 짝수 버전이 나오면 없어진다.
2) 설치 확인 : 터미널에서 수행

- node -v : 노드 버전 확인

- npm -v : npm 버전 확인

3) IDE 선택

- VS Code

- Eclipse Plug-In : nodeclipse - Marketplace에서 검색해서 설치

3. npm

- node package manager : 패키지 관리

- 개발 생태계가 좋다라고 하는 경우가 있다.

  C C++ 3rd Party 개발자가 만든 라이브러리를 관리하는 곳이 없다.

  관리하는 곳이 없으면 위험한 라이브러리를 배포하는 경우가 발생할 수 있다.

  node, linux, python, R 등은 이러한 라이브러리를 관리하는 해주는 clan이 있어서 개발자가 만든 라이브러리를 등재하고자 하는 경우 문서와 함께 제출을 하고 그 문서 라이브러리를 심사를 해서 등재를 한다.

  Java에서 위와 같은 역할을 해주는 곳으로 mvnrepository.com 이 있습니다.

  Java는 이러한 곳이 여러 곳입니다.

- 이러한 패키지를 관리해주는 도구가 npm 입니다.

- Mac 도 이러한 비슷한 용도로 사용하는 도구가 있는데 HomeBrew

4. Application 작성 및 실행

1) console에서도 가능 - node 라고 입력한 후 코드를 작성하면 된다.

- 이 방식은 여러 줄의 코드를 만들 때 불편하기 때문에 잘 사용하지 않는다.

2) IDE를 이용해서 작성하고 실행

5.node.js를 하기 전에 학습해야 할 내용

- javascript - css, html

- typescript - javascript에 객체 지향 요소가 추가된 스크립트

6. Eclipse에서 프로젝트를 생성하고 실행

1) 프로젝트 생성

  [File] - [New] - [Node] - node.js project를 선택

2) 프로젝트에 자바스크립트 파일을 추가

프로젝트를 선택하고 마우스 오른쪽을 누른 후 [New] - [javascript file]

3) 코드를 작성

//변수 생성

var odd = '홀수'

//상수 생성

const even = '짝수'

 

//콘솔에 출력 - console.log node에서 터미널에 출력하는 명

console.log(odd)

console.log(even)

4)실행

- 콘솔에서 node 자바스크립트파일명

- eclipse에서 마우스 오른쪽을 누르고 [Run As] - [node application]을 실행

7.모듈 프로그래밍

- 프로그램을 나누어서 작성하고 다른 파일에 작성한 내용을 가져와서 사용하는 것

- 현재 파일에 있는 내용을 다른 파일에서 사용할 수 있도록 만들기

module.exports = {

          변수 와 함수이름을 나열

}

 

- 사용하고자 하는 파일

const 또는 var {이름 나열} = require(파일 경로)

1) var.js 파일을 추가하고 상수를 선언하고 외부에서 사용할 수 있도록 작성

//상수 생성

const odd='홀수'

const even='짝수'

//외부에서 사용할 수 있도록 내보내기

module.exports = {odd, even}

2) func.js 파일을 추가하고 var.js 파일의 내용을 가져오고 함수를 생성

const {odd, even} = require('./var');

 

function checkNum(num){

          if(num % 2){

                   return odd;

          }else{

                   return even;

          }

}

 

module.exports = checkNum

3) index.js 파일을 만들고 위의 파일 사용

//func 모듈의 exports 한 내용을 가져와서 checkNum에 대입

const checkNum = require('./func');

 

console.log(checkNum(10));

8. 이벤트 처리

1) 이벤트 등록

객체.addListener(이벤트이름, 호출할 함수)

객체.on(이벤트이름, 호출할 함수)

객체.once(이벤트이름, 호출할 함수) : 한 번만 호출

2) 이벤트 삭제

객체.removeListener(이벤트이름, 호출할 함수)

객체.off(이벤트이름)

3) 이벤트 강제 발생(event trigger)

객체.emit(이벤트 이름)

9. 예외처리

1) 목적

- 예외 내용을 확인해서 코드를 수정하거나 기록할 목적

- 멈추지 않고 다음 작업을 수행하도록 하기 위해서

2) 처리 방법

try{

          예외 발생 가능성이 있는 코드

}catch(변수){

          변수는 예외 객체로 메시지를 가지고 있음

             예외가 발생했을 때 수행할 코드

 

** npm(Node Package Manager)

- 3rd party 개발자들이 만든 소스 코드들을 모아놓은 저장소

- 이미 존재하는 기능은 다시 만들 필요없어서 효율적

- package: npm 업로드 된 노드 모듈

1. package.json

- 모듈의 의존관계를 작성해 놓는 파일

- maven에서는 pom.xml, gradle에서는 build.gradle, xcode cocoa pods에서는 Podfile 과 같은 역할

- 디렉토리를 만들고 터미널에서 npm init 이라는 명령을 실행하고 옵션을 설정하면 자동으로 파일이 생성된다.

- 옵션 설정할 때 주의할 점은 디렉토리 이름과 package이름이 같으면 안된다.

- 옵션은 package name, version, entry point(시작하는 자바스크립트 파일이름 - 대부분 app.js), test command, git repository, keywords, author, license 등이 있다.

2. 모듈 설치 - 프로젝트 디렉토리에서 실행

- npm install 패키지이름

  자동으로 package.json 파일에 등록이 되고 package-lock.json 파일이 생성되는데 이 파일은 패키지에 의존해야하는 패키지 정보가 기록된다.

- 여러 개의 패키지를 한꺼번에 설치할 때는 패키지이름 뒤에 공백을 두고 다른 패키지이름을 기재하면 됩니다.

- 개발용 패키지 설치: 개발할 때는 사용하지만 배포할 때는 제외되는 패키지

  npm install --save-dev 패키지이름

  express를 이용해서 웹 서버 만들 때 코드를 수정하면 자동으로 반영되도록 해주는 nodemon 이라는 패키지를 이렇게 설치하는 경우가 많다.

3. 버전

- node는 버전을 3자리로 표시

  Major Version.Minor Version.Patch Version

- Major Version을 변경하는 경우는 하위 버전과 호환되지 않는 기능이 추가되거나 삭제 또는 갱신

- Minor Version을 변경하는 경우는 하위 버전과 호환되는 내용을 수정

- Patch는 기능이 수정되기 보다는 버그를 수정한 경우

- @latest 가 있으면 최신 버전

- @next가 있으면 최신 배포판 사용 가능 - 불안정한 버전

- alpha(개발자의 장소에서 사용자가 테스트), beta(사용자의 장소에서 사용자가 테스트), rc(배포판)

 

** Express Web Server

1. node.js 프로젝트를 생성 - nodeexpress 

2. package.json 파일을 생성

- 터미널을 실행해서 프롬프트를 프로젝트로 이동

- 터미널에서 npm init 을 실행하고 옵션 설정

3. 필요한 의존성을 설정

- express 설치 : Web Server 만들기 위한 패키지

  npm install express

- nodemon을 개발용으로 설치 : 소스 코드를 수정하면 웹 서버가 자동으로 재시작하도록 해주는 패키지

npm install --save-dev nodemon

4. package.json 파일을 수정

- npm start 명령을 입력하면 app.js가 자동으로 실행되도록 해주는 설정

{

  "name": "expressweb",

  "version": "1.0.0",

  "description": "웹 서버 만들기",

  "main": "app.js",

  "scripts": {

    "start": "nodemon app"

  },

  "author": "itstudy",

  "license": "ISC",

  "dependencies": {

    "express": "^4.17.1"

  },

  "devDependencies": {

    "nodemon": "^2.0.4"

  }

}

5. app.js 파일을 생성해서 작성하고 실행

- 터미널에서 npm start 명령을 입력

1) app.js 생성

//필요한 모듈 가져오기

const express = require('express');

const path = require('path');

 

//express 객체 만듬

const app = express();

//포트 설정

app.set('port', process.env.PORT || 3000)

 

//요청 생성

//GET방식으로 /요청이 오면 처리

//req는 요청 객체이고 res는 응답 객체

app.get('/', (req, res) => {

          res.send('Hello Express Web Server')

});

 

//서버 구동

app.listen(app.get('port'), () => {

          console.log(app.get('port'), '번 포트에서 대기 중 ')

});

2) npm start 명령을 실행

3) 웹 브라우저에 http://localhost:3000 을 입력하고 확인

6. 요청이 왔을 때 html 파일을 출력하기

1) 현재 프로젝트 디렉토리에 index.html 파일 만들기

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Node Web Server</title>

</head>

<body>

          <h1>Node.js는 자바스크립트 문법으로 애플리케이션을 만드는 프레임워크입니다.</h1>

</body>

</html>

2) app.js 파일에 요청을 추가

app.get('/index', (req, res) => {

          //html 파일 출력

          //__dirname은 현재 디렉토리

          //현재 디렉토리의 index.html 파일을 전송

          res.sendFile(path.join(__dirname, '/index.html'))

});

3) 재실행은 문법적인 구조만 틀리지 않으면 자동인데 강제로 재실행하고자 하면 터미널에서 rs 명령을 실행

7. json 출력

- res.json(자바스크립트 객체)

- 자바스크립트 객체 {key:value }

- value는 숫자, 문자열, date, boolean, null 가능

8. app.js 파일에 요청을 추가하고 json 출력

app.get('/json', (req, res) => {

          //json 출력

          res.json({'name':'박문석', 'age':50});

});

- 브라우저에서 확인

 

** Middle Ware

- 요청을 처리해서 응답을 전송하기 전에 수행하는 모듈

- app.use(미들웨어)

app.use((err, req, res, next)=>{

          처리할 내용

})

app.use((req, res, next)=>{

          처리할 내용

})

1. dotenv

- .env 파일을 읽어서 process.env 로 만들어주는 미들웨어

- .env 파일에 데이터베이스 경로나 암호화키 등을 저장하고 호출해서 사용

2. morgan

- 로그 출력해주는 미들웨어

- 요청 주소 나 상태 코드 그리고 응답 속도들을 로그로 출력

- 자세한 로그는 winston으로 작업