Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. Node.js는 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적입니다. Node.js 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.
-- Node.js 공식 사이트
Node.js란 Javascript를 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경을 의미
초기 javascript는 넷스케이프라는 웹브라우저에서 사용하기 위해 만들어진 언어
자바 스크립트 이전에는 움직이지 않는 정적인 홈페이지들만 있었으나, 자스의 등장으로 역동적인 움직임이 가능
후에 넷스케이프외에도 저희에게 익숙한 Internet Explorer같은 다른 브라우저들도 비슷한 언어를 개발하기 시작. 브라우저들마다 개발하는 방식이 다 달라서 표준화 시키는 작업이 필요했는데 그렇게 나온것이 ECMAscript
ES6란 ECMAScript의 6번째 버전으로 2015년에 발표되어서 ECMAScript 2015라고도 불린다.
일반적으로 "동기로 실행된다" 라고 함은, 먼저 실행된 코드의 결과가 나올때까지 대기하는것을 말한다.
일반적으로 "비동기로 실행된다" 라고 함은, 실행된 순서와 관계 없이 결과가 나오는것을 말다.
Blocking Model이란, 코드의 실행이 끝나기 전까지 실행 제어권을 다른곳에 넘기지 않아 다른 작업을 하지 못하고 대기하는 것을 말한다.
Non-Blocking Model이란, 코드의 실행이 끝나지 않아도 실행 제어권을 다른곳에 넘겨 다음 코드가 실행될 수 있는것을 말한다.
자바스크립트는 Async + Non-Blocking Model을 채용하여 현재 실행중인 코드의 실행이 끝나지 않아도 다음 코드를 호출.
결론적으로 자바스크립트는 각 명령들이 순서대로 실행될 수 있게 구현되어 있지만, Non-Blocking Model에 의해 동기적 명령이 아닌 모든 함수는 비동기적으로 실행
자바스크립트에서 비동기 처리를 동기로 처리할 수 있게 돕는 Built-in(미리 내부적으로 정의된)객체 유형
Promise 생성자 인터페이스
executor
에는 함수만 올 수 있으며 인자로 resolve
, reject
가 주입.
executor
는 Promise의 실행 함수라고 불리고, Promise가 만들어질 때 자동으로 실행된다.
Promise가 연산을 언제 종료하는지 상관하지 않고, resolve
, reject
중 하나를 무조건 호출해야한다.
Promise의 상태
resolve
된다.await
연산자를 사용할 수 있다.// 비동기 + 일반 함수
async function 함수이름() {
// 명령문
}
// 비동기 + 익명 함수
async function() {
// 명령문
}
// 비동기 + 화살표 함수
async () => {
// 명령문
}
이러한 특징은 마치 아래처럼 작성하는 것과 굉장히 비슷하다.
function 함수이름() {
return Promise.resolve('값');
}
// 위와 아래의 함수는 같은 동작을 보여준다.
async function 함수이름2() {
return '값';
}
함수이름();
// Print: Promise { '값' }
함수이름2();
// Print: Promise { '값' }
아래 서술할 await연산자는 비동기 함수 안에서만 사용 가능한데 이를 활용하면 문법이 훨씬 간결해질 수 있다.
new Promise(executor) 코드로 Promise를 직접 생성하면 executor가 바로 실행되는것과 달리, 비동기 함수는 함수가 실행되기 전까지 Promise를 생성하지 않는다.
await
연산자를 사용하면 Promise가 fulfill 상태가 되거나 rejected될 때 까지 함수의 실행을 중단하고 기다릴 수 있다.
Promise의 연산이 끝나면 함수에서 반환한 값을 얻을 수 있다.
await 연산자는 async 함수 안에서만 사용할 수 있다.
await 안 썼을때
await 썼을때
Javascript의 데이터 타입은 크게 원시 타입과 객체 타입으로 분류된다.
원시 타입은 단 하나의 값만을 나타내고, 원시 타입의 값은 변경이 불가능 한 값.
객체 타입은 다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료 구조이고, 객체 타입의 값을 변경 가능한 값.
Javascript는 객체(Object) 기반의 프로그래밍 언어이고, Javascript를 구성하는 거의 모든 것은 객체로 구성.
객체(Object) 는 0개 이상의 프로퍼티로 구성된 집합이며, 하나의 프로퍼티는 Key와 Value로 구성.
리터럴(literal)은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법
객체 리터럴은 객체를 생성하기 위한 표기법
객체 리터럴은 객체를 생성하기 위해 Class를 먼저 선언하고 new 연산자와 함께 생성자를 호출할 필요가 없이 일반적인 숫자, 문자열을 만드는것과 유사하게 객체를 생성
객체 리터럴은 중괄호 {} 내에 0개 이상의 프로퍼티를 정의해서 선언
let objectLiteral = {
key: 'Value',
helloWorld: function () {
return "Hello world";
}
};
객체의 상태를 나타내는 값(Data).
프로퍼티는 키(Key)와 값(Value)으로 구성
const human = {
// 프로퍼티 키: 'name', 프로퍼티 값: '이용우'
name: '이용우',
// 프로퍼티 키: 'human age', 프로퍼티 값: 28
'human age': 28
}
프로퍼티를 참조하고 조작할 수 있는 동작(behavior)을 나타낸다.
객체의 프로퍼티 값이 함수로 구성되어 있을 경우 메서드(Method)라고 부른다.
let objectLiteral = {
key: 'Value', // 프로퍼티
helloWorld: function () { // 메서드
return "Hello world";
}
};
console.log(objectLiteral.helloWorld()); // Hello world
에러 핸들링은 에러를 관리하는 방법이고, 예상치 못한 상황에 대처하는 방식
서버에서 에러발생하지 않기 위해 예외 처리를 진행하는데, 일반적으로 try..catch문을 사용한다.
const users = ["Lee", "Kim", "Park", 2];
try {
for (const user of users) {
console.log(user.toUpperCase()); // 대문자로 번경하는 함수
}
} catch (err) {
console.error(`Error: ${err.message}`);
}
// LEE
// KIM
// PARK
// Error: user.toUpperCase is not a function
에러를 고의로 발생시킬 때 사용한다.
throw를 호출하면 그 즉시 현재 실행되고 있는 함수는 실행을 멈추게 된다.
function withdraw(amount, account) {
if (amount > account.balance)
throw new Error("잔고가 부족합니다.");
account.balance -= amount;
console.log(`현재 잔고가 ${account.balance}남았습니다.`); // 출력되지 않음
}
const account = { balance: 1000 };
withdraw(2000, account);
// Error: 잔고가 부족합니다.
finally는 에러가 발생했는지 여부와 상관없이 언제든지 실행된다.
현실과 비슷한 개념(객체)을 나타내기 위한 도구를 클래스(Class)라고 부른다.
클래스는 미리 정의해놓으면 필요할 때마다 해당 클래스로 동일한 틀을 가진 객체를 만들 수 있음
클래스 내부에서 constructor()로 정의한 메서드를 "생성자"라고 한다.
생성자의 바디에서 this 키워드를 사용. 이 this는 클래스를 사용해 만들어 질 객체 자신을 의미하고 this 뒤에 붙는 name, age, tech는 클래스를 이용해서 만들어질 객체의 속성(Propety).
프로퍼티 값이 함수일 경우에는 일반 함수와 구분하기 위해 메서드(Method)라고 부른다.
즉, 메서드는 객체(Object) 에 묶여 있는 함수를 의미
상속을 이용해 부모 클래스와 자식 클래스로 나누는데, 부모 클래스의 경우 메서드, 내부변수와 같은 정보를 자식 클래스에게 할당 가능.