node js는 공식 홈페이지에서 다운로드가 가능하다.
https://nodejs.org/ko/download
다운로드 | Node.js
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
nodejs.org
1. ES2015+
ES2015+는 자바스크립트 문법이다. 2015년에 자바스크립트 문법에 큰 변화가 있었는데 어떤 식으로 변화되었는지 같이 알아보자.
1.1 const, let
보통 javascript는 var로 변수를 선언한다. 하지만 ES2015+부터는 const와 let가 추가되었다.
var는 변수를 선언하면 선언한 변수를 나중에 초기값을 설정할 수도 있고 변수의 값을 변경할 수도 있다. 그리고 함수 스코프를 가지므로 블록과 관계없이 접근할 수 있다.
하지만 const와 let는 블록 스코프를 가진다. 그래서 블록 밖에서는 접근할 수가 없다.
또 var로 선언한 변수는 재할당이 가능하고 초기값은 선언안해줘도 된다.
하지만 const는 변수를 선언하는 동시에 초기값을 설정해줘야 하며 재할당도 불가능하다. 그래서 흔히 const는 상수라고도 표현하기도 한다.
let은 초기값을 설정해도 재할당이 가능하다.
1.2 탬플릿 문자열
ES2015+ 문법에 백틱이 추가되었습니다.
기존 문법 같은 경우는 문자열을 일일히 더해서 string을 만든다.
ES2015+ 문법에는 ``으로 문자열을 감싸서 훨씬 깔끔하게 결과를 출력할 수 있다. 그리고 변수를 출력할 때는 ${변수}로 변수 값을 삽입할 수 있다.
1.3 객체 리터럴
객체 리터럴에 편리한 기능들이 추가되었다.
위와 아래 코드를 비교하면 이제 객체의 메서드에 함수를 연결할 때 콜론과 function을 붙이지 않아도 된다.
그리고 {name: name, age: age} 같이 속성과 변수가 동일한 경우 한 번만 써도 된다.
1.4 화살표 함수
화살표 함수라는 새로운 개념이 생겼다.
이렇게 function을 화살표 함수로 간략하게 만들 수 있다. 또한 내부에 return문 밖에 없는 경우는 return 할 값만 작성하면 된다.
1.5 구조분해 할당
구조분해 할당을 사용하면 객체와 배열로부터 속성이나 요소를 쉽게 꺼낼 수 있다.
위 코드를 아래로 변경할 수 있다.
코드의 의미는 candyMachine 객체 안의 속성을 찾아서 변수와 매칭한다.
1.6 클래스
클래스 문법이 추가되었는데 다른 언어처럼 클래스 기반으로 동작하는 것이 아니라 프로토타입 기반으로 동작한다.
1.7 프로미스
자바스크립트와 노드에서는 주로 비동기를 많이 사용한다. 특히 이벤트 리스너를 사용할 때 콜백 함수를 자주 사용한다.
ES2015+에서는 자바스크립트와 노드의 API들이 콜백 대신 프로미스기반으로 재구성되고 있다.
그만큼 프로미스는 반드시 알아두어야 하는 객체이다.
프로미스는 다음과 같은 규칙이 있다.
★ 프로미스 객체 생성
new Promise로 프로미스를 생성할 수 있으며 내부에 resolve와 reject를 매개변수로 갖는 콜백 함수를 넣는다.
그래서 프로미스 내부에 resolve가 호출되면 then이 reject가 호출되면 catch가 실행된다. finally는 성공/실패 여부 상관없이 실행된다.
프로미스를 간단하게 설명하면 실행을 바로 하되 결괏값은 나중에 받는 객체이다.
new Promise는 바로 실행이 되지만 결과값은 then을 붙였을 때 받게 된다.
코드를 보면 콜백 함수가 3번 중쳡된다. 그럼 콜백 함수가 나올 때마다 에러도 따로 처리해줘야 하고 코드도 복잡해진다.
그래서 findOne()함수와 save() 함수가 내부적으로 프로미스가 구현돼있다고 가정하에 위 코드처럼 간단하게 만들 수 있다.
1.8 async/await
async/await 문법으로 인하여 프로미스를 사용한 코드를 한 번 더 깔끔하게 줄일 수 있다.
위의 프로미스 코드를 async/await로 줄였다. async function는 해당 프로미스가 resolve 될 때까지 기다린 뒤 다음 로직으로 넘어간다. 그래서 await Users.findOne({})이 resolve가 되면 user 변수를 초기화한다. 그런데 해당 코드는 에러를 처리하는 부분이 없어서 try/catch문을 추가해야 한다.
다음 장에서는 노드 기능을 알아보자.