<다시한번 더 정리>
promise(약속)
/ async(비동기), await(기다리다)
-> promise
는 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있다.
다만 최종 결과를 반환하는 것이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '약속'(프로미스)을 반환한다.
-> Async
를 함수와 같이 사용하면 결과를 직접 반환하는게 아니라 Promise
를 반환한다는 것을 잊지말자.
-> await
: 어떠한 Promise기반 함수(비동기함수) 앞에 놓을 수 있다.
우리의 코드의 Promise
가 fulfil될 때 까지 잠시 중단하고, 결과를 반환한다. 그리고 실행을 기다리는 다른 코드들을 중지시키지 않고 그대로 실행되게 한다.
-> 고로 await
뒤의 값은 무조건 promise 인스턴스
- 대기(pending): 이행하지도, 거부하지도 않은 초기 상태.
- 이행(fulfilled): 연산이 성공적으로 완료됨.
- 거부(rejected): 연산이 실패함.
try...catch
참고하면 좋을 사이트 & 바닐라코딩 노션도 다시 참고하기
간략하게 줄어보자면,
try...catch
는 동기 코드에서 에러핸들링을 할 때에 활용하였는데,
Promise
의 장점은 코드의 비동기 흐름을 동기스럽게 제어할 수 있는 것이었으므로 이를 더 업그레이드 시킨 Async Await
을 이용하여도 try~catch
구문을 사용할 수 있다.
new 연산자
를 이용한 객체 생성 vs 객체 리터럴({})
로 객체를 생성
<추가>
dotenv
문서 다시 잘 읽어보기res.send
vs res.json
vs res.end
차이점 찾아보기mongoose.Schema
디테일한 사용법 찾아보기require
vs import
ODM
, ORM
?json
? package.json
?buffer
?queryString
?ODM
, ORM
?-> 노드(Node.js)
란 브라우저 이외의 곳(ex 컴퓨터 OS)에서 자바스크립트가 사용될 수 있도록 만들어진 자바스크립트 환경이다.
이전에는 자바스크립트 엔진이 내장되어 있던 브라우저 외에 곳에서는 자바스크립트를 실행시킬 수 없었다. 때문에 이러한 불편함을 느낀 Ryan dahl이라는 사람이 크롬의 V8 엔진
을 이용하여 브라우저 이외의 환경에서도 자바스크립트를 실행시킬 수 있는 환경을 구축했는데, 그것이 바로 Node.js라고 한다.
(크롬의 V8 엔진은 오픈 소스 프로젝트이기 때문에 이를 이용하여 만들 수 있었다.)
노드는 파일 시스템 관리를 할 수 있고 네트워크 요청을 할 수 있는 기능도 있다.
그렇기에 노드를 이용해 백엔드 서버도 구현할 수 있다.. 🤭
❓ 그렇다면 우리가 평소에 터미널에서 흔하게 쓰는 npm 은 무엇일까?🤔
npm 은 Node Package Manager 약자이다.
여기서 말하는node
는 곧nodejs
를 뜻하는 것을 유추해 볼 수 있고,
이를 이용하여 만든 패키지라는 걸 알 수 있다.
package
는모듈
이라고도 불리는데 패키지나 모듈은 프로그램보다는 조금 작은 단위의 기능들을 의미하고, Manager는 뜻 그대로 관리자를 의미한다.
따라서 이를 통해 npm은 Node.js로 만들어진 pakage(module)을 관리해주는 툴이라는 것을 알 수 있다..
그렇다면, 위에서 말했듯
nodejs
를 이용하여 서버를 만들 수 있다고 하였는데,
서버를 만들어서 클라이언트 / browser 에게 어떤 것들을 할 수 있지 않을까?
-> 아! 우리가 흔하게 인터넷으로 많이 하고 있는 인터넷쇼핑과 같이 클라이언트의 정보를 받아 회원가입을 시키고 어떠한 물건을 사고 싶은지에 대한 정보도 받을 수 있을 것이고, 이 외의 다양한 웹사이트와 같이 클라이언트의 정보를 받아 무언가 할 수 있겠구나!
또 그렇다면 그에 대한 응답 또한 클라이언트에게 보여주어야 서로에게 의사 소통을 하며 무언가를 할 수 있지 않을까?
❗️ 서버는 클라이언트 또는 브라우저에게 요청을 받으면, 그에 대한 요청을 처리하고 응답을 해주어야 하고, 응답을 해줄때는 반드시 응답 코드가 포함되어야 한다.
우리가 흔하게 겪었던 404 에러를 예로 들 수 있는데, 그 숫자가 바로 서버가 보낸 응답 코드인 셈이다.
그러면 이제 nodejs를 이용하여 form을 처리해보자.
아래 코드는 nodejs
를 이용하여 서버를 만들었다고 가정하고,
그 안에서 form을 처리하기 위한 코드이다.
주로 쓰이는 코드 용어를 보자면,
req
는 클라이언트가 서버에게 보낸 request(요청)
을 뜻하고 res
는 서버가 클라이언트에게 보내는 response(응답)
을 뜻한다.
따라서, 아래 코드를 서버인 nodejs
입장에서 해석해보자면,
클라이언트가 요청한 메서드가 "GET"이고, 요청한 url이 "/signup"일 경우,
아래의 코드를 실행해달라는 것이다.
메서드는 주로 4가지가 존재한다.
- POST: 서버에 데이터를 생성해달라고 요청
- GET: 서버에 데이터를 찾아달라고 요청
- PUT: 서버에 데이터를 수정해달라고 요청
- DELETE: 서버에 데이터를 삭제해달라고 요청
그렇다면, fs.readFile
이란 무엇일까?
fs 모듈
은 FileSystem의 약자로 파일 처리와 관련된 모듈이다.
대표적으로 파일 읽기, 파일 쓰기를 할 수 있다.
readFile
도 뜻 그대로 파일을 읽어달라는 메서드인데,
이러한 메서드의 쓰임은 공식문서를 통해 확인하면서 사용해 볼 수 있겠다.
const { readFile } = require("fs/promises");
if (req.method === "GET" && req.url === "/signup") {
return fs.readFile(path.join(__dirname, "/static/index.html"), function(
err,
template
) {
if (err) {
return res.end("Error :(");
}
res.end(template);
});
}
위의 코드를 간략하게 설명해보자면, "/static/index.html"
경로의 파일을 읽어주고 만약 에러가 있다면 "Error :("
를 클라이언트에게 응답해주고, 그게 아니라면 template
를 반환하라는 것이다.
위와 같이 nodejs만으로 서버를 관리하기에는 손이 많이 가므로 프레임워크나 라이브러리를 nodejs와 같이 많이 사용하는데, express는 그 중에서도 가장 대표적인 서버 쪽 프레임워크이다.
이제 Express 서버에 MongoDB와 연결하도록 설정하는 코드를 작성해야 합니다. mongoose
라이브러리를 이용해 연결하도록 하겠습니다.
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/${DB_NAME}", {
useNewUrlParser: true
});
const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", console.log.bind(console, "Connected to database.."););
mongoose
라이브러리는 MongoDB의 자료를 다룰때 주로 사용되는 Object Document Mapping(ODM) 라이브러리입니다. 필수는 아니지만, 많은 개발자들이 사용하는 프로그램입니다.
mongoose
의 핵심 역할 3가지.
1. 자료 간의 관계 관리
2. 자료 스키마 유효성 검사 제공
3. MongoDB의 자료를 객체 지향적인 관점을 가진 코드로 다룰 수 있는 기능 제공
리뷰 내용 중) -> mongoose schema (스키마)
에서 최종적으로 에러가 발생하겠지만 몽구스 스키마는 단순히 타입만 검사하기 때문에 이외의 검사는 스스로 작성해야 합니다.