| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- pwnable.tw
- 유클리드_알고리즘
- 개인정보보호교육
- Writeup
- 한국산업인력공단
- function scope
- 한국정보보호산업협회기자단
- 호이스팅
- 개인정보보호위원회
- 웹 프레임워크
- 곱셈 암호
- 백엔드입문
- node.js
- 국가인적자원개발컨소시엄
- 포너블
- arrow function
- 동적타이핑
- 디오판투스 알고리즘
- 개인정보보호
- 확장 유클리드 알고리즘
- 마감임박
- 덧셈 암호
- 무료교육
- 백엔드
- 가명정보처리
- 한국정보보호산업협회
- package-lock.json
- package.json
- 모듈러 연산
- 개인정보안전성
- Today
- Total
짱짱해커가 되고 싶은 나
Node.js 훑어보기 본문
Node.js
: 웹브라우저에서 쓰이는 자바스크립트를 서버에서도 사용 가능하게 만드는 것.
(자바스크립트 문법을 서버에서 사용가능하도록 V8(프론트엔드에서 쓰이는 자바스크립트)를 서버에서도 사용할 수 있도록 for 대용량 서비스).
Q. Node.js와 브라우저의 차이점
A. 제공하는 API와 엔진이 다르다.
| Node.js | 브라우저 |
| UI 관련 API x | UI 관련 API o |
| window, document 관련 API x | window, document 관련 API o |
| 컴퓨터 제어 API o | 컴퓨터 제어 API x |
| v8 | 다양한 엔진 사용 가능 |
프론트엔드 : javascript
백엔드 : javascript, PHP, java 등
백엔드에서 javscript를 사용하면 언어의 통일성
walmart, ebay, netfix, microsoft 등의 회사에서 많이 사용.
에디터 - visual studio code / atom / webstorm
R(read) E(eval) P(print) L(loop) 모드
: 사용자가 입력한 내용을 일고 결과값을 구하고 출력하고 이 과정을 반복한다. (짧은 코드 테스트에 적합)
터미널에서 node 만 치면 REPL 모드 사용 가능.
js에서는 결과값을 따로 리턴하지 않으면 undefinde로 리턴을 처리한다.

그래서 function을 선언하면 함수 자체는 리턴이 없기 때문에 undefined 로 리턴되지만 함수를 사용하면 결과값이 리턴되서 undefined가 사라지는 것을 확인할 수 있다.
REPL 모드를 나가고 싶으면 .exit를 입력하면 된다.
모듈 패턴
: 특정 기능만 하는 파일을 다른 파일에서 사용할 때 불러서 사용하는 것(모듈화)
내보낼때는 module.exports.변수명
or module.exports = 함수명;
불러올때는 require('파일경로')
(다른 사람이 만든 내장모듈일 경우 파일경로를 입력하지 않는다. uuid4 예시에서 설명 예정)
exports.#1 = #2; 모듈 외부에 #1로 내보내기 (#2가 모듈 내부에서의 이름)
module.exports = #2; 객체를 외부에 보낼 때는 mdule.exports 를 사용
Node.js가 모듈을 로드할 때는 Moduel wrapper function 을 수행하는데 이는 모듈 내의 전체코드를 감싸주는 작업이다.
function(exports, requird, module, __filename, __dirname){모듈 내용};
exports 객체 = moudle 객체의 exports 속성이 가리키는 객체 = 다른 모듈에서 require 함수로 로드할 때 리턴되는 객체
exports 나 moudle.exports를 통해 이 객체에 접근한 것.



이렇게 모듈화를 사용하면 my.js에 있던 Myvar 함수를 내보내서 index.js 파일에서 Myvar함수를 불러오고 사용할 수 있다.
Q. 위의 경우는 직접 파일에서 만들어내서 모듈을 사용한 것이었는데 다른 사람들이 만들어 놓은 모듈은 어떻게 사용할 수 있을까?
A. npm 이용하기
(npm에 패키지로 만들어놓은 것을 사용)
- 코어 모듈 : node의 실행 파일 안에 있는 모듈
https://nodejs.org/dist/latest-v12.x/docs/api/
- third 파티 모듈 : 다른 개발자나 회사들이 만들어서 인터넷의 공개 저장소에 제공하는 모듈
코어 모듈의 대부분이 EventEmitter 클래스의 객체
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
- on() : 이벤트 등록
- emit() : 인위적으로 이벤트 발생
- once() : 특정 이벤트에 대한 이벤트 핸들러를 동록하는데 해당 이벤트에 대해서 딱 한번만 반응
- listeners() : 특정 이벤트에 대한 이벤트 핸들러들을 출력
- off() : 이벤트 핸들러 해제
모듈의 이름은 파일의 이름일 수도 디렉토리의 이름일 수 도 있다.
Node.js에서 모듈이 검색되는 순서(require의 절차)는 파일을 확인하고 없다면 디렉토리를 확인한다.
그리고 디렉토리 안에 package.json 파일이 있으면 main 필드의 적인 파일을 로드하고, package.json 파일이 없다면 index.js 파일을 로드한다. 서드 파티 모듈은 항상 package.json의 main 필드 아니면 index.js안에 있기 때문에 디렉토리에 해당한다.
-> packge.json 파일을 가진 디렉토리가 패키지며 모든 서드 파티 모듈은 패키지다.
package.json
: 저자가 누군지 등 패키지에 대한 설명이 저장해놓은 것.
cmd 창에서 npm init을 누르면 다음과 같이 package.json을 생성할 수 있다.

cmd 창에서 npm init -y를 누를 경우 위에서 직접 입력하는 과정이 생략되고 디폴트 값으로 package.json이 생성된다.
npm install 명령어를 통해 다른 사람들이 만든 패키지를 설치한다.
패키지를 설치하면 해당 폴더에 node_modules 가 생기고 require를 통해 다른 사람들의 패키지를 사용할 수 있다.
ex) npm install uuid4
uuid4는 unique한 key값을 알려준다.

이와 같이 외부 모듈을 불러올 때는 파일 경로가 아닌 패키지 이름을 사용한다.
실행결과는 다음과 같이 고유한 key값을 출력해준다.

package.json파일을 다시 확인해보면 dependencies에 설치한 패키지들에 대한 정보를 확인할 수 있다.

다른 사람에게 파일을 전송할 때 node_modules의 용량이 크기 때문에 이를 제외하고 보내는데 그렇게 될 경우 그 사람의 폴더에는 해당 패키지가 깔려있지 않아서 실행이 불가능하다. 이때 package.json 파일을 함께 보낸다면 해당 파일에 있던 dependencies를 참고해서 npm install 명령어를 입력하면 자동으로 dependencies에 있는 패키지들을 설치해준다.
package.json의 scripts 부분도 직접 수정할 수 있는데 예를 들어 "start" : "node index.js" 라고 수정할 경우, cmd 창에서 npm start를 하면 node index.js와 동일하게 index.js가 실행된다. 이 때 start는 예약어기 때문에 다른 추가적인 내용 없이 그냥 npm start만 쓰면 되는데 만약 임의로 "dev" : "node index.js" 라고 한다면 cmd창에서 npm run dev라고 해야한다.
package-lock.json
앞서 설치한 express와 uuid4 패키지가 사용하는 최적화된 라이브러리가 다른데 동일한 라이브러리를 사용한다면 모듈의 충돌이 발생한다. ex) express - lodash v3, uuid4 - lodash v4인데 v4 패키지를 설치하고 express와 uuid4가 이를 참조하도록 하면 express는 v3환경에서 최적화되어 있기 때문에 문제가 발생할 수 있다.
이처럼 top library(express, uuid4)와 각각의 top libraray가 참고하는 하위 library(lodash v3, lodash v4)의 정보가 package-lock.json 파일에 담겨 있다.
해당 패키지의 requires 부분을 보면 이런 정보가 담겨 있어 모듈 충돌을 방지할 수 있다.

nodemon
간단하게 로컬에서 서버를 만들었을 때 cmd 창에서 서버를 구동시킨 상태에서 코드를 수정하고 서버를 새로고침하면 변경사항이 업로드 되지 않는다. cmd에서 서버를 끄고 다시 재실행시켜야 변경사항이 업로드 되는데 이 과정은 번거롭기 때문에 nodemon을 사용한다.

npm -install -g nodemon 명령어를 통해 nodemon을 설치한다.
nodemon은 서버를 끄지 않아도 자동으로 변경을 감지하고 업로드 해주기 때문에 수정한뒤 새로고침만 하면 변경 사항을 확인할 수 있어서 간편하다.

nodemon은 다른 npm으로 설치한 패키지들과 달리 시스템 영역에 설치된다. (ex. C 드라이브)
그렇기 때문에 폴더의 node_modules가 생기지 않는다.
간편하게 사용하기 위해 앞서 본것처럼 package.json에서 script에 "start" : "nodemon index.js"라고 할 경우 nodemon이 없는 경우 해당 예약어가 실행 될 수 없다. 이를 해결하기 위해 "start" : "npx nodemon index.js" 를 사용하는데 npx는 해당 컴퓨터의 시스템 영역에 nodemon이 없어도 이를 자동으로 설치한 뒤 실행하기 때문에 npx를 붙히는 것을 추천한다.
'Web > Node.js' 카테고리의 다른 글
| 사용자와 댓글 관리 서버 - 2 (0) | 2020.12.05 |
|---|---|
| 사용자와 댓글 관리 서버 - 1 (0) | 2020.12.04 |
| sequelize (0) | 2020.11.22 |
| [http 모듈] 쿠키 (0) | 2020.10.25 |