chrome V8 javascript 엔진으로 빌드 된 javascript 런타임이다
javascript 를 브라우저가 아닌 환경에서 사용할 수 있게 해주는 것이다
=> 함수가 실행되는 중에도 다른 작업을 동시에 진행할 수 있다
비동기 작업을 효율적으로 할 수 있는 특성이다
=> 스레드를 하나밖에 사용할 수 없다
연산 시간이 늘어나게 될 수 있지만, 병렬 프로그래밍이나 멀티 프로세싱에 대해 고민하지 않아도 된다는 장점도 있다
=> 싱글 스레드의 약점을 극복하기 위해서 효율적으로 작업을 처리할 수 있는 특성이다
입력 받은 코드를 읽어 메모리에 저장하고 평가된 값을 바로 출력하는 환경이다
입력한 코드의 결과값을 바로 확인할 수 있다
( VS 코드에서 터미널에서 node 파일명 을 입력하면 결과가 바로 나오는 것이 REPL 이다)
동기로 실행된다 -> 먼저 실행된 코드의 결과가 나올때까지 대기하는 것
비동기로 실행된다 -> 실행된 순서와 관계 없이 결과가 나오는
Blocking Model
코드의 실행이 끝나기 전까지 실행 제어권을 다른곳에 넘기지 않아 다른 작업이 되지 않는다
=> 제어권을 넘기지 않아 비동기 처리가 가능한 환경이어도 ~비동기 처리가 불가능하다~
Non-Blocking Model
코드의 실행이 끝나지 않아도 실행 제어권을 다른곳에 넘겨 다음 코드가 실행된다
=> 제어권을 넘겨 다른 코드가 실행이 가능하기 때문에 ~비동기 처리~가 가능하다
JavaScript는 각 명령들이 순서대로 진행될 수 있게 구현되어 있지만,
~Non-Blocking Model 을 통해서 비동기적으로 처리가 된다~
async function main() {
function first() {
console.log("set Time Out 이 실행되었습니다");
}
console.log("코드가 실행되었습니다");
setTimeout(first, 1000); // 1초 뒤에 first 함수를 실행한다
console.log("코드가 종료되었습니다");
}
main();
Blocking Model 이라면
// 코드가 실행되었습니다
1초후
// set Time Out 이 실행되었습니다
// 코드가 종료되었습니다
가 되겠지만, Non-Blocking Model 이기 때문에 set Time out 이 실행되지 않아도 다음의 코드가 실행되게 되어
//코드가 실행되었습니다
// 코드가 종료되었습니다
1초후
// set Time Out 이 실행되었습니다
가 나오게 된다
JS에서 비동기 처리를 동기 처리로 할 수 있게 해주는 객체 유형
( 생성자 함수를 통해서 생성해준다 ) - 객체의 속성이기 때문에
new Promise(executor)
new Promise((resolve, reject) => {
}
(executor) 는 promise 가 만들어질 때 자동으로 실행되는 함수이고
무조건 resolve, reject 중 하나를 호출해야 한다
=> 성공적으로 실행이 되었다면 resolve 를,
실패라면 reject 를 실행한다
@Promise 의 상태
1. 대기(Pending) => 이행하거나 거부되지 않은 초기 상태
2. 이행(Fullfilled) => 연산이 성공적으로 완료됨
3. 거부(Rejected) => 연산이 실패함
@Promise.then
=> executor 가 resolve 함수를 호출할 경우에 실행되는 메서드
=> then 함수를 호출하는 시점에서는 resolve 가 호출되었기 때문에 Fullfilled Promise 가 된다
@Promise.catch
=> executor 가 reject 함수를 호출할 경우에 실행되는 메서드
%함수형 프로그래밍
const firstPromise = Promise.resolve('First');
firstPromise.then(console.log);
// 'First'
'First'의 값을 then 의 value 로 전달하게 되는데 일반적으로 사용하는 console.log() 가 아닌 ()를 빼서 바로 console.log 함수에 바로 전달할 수 있다
=> 비동기 함수는 언제 사용하는가?
await 연산자를 활용하면 fullfill 상태가 되거나 rejected 가 될 때까지 함수의 실행을 중단하고 기다릴 수 있다
=> promise 연산이 끝나면 함수에서 반환한 값을 얻을 수 있다
function setTimeoutFunc(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(time, "에 해당하는 시간이 지났습니다");
resolve();
}, time);
});
}
async function main() {
console.log("시작 되었습니다");
setTimeoutFunc(1000);
console.log("종료 되었습니다");
}
main();
의 결과는 일반적인 비동기 함수의 경우에는
// 시작 되었습니다
// 종료 되엇습니다
1초후
// 1000에 해당하는 시간이 지났습니다
가 나오게 된다
여기서
async function main() {
console.log("시작 되었습니다");
await setTimeoutFunc(1000);
console.log("종료 되었습니다");
}
setTimeoutFunc 에 await 연산자를 사용하게 되면 setTimeoutFunc 가 resolve, or reject 함수를 반환하기 전까지 대기를 하게 되기 때문에
// 시작 되었습니다
1초후
// 1000에 해당하는 시간이 지났습니다
// 종료 되엇습니다
가 나오게 된다
node.js 로 서버를 빠르고 간편하게 만들 수 있게 도와주는 웹 프레임 워크
node.js 에서 가장 많이 사용하는 프레임워크 이다
( nest.js 도 각광받고 있다 )
express.js 는 웹서버 자체가 아닌 웹 서버를 구현하기 위한 웹 프레임워크 이다
개발 단계에서 우리가 작성한 api 요청을 확인하거나 테스팅 할 때 도움을 주는 툴
굳이 프론트엔드와 연결하지 않아도 api client 를 통해 테스트를 진행하면서 코딩을 할 수 있다
thunder client 를 이용할 것이다