** 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으로 작업
'안드로이드&IOS 앱 개발자 양성' 카테고리의 다른 글
안드로이드&iOS 앱 개발자 양성(87일차) (0) | 2020.08.10 |
---|---|
안드로이드&iOS 앱 개발자 양성(86일차) (0) | 2020.08.07 |
안드로이드&iOS 앱 개발자 양성(84~85일차) (0) | 2020.08.05 |
안드로이드&iOS 앱 개발자 양성(83일차) (0) | 2020.08.04 |
안드로이드&iOS 앱 개발자 양성(82일차) (0) | 2020.08.03 |