[데브코스][3-2] Node.js

·2024년 4월 25일
0

데브코스

목록 보기
10/20

1. HTTP 메서드

HTTP에 담아보내는 나의 목적 = HTTP method

HTTP = 규약

따라서, 정해진 용어가 존재하고 적절한 method를 사용해야 함

method

  • 생성: POST
  • 조회: GET
  • 수정
    • PUT(덮어쓰기)
    • PATCH(부분 수정, 바뀐 값만 수정), 마인 페이지에서 이름만 바꾸면 부분 수정
  • 삭제: DELETE
  • 그외) HEAD, OPTIONS, CONNECT, TRACE

2. Node.js

백엔드에만 쓰이는 게 아니다!(페이팔, 이베이 등은 node.js를 써서 유명하긴 함)

node.js는 여러 자바스크립트를 위해 운동장 깔아주는 역할, 즉, 자바스크립트가 스크립트 언어 이상으로 프로그래밍 언어 역할을 할 수 있도록 지원하는 플랫폼.

Node.js는 넷플릭스, 에어비엔비, 나사, 우버 등에서 사용됨

2.1 Node.js 특징

  1. 싱글스레드
  2. 이벤트 기반
  3. 논블록킹 I/O

세 가지 특징 쉽게 이해하기

주방장이 한 명인 주방이 있다고 가정해보자.

주방장이 한 명이면, 주문이 자꾸 밀려들어와도 혼자서, 한명이서 어떻게든 요리를 해내야 한다.`싱글 스레드`

요리 2개가 동시에 들어왔다고 가정해보자. 하나는 라면, 하나는 볶음밥이다.

라면의 요리 소요 시간은 총 10분이지만 물 끓이는데 5분이 걸린다.

볶음밥은 바로 5분동안 볶아주면 된다. 

그렇다면, 라면이 끓는동안 아무것도 안하고 라면물만 지켜보는 게 아니라, 그 시간에 볶음밥을 볶아야 옳은 선택이다.`논블록킹 I/O`

요리 주문이 안 들어온다면, 요리를 할 필요가 없다.`이벤트 기반` (**이벤트가 있어야만 일을 한다**(, 이벤트가 없다면 일을 안 한다))

2.2 실습

노드 버전 확인 명령어

node -v

setTimeout(원하는 시간이 지나고 안의 인자로 받은 것 실행해주는 모듈)모듈 사용해보기

순서상으로는 third보다 second가 먼저 출력되어야 하는데, 모듈 덕분에 third가 먼저 출력된 모습

function first(){
    console.log('첫 번째');
}
function second(){
    console.log('두 번째');
}
function third(){
    console.log('세 번쨰');
}

first();
setTimeout(second, 2000);
third();

2.3 모듈

모듈은 선배 개발자들이 미리 만들어놓은 코드 덩어리.

어디까지를 모듈이라고 칭할지, 덩어리를 어떻게 정의할지 다 내 마음!

하나의 함수를 각자 마음대로 짜는 것처럼 모듈도 마음대로 짤 수 있음

모듈을 가져다가 쓰는 방법 2가지

  1. 기본 내장된 것만 쓰기 (마치 앞서 봤던 setTimeout())
  2. 외부 모듈 사용하기(npm 명령어 사용)

2.4 라이브러리 vs 프레임워크

우리가 도서관에 가면, 엄청 많은 책들이 세부적으로 분류가 되어있고, 우리는 필요한 기준(작가, 내용, 출판사 등)에 따라서 판별해서 책을 고르게 된다.

모든 책을 다 볼 필요도 없고 본인 기준에서 원하는 책을 볼 수 있다는 장점도 있지만, 너무 방대한 선택지 중에서 고르기 어렵거나 힘들고 찾는데 시간이 오래 걸린다는 단점도 있다.

라이브러리는 모듈과 거의 비슷하다고 볼 수 있다.

모듈처럼 이미 만들어진 코드 덩어리이고 우리는 이걸 편의와 목적에 따라서 가져와 쓸 수 있다.

프레임워크는 틀 안에서 일하는 것이다.

내가 만들고 싶은 서비스를 구현하는데 필요한 모든 일을 틀 안에서 이미 존재하는 것이다.

프레임워크는 서비스 완성을 위해 필요한 라이브러리(모듈)을 다 틀 안에 넣어뒀다.

2.5 npm, figlet 사용해보기

이미 내장된 모듈은 그냥 사용하면 되지만, 외부 모듈을 사용하려면 특별한 명령어가 필요하다.

바로, npm

NPM

외부 모듈을 내 프로젝트에 설치할 수 있도록 해주는 역할 담당하는 NPM

  • 이 명령어로 어떻게 쉽게 설치가 가능하지?

우리 입장에서는 간단하지만, npm 입장에서는z 파일 다운받아서 우리 대신에 풀어서 쓸 수 있도록 하는 것

npm이 저장소에 외부 모듈을 설치를 우리가 원하는 프로젝트에 자동으로 해줌

  • 설치
npm install 모듈
  • 제거
npm uninstall 모듈
  • 모듈 설치
npm i 모듈명 -g 

내 컴퓨터에 있는 모든 프로젝트에 해당 모듈 설치하는 것 <추천하진 않음>

유명한 모듈 중 하나인 figlet 사용해보는 실습을 해보자.

npm 사이트에서 찾아서 코드 vscode에서 돌려보자.

npm: figlet

var figlet = require("figlet");

figlet("Hello World!!", function (err, data) {
  if (err) {
    console.log("Something went wrong...");
    console.dir(err);
    return;
  }
  console.log(data);
});

결과물

  _   _      _ _        __        __         _     _ _ _ 
 | | | | ___| | | ___   \ \      / /__  _ __| | __| | | |
 | |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` | | |
 |  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |_|_|
 |_| |_|\___|_|_|\___/     \_/\_/ \___/|_|  |_|\__,_(_|_)

작동 방식

figlet(매개변수1,매개변수2)

매개변수1은 프린팅하고 싶은 문자

매개변수2는 콜백함수

문자열을 받아서, 아스키 아트를 생성한 후 두번째 매개변수 function 콜백 함수를 실행하는 방식

  • 왜 익명의 함수를 전달할까?
    • 이 함수를 쓸 일이 다른 곳은 없어서, 일회용으로 사용하려고
  • 왜 매개변수로 함수를 받을까?
    • figlet을 만든 사람이 매개변수로 함수를 받기로 해서…

콜백 함수 쪼개보기

let http = require('http'); // 내장 모듈(npm 불필요)

function onRequest(request, response){
    response.writeHead(200, {'Content-type' : 'text.html'});
    response.write('Hello Node.js');
    response.end();
}

http.createServer(onRequest).listen(8888); 
// http 모듈의 createServer 함수에 할일을 다 한 다음에
// onRequest 콜백 함수를 실행시킴

이전에 작업했던 HTTP 서버 파일

http.createServer(onRequest).listen(8888);

이 부분에서 HTTP 모듈의 createServer 함수에 할일을 다 한 다음에

onRequest 콜백 함수를 실행시키는 것 확인 가능

⚠️ 참고) var, let, const
var - 함수레벨 스코프, 전역 변수

let - 블록 레벨 스코프

const - 블록 레벨 스코프, 상수, 초기 할당 이후 변경 불가능
⚠️ 참고) 탬플릿 문자열
템플릿 문자열 도입 전
console.log(num1 + 'X' + num2 +  "=" + num3);
템플릿 문자열 도입 후
console.log(`${num1} X ${num2} = ${num3}`);

백틱과 ${}를 이용해서 간단하게 문자열 생성 가능, 특히나 변수 삽입이 매우 쉬워짐

2.6 모듈 지우기

npm uninstall figlet

// 결과
// removed 1 package, and audited 12 packages in 535ms

npm uninstall 명령어 사용하면 됨

모듈 객체는 package.json에서 확인 가능

figlet 모듈 설치 전에는 객체 안에 아무것도 없었는데 반해서

설치 후에는 figlet 정보 확인 가능

dependencies는 사용할 것들에 대한 키

package.json vs package-lock.json

후자는 좀 더 구체적인 정보를 담은 파일

0개의 댓글