1.1 핵심 개념
[서버]
- 서버란 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 프로그램을 말한다.
- 클라이언트란 요청을 보내는 주체이다.
서버는 클라이언트 요청에 대해 응답을 한다.
[자바스크립트 런타임]
Node.js는 Chrome V8 Javascript 엔진으로 빌드된 자바스크립트 런타임이다.
따라서 노드는 자바스크립트 프로그램을 컴퓨터에 실행할 수 있다.
구글이 V8엔진을 사용해 크롬을 출시하자 속도문제가 해결되고 많이 사용되었다.
[이벤트 기반]
- 이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
- 이벤트 루프란 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다.
[논블로킹 I/O]
- 논블로킹이란 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다.
- 블로킹이란 이전 작업이 끝나야만 다음 작업을 수행하는 것을 의미한다.
- I/O란 입력과 출력을 의미한다. (파일 시스템 접근, 네트워크를 통한 요청 등)
이벤트 루프를 잘 활용하여 오래 걸리는 작업을 효율적으로 처리할 수 있다.
자바스크립트 코드는 동시에 실행될 수 없지만, I/O 작업 같은 것은 동시에 처리 가능하다.
[싱글 스레드]
- 프로세스란 운영체제에서 할당하는 작업의 단위로, 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
- 스레드란 프로세스 내에서 실행되는 흐름의 단위로, 같은 주소의 메모리에 접근이 가능하여 데이터를 공유할 수 있다.
노드를 실행하면 프로세스 하나가 실행되고, 그 프로세스에서 여러 스레드를 생성하는데 그 중 작업 제어를 할 수 있는 스레드는 하나 뿐이기 때문에 노드가 싱글 스레드라고 여겨진다.
1.2 서버 노드
[장점]
- 노드는 개수가 많지만 작은 데이터를 실시간 주고받는 네트워크, 데이터베이스, I/O에 특화되어 있다.
- 노드는 JSON을 쉽게 처리할 수 있다.
- 노드는 프론트 뿐만 아니라 서버까지 노드를 사용하여 하나의 언어로 개발 가능하다.
- 노드는 내장된 웹 서버를 사용하여 Apache나 nginx와 같은 웹 서버를 추가로 설치하지 않아도 된다.
[단점]
- CPU 작업이 많은 서버로는 속도가 느려 효율적이지 않다.
- 싱글 스레드이기 때문에 하나의 CPU 코어를 하나만 사용한다.
1.3 서버 외의 노드
노드는 자바스크립트 런타임이므로 용도가 서버로만 국한되지 않는다.
사용 범위가 점점 늘어나 웹, 모바일, 데스크톱 애플리케이션 개발에도 사용된다.
2.1 ES2015
ES2015란 ECMA라는 국제 기구에서 만든 표준 문서인 ES의 6번째 개정판 문서에 있는 표준 스펙을 말한다.
6번째 버전이 2015년에 나왔기 때문에 ES6라고도 한다.
[const, let]
var 대신 const와 let을 사용한다.
- var : 함수 스코프, 값을 할당하고 다른 값을 할당할 수 있다.
- const : 블록 스코프, 한 번 값을 할당하면 다른 값을 할당할 수 없다.
- let : 블록 스코프, 값을 할당하고 다른 값을 할당할 수 있다.
[템플릿 문자열]
`(백틱) : 큰따옴표와 작은따옴표와 달리 문자열 안에 변수를 넣을 수 있다.
[객체 리터럴]
- 객체 리터럴이란 중괄호로 감싸진 하나 이상의 속성과 속성 값의 리스트다.
[화살표 함수]
function 키워드 대신 화살표를 사용하여 함수를 간략히 표현한다.
[구조 분해 할당]
객체와 배열로부터 속성이나 요소를 쉽게 꺼낼 수 있다.
[클래스]
프로토타입 문법을 직관적으로 쉽게 코드를 읽을 수 있도록 작성할 수 있다.
클래스는 함수로 호출될 수 없고, super 키워드를 사용할 수 있다.
[프로미스]
자바스크립트는 비동기 처리를 위해 콜백함수를 사용하지만 콜백을 너무 남용하면 콜백지옥에 빠지게 된다.
이러한 콜백 함수의 단점을 보안하고 비동기 처리에 사용되는 객체를 프로미스라고 한다.
프로미스 생성자 함수는 resolve와 reject함수를 인자로 받는다.
then 메서드는 프로미스가 이행되었을 때 실행할 콜백 함수를 등록한다.
catch 메서드는 프로미스가 거부되었을 때 실행할 콜백 함수를 등록한다.
[async/await]
비동기 프로그래밍을 할 때 사용된다.
프로미스로 콜백 지옥을 해결해도 코드가 깔끔하지 않기 때문에 async/await 문법으로 한 번 더 깔끔하게 줄인다.
async 함수 내에서 await를 사용하여 비동기 작업이 끝날 때까지 기다리고 결과를 반환한다.
[Map/Set]
map과 set은 데이터 저장하는 자료구조이다.
map은 키 값 쌍을 저장한다.
set은 고유한 값을 저장한다.
[널 병합 /옵셔널 체이닝]
널 병합 연산자는 피연산자 중 첫 번째가 null또는 undefined인 경우 두 번째 피연산자를 반환한다.
옵셔널 체이닝 연산자는 값이 null또는 undefined이면 undefined를 반환한다.
2.2 프런트엔드 자바스크립트
[AJAX]
AJAX란 비동기적으로 웹을 개발할 때 사용한다.
새로고침되지 않아도 데이터를 가져올 수 있다.
[FormData]
html 폼 요소의 데이터를 쉽게 수집하고 JavaScript에서 처리한다.
- append : 키-값 형식의 데이터를 저장한다.
- has : 주어진 키에 해당하는 값이 있는지 여부를 알린다.
- get : 주어진 키에 해당하는 값 하나를 가져온다.
- getAll : 해당하는 모든 값을 가져온다.
- delete : 현재 키를 제거한다.
- set : 현재 키를 수정한다.
[encodeURIComponent, decodeURIComponent]
한글 주소를 이해하지 못할 때 encdoeURIComponent 메서드를 통해 인코딩 한다.
[데이터 속성과 dataset]
HTML에는 데이터 저장하고 액세스하는 데이터 속성이 있다.
"data-"로 시작한다.
dataset은 데이터를 넣으면 HTML에 반영된다.
3.1 REPL 사용하기
REPL이란 읽고(read) 해석하고(eval) 반환하고(print) 종료할 때까지 반복(loop)한다는 뜻이다.
콘솔에서 REPL로 들어가는 명령어는 'node'이다.
3.2 JS 파일 실행하기
콘솔에서 'node [자바스크립트 파일 경로]'로 실행한다.
확장자는 생략이 가능하다.
3.3 모듈로 만들기
모듈이란 특정 기능을 하는 함수나 변수들의 집합이다.
모듈을 만들면 재사용이 가능하여 관리하기 편안하다.
[CommonJS 모듈]
CommonJS 모듈은 가장 널리 쓰이는 모듈이지만 표준이 나오기 이전부터 쓰였기 때문에 표준 모듈이 아니다.
- module.exports : 변수들을 담은 객체를 대입하여 파일 모듈로 기능한다.
다른 파일에서 이 파일을 불러 올 때 module.exports에 대입된 값을 사용할 수 있다.
불러올 때는 require함수 안에 불러올 모듈의 경로를 적는다.
require, module.export는 위치 상관 없이 아무 곳에서나 사용 가능하다.
exports는 moudule.exports를 참조한다.
[ECMAScript 모듈]
ECMAScript 모듈은 공식적인 모듈 형식이다.
require, exports, module.exports 대신 import, export, export default를 사용한다.
파일의 확장자는 js 대신 mjs를 사용한다.
모듈의 경로를 불러올 때 확장자 생략이 불가능하다.
[다이내믹 임포트]
다이내믹 임포트란 동적으로 모듈을 불러오는 것을 말한다.
ES 모듈은 if문 안에 import가 불가능 하기 때문에 다이내믹 임포트를 사용한다.
[__filename, __dirname]
- __filename : 현재 실행 중인 파일의 경로를 나타낸다.
- __dirname : 현재 실행 중인 파일의 디렉토리 경로를 나타낸다.
3.4 노드 내장 객체 알아보기
내장 객체와 내장 모듈은 설치을 하지 않아도 바로 사용할 수 있다.
[global]
전역 객체로, 모든 파일에서 접근할 수 있다.
생략이 가능하여 쓰이지는 않는다.
[console]
보통 디버깅을 위해 사용하며 다양한 메서드가 있다.
- console.time : time과 timeEnd 사이의 시간을 측정한다.
- console.log : 로그를 콘솔에 표시한다.
- console.table : 배열의 요소로 객체 리터럴을 넣으면 객체의 속성들이 테이블로 표현된다.
- console.dir : 객체를 콘솔에 표시한다.
- console.trace : 에러가 어디서 발생했는지 추적한다.
[타이머]
타이머 기능을 제공하는 함수로 global 객체 안에 들어 있다.
- setTimeout : 주어진 밀리초 이후에 콜백 함수를 실행한다.
- setInterval : 주어진 밀리초마다 콜백 함수를 반복 실행한다.
- setImmediate : 콜백 함수를 즉시 실행한다.
타이머 함수들은 아이디를 반환하는데 아이디를 사용하면 타이머를 취소할 수 있다.
- clearTimeout : setTimeout을 취소한다.
- clearInterval : setInterval을 취소한다.
- clearImmediate : setImmediate를 취소한다.
[process]
현재 실행되고 있는 노드 프로세스에 대한 정보를 담는다.
- process.env : 시스템 환경 변수로 스레드 개수나, 노드 메모리 등 다양한 옵션이 있다.
- process.nextTime : 다른 콜백 함수보다 우선으로 처리하도록 한다.
3.5 노드 내장 모듈 사용하기
노드는 웹 브라우저에서 사용되는 자바스크립트보다 더 많은 기능을 제공한다.
[os]
운영체제와 시스템의 정보를 가져온다.
[path]
폴더와 파일의 경로를 쉽게 조작하도록 도와준다.
윈도 : C:\User\haho \로 구분
POSIX : /home/haho /로 구분
[url]
url에 담긴 정보를 처리할 수 있도록 도와주는 모듈이다.
[dns]
도메인을 통해 IP나 DNS 정보를 얻고자할 때 사용한다.
[crypto]
다양한 방식의 암호화를 도와주는 모듈이다.
[util]
각종 편의 기능을 모아둔 모듈로 계속해서 api가 추가되고 있다.
자주 사용되는 메서드
- util.deprecate : 함수가 조만간 사라지거나 변경될 때 알려줄 수 있어 유용하다.
- util.promisify : 콜백 페턴을 프로미스 패턴으로 바꾼다.
[worker_theads]
멀티 스레드 방식으로 작업할 수 있는 모듈이다.
3.6 파일 시스템에 접근하기
- fs모듈이란 파일 시스템에 접근하는 모듈이다.
- readfile : 파일 시스템에서 파일을 불러오는 작업을 한다.
- writefile : 파일 시스템에서 파일을 쓰는 작업을 한다.
[동기 메서드와 비동기 메서드]
노드의 대부분의 메서드는 비동기로 처리하지만 몇몇 메서드는 동기 방식으로 처리할 수 있고 fs 모듈에 많이 있다.
- 동기와 비동기 : 백그라운드 작업 완료 여부
- 블로킹과 논블로킹 : 함수가 바로 return 되는지 여부
[버퍼와 스트림]
파일을 읽거나 쓰는 방식에는 두가지 방식이 있다.
버퍼를 이용하기, 스트림을 이용하기
Buffer는 버퍼를 직접 다룰 수 있는 클래스이다.
- from : 문자열을 버퍼로 바꿀 수 있다.
- tostring : 버퍼를 다시 문자열로 바꿀 수 있다.
- 버퍼는 바이트로 이루어진 일시적인 데이터 공간이다.
- 스트림 데이터를 일정한 단위로 조각하여 처리하는 방법이다.
3.7 이벤트 이해하기
- on : 이벤트 이름과 이벤트 발생 시의 콜백을 연결한다.
- addListener : 이벤트를 호출하는 메서드이다.
- once : 한번만 실행되는 이벤트이다.
- removeAllListeners : 이벤트에 연결된 모든 이벤트 리스너를 제거한다.
- listenerCounbt : 현재 리스너에 몇 개 연결되어 있는지 확인한다.
3.8 예외 처리하기
예외란 보통 처리하지 못한 에러를 말한다.
예외들은 실행중인 노드를 멈추게 한다.
try 블록 안에 예외가 발생할 수 있는 코드를 작성하고, catch 블록 안에 예외가 발생했을 때 코드를 작성한다.
3.8 자주 발생하는 에러들
- node: command not found : 노드를 설치했지만 환경 변수가 제대로 설치가 안되었을 때 발생한다.
- RefrenceError : 모듈 is not defined : 모듈을 require 했는지 확인한다.
- Error: Cannot find module 모듈명: 해당 모듈을 require했지만 설치하지 않았을 때 발생한다.
- Error [ERR_MODULE_NOT_FOUND]: 존재하지 않는 모듈을 불러오려 할 때 발생한다.
- Error: Can't set headers after they are sent: 요청에 대한 응답을 보낼 때 응답을 두 번 이상 보냈을 때 발생한다.
- FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed- JavaScript heap out of memory: 코드를 실행할 때 메모리가 부족해서 스크립트가 정상적으로 작동하지 않는 경우이다.
- UnhandledPromiseRejectionWarning: Unhandled promise rejection: 프로미스 사용 시 catch 메서드를 붙이지 않으면 발생한다.
- EADDRINUSE 포트 번호: 해당 포트 번호에 이미 다른 프로세스가 연결되어 있을 때 발생한다.
4.1 요청과 응답 이해하기
클라이언트에서 서버로 요청을 보내고 서버에서는 요청을 처리한 뒤 클라이언트로 응답을 보낸다.
- localhost란 현재 컴퓨터의 내부 주소를 가리키며 127.0.0.1로 대체 가능하다.
- 포트란 서버 내에서 프로세스를 구분하는 번호이다.
res 객체에는 writeHead, write, end 메서드가 있다.
- writeHead : 응답에 대한 정보를 기록하는 메서드이다.
- write : 클라이언트에 보낼 데이터이다.
- end : 응답을 종료하는 메서드이다.
4.2 REST와 라우팅 사용하기
REST란 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법이다.
- GET : 서버 자원을 가져올 때 사용. 요청의 body에 데이터를 넣지 않는다.
- POST : 서버의 자원을 새로 등록할 때 사용. 요청의 body에 데이터를 넣음.
- PATCH : 서버의 자원을 수정할 때 사용. 요청의 body에 데이터를 넣음.
- DELETE : 서버의 자원을 삭제할 때 사용. 요청의 body에 데이터를 넣지 않음.
- OPTIONS : 요청하기전 옵션을 설명하기 위해 사용.
라우팅이란 요청한 URL에 알맞은 페이지를 보여주는 기능이다.
4.3 쿠키와 세션 이해하기
쿠키 : 클라이언트에 저장되는 데이터로, key와 value로 구성되어 있다.
클라이언트에 저장되므로 보안이 약하다.
세션 : 서버에 저장되는 데이터로, 세션 ID를 통해 구분하며 웹 브라우저를 종료할 때까지 유지된다.
서버에 저장되므로 안전하다.
4.4 https와 https2
https 모듈은 웹 서버에 SSL 암호화를 추가한다.
SSL 암호화는 요청할 때 오가는 데이터를 암호화해서 보안을 높일 수 있다.
https는 인증서를 발급받아야 사용 가능하다.
https2 모듈은 SSL 암호화와 최신 HTTP 프로토콜 http/2를 사용할 수 있게 된다.
이 프로토콜을 사용하면 웹 속도가 많이 개선된다.
4.5 cluster
cluster 모듈은 기본적으로 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈이다.
클러스터에는 마스터 프로세스와 워커 프로세스가 있다.
- 마스터 프로세스 : CPU의 개수 만큼 워커 프로세스를 만든다.
- 워커 프로세스 : 실질적으로 일을 하는 프로세스이다.
5.1 npm 알아보기
npm은 Node Package Manager의 약어로 노드 패키지 매니저를 의미한다.
특정 기능을 하는 패키지가 필요하면 npm에서 찾아 설치한다.
npm의 대체자로 yarn과 npm이 있다.
yarn은 리액트나 리액트 네이티브 같은 프레임워크를 사용할 때 종종 볼 수 있다.
pnpm은 npm의 성능을 개선한 패키지이다.
5.2 package.json으로 패키지 관리하기
package.json은 설치한 패키지의 버전을 관리하는 파일이다.
npm을 통해 package.json을 만드는 명령어 : npm init
script 부분은 npm의 명령어를 저장해두는 부분으로 npm run [스크립트 명령어]를 입력하면 해당 스크립트가 실행된다.
package-lock.json은 패키지 간의 의존 관계를 명시한 파일이다.
5.3 패키지 버전 이해하기
패키지들의 버전은 세 자리로 이루어져 있다.
버전이 세자리인 이유는 SemVer 방식을 따르기 때문이다.
SemVer란 세 자리가 모두 의미를 갖고 있다는 뜻이다.
- 첫 번째 자리 : 메이저 버전, 0이면 초기 개발중, 1부터는 정식 개발을 의미한다.
- 두 번째 자리 : 마이너 버전, 하위 호환이 되는 기능 업데이트를 할 때 올린다.
- 세 번째 자리 : 패치 버전, 기존 기능에 문제가 있어 수정한 것을 내놓았을 때 올린다.
- ^ 기호 : 마이너 버전까지만 설치하거나 업데이트한다. (ex^1.1.1 이라면 1.1.1 이상 2.0.0 미만)
- ~ 기호 : 패치 버전까지만 설치하거나 업데이트한다.
5.4 기타 npm 명령어
패키지를 업데이트 하는 명령어 : npm update [패키지 이름]
패키지를 제거하는 명령어 : npm uninstall [패키지 이름]
패키지를 검색하는 명령어 : npm search [검색어]
패키지의 세부 정보를 파악하는 명령어 : npm info [패키지 이름]
npm 로그인을 위한 명령어 : npm login
자신이 만든 패키지를 배포하는 명령어 : npm publish
package.json의 버전을 올리는 명령어 : npm version [버전]
6.1 익스프레스 프로젝트 시작하기
가장 먼저 package.json을 생성한다.
script 부분에 start 속성을 넣어 nodemon app을 통해 서버의 수정사항을 자동으로 재시작하게 만들어 효율적으로 사용한다.
6.2 자주 사용하는 미들웨어
미들웨어는 요청과 응답 중간에 위치하기 때문에 미들웨어라고 부른다.
[morgan]
기존 로그 외의 추가적인 로그를 볼 수 있다.
[static]
정적인 파일들을 제공하는 라우터 역할을 한다.
[body-parser]
요청 본문의 있는 데이터를 해석해 req.body 객체로 만든다.
[cookie-parser]
요청에 있는 쿠키를 해석해 req.cookie 객체로 만든다.
[express-session]
세션 관리용 미들웨어로 로그인 등의 기능을 만들 때 유용하다.
[미들웨어 특성 활용하기]
미들웨어는 req, res, next(에러처리일 경우 err를 추가) 를 매개변수로 갖는 함수로
app.use, app.get, app.post 등을 장착한다.
특정 주소에 미들웨어가 실행되게 하려면 첫 번째 인수에 주소를 넣는다.
다음 미들웨어로 넘어가려면 next 함수를 호출한다.
[multer]
이미지, 동영상을 비롯한 멀티파트 형식으로 업로드할 때 사용하는 미들웨어이다.
6.3 Router 객체로 라우팅 분리하기
if문 등으로 주소를 분기하면 코드가 확장하기 어렵고 깔끔하지 않기 때문에 라우팅을 사용하여 코드를 깔끔하게 관리한다.
6.4 req, res 객체 살펴보기
익스프레스의 req, res 객체는 https 모듈의 req, res 객체를 확장한 것이다.
- res 객체는 요청에 관한 정보를 담고 있는 객체이다.
- res 객체는 응답에 관한 정보를 담고 있는 객체이다.
기능이 엄청 많기 때문에 참고하기
6.5 템플릿 엔진 사용하기
템플릿 엔진은 자바스크립트를 사용해서 HTML을 렌더링할 수 있게 한다.
[퍼그]
문법이 간단하기 때문에 코드양이 줄어들어 꾸준히 사용된다.
- 기존 HTML과 다르게 <> 닫는 태그가 없다.
- 탭 또는 스페이스로만 관계를 정의한다.
- 변수
변수를 사용하고 싶은 경우 =을 붙인 후 변수명을 적는다.
중간에 #{}을 통해 변수를 불러온다.
-을 입력하면 자바스크립트 구문을 사용할 수 있다.
- 반복문
each로 반복문을 돌릴 수 있다.
반복문 사용시 인덱스도 가져올 수 있다.
- 조건문
if, else if, else를 사용할 수 있다.
case 문도 가능하다.
- include
다른 퍼그나 HTML 파일을 넣을 수 있다.
따로 관리할 수 있어 페이지마다 동일한 HTML을 넣어야 하는 번거로움을 없앤다.
- extends와 block
레이아웃을 정할 수 있으며, 공통되는 레이아웃 부분을 따로 관리할 수 있어 좋다.
[넌적스]
퍼그의 HTML 문법 변화에 적응하기 힘든 사람한테 유용한 템플릿 엔진이다.
- 변수
변수는 {{}}로 감싼다.
내부에 변수를 사용할 때는 {%set 변수 = '값' %}을 사용한다.
- 반복문
{% %}안에 반복문을 작성한다.
for in문 endfor 사이에 위치한다.
반복문에서 인덱스를 사용하고 싶다면 loop.index를 사용한다.
- 조건문
if 변수, elif, else, endif 로 이루어져 있다.
case 문은 없지만 elif를 통해 분기 처리할 수 있다.
- include
다른 HTML 파일을 넣을 수 있다.
- extends와 block
레이아웃을 정할 수 있으며, 공통되는 레이아웃 부분을 따로 관리할 수 있어 좋다.
'Programming > NodeJS' 카테고리의 다른 글
NPM (Node Package Manager)? (0) | 2024.12.22 |
---|---|
Node.js 교과서 [NoSQL] #8 [몽고디비] (0) | 2024.03.30 |
Node.js 교과서 [NoSQL] #8 (0) | 2024.02.18 |
Node.js 교과서 [MySQL] #7 (1) | 2024.02.17 |
Node.js 교과서 [Express, Middleware, Route, 템플릿 엔진] #6 (1) | 2024.02.11 |