반응형

# 자바스크립트_호출 스택(함수의 호출, 자료구조의 스택)

  • 호출 스택 : 자바스크립트가 동기 (순서대로 실행)적으로 어떻게 실행되는지  파악할때 사용. 
function first() {
	second();
    console.log('첫 번째');
}

function second() {
	third();
    console.log('두 번째');
}

function third() {
	console.log('세 번째');
}

first();

=> 실행 순서
세 번째
두 번째
첫 번째

  • 스택이란 밑에서부터 쌓여서, 위에서 부터 꺼내는 것. (예) 프링글스ㅋㅋ)
  • Anonymous은 가상의 전역 컨텍스트(항상 있다고 생각하는게 좋음)
  • 함수 호출 순서대로 쌓이고, 역순으로 실행
  • 함수 실행이 완료되면 스택에서 빠진다.
  • LIFO (Last In, First out) 구조라서 스택이라고 불림.

# 자바스크립트_이벤트 루프

funtion run() {
	console.log('3초 후 실행');
}

console.log('시작');
setTimeout(run, 3000);
console.log('끝');

=> 실행 순서
시작
끝
3초 후 실행
  • 호출 스택만으로는 설명이 안됨, 호출 스택과 이벤트 루프로 설명 가능. (호출 스택 / 백그라운드 / 테스크 큐)
  • setTimeout은 비동기 함수로 백그라운드에 타이머(run, 3초) 보냄. (setTimeout의 경우 0초라도 무조건 백그라운드에 가야함)
  • 백그라운드에 있으면 동시에 실행 가능.
  • 백그라운드가 먼저 끝난다고 하더라도 호출 스택이 먼저 처리된다.
  • 이벤트 루프 : 호출 스택이 비어있는 경우, 테스크 큐에서 함수들 하나하나를 끌어와서 실행 해준다. (이때 백그라운드는 비워져야 한다.)
  • Promise then / catch / process.nextTick의 경우 테스크 큐에서 setTimeout 등 보다 먼저 실행(새치기) 됨

# const, let

  • ES2015 이전에는 var로 변수를 선언.
  • ES2015부터는 const와 let이 대체
  • 가장 큰 차이점 : 블록 스코프(var은 함수 스코프)
  • 블록 스코프(중괄호, { } )
if (true) {
	var x = 3;
}
console.log(x);	// 3 
=> var의 경우 블록 스코프를 무시, 블록 바깥에서도 var에 접근 가능
=> var도 function 안에 있을 경우에는 바깥에서 접근 불가(= 함수 스코프)


if (true) {
	const y = 3;
}
console.log(y);	// Uncaught ReferenceError: y is not defined
=> 블록 스코프를 존중. 블록 바깥에서 const 접근 불가
  • const에는 대입 연산자(=)을 한 번만 사용 가능. (가능하면 const 사용, 값 바꿀일 있으면 그때 let 사용)
const a = 3;
a = '5';	// 에러


const b = {name : 'zerocho'};
b.name = 'nerocho';




let c = 5;
c = 3;
c = 10;		// 가능. 하지만, 생각보다 let 쓸일 많지 않음(값 바꿀일 있는경우 사용)

# 템플릿 문자열, 객체 리터럴 (편의사항)

기존 문법
var won = 1000;
var result = '이 과자는 ' + won + '원입니다.';
/ 이 과자는 1000원입니다. 
=> 공란 넣어줘야 띄어쓰기 가능.

최신 문법
const result = `이 과자는 ${won}원입니다.`;
=> 변수를 ${}로 해줘서 띄어쓰기 가능하도록 해줌.(` ` 는 ~표에 있는것)
이를 템플릿 문자열, 백틱 문자열 이라고함.(편의사항)
  • 태그드 템플릿 리터럴 : 백틱( ` )이용한 함수 호출
function a() {}

기존 문법
a();

최신 문법
a``;	// 백틱(`) 사용하여 함수 호출 가능.
반응형
반응형

# Node.js 학습_노드 설치 / VS Code 설치

## 노트 설치

  • 아래 홈페이지에서 원하는 버전 설치 (LTS 붙은게 안정적인 버전(정신건강에 좋음), Current 붙은건 최신 버전(신기술 습득))
  • https://nodejs.org/
 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

  • 노드 설치 시 Automatically install... 반드시 체크 후 설치

리눅스(우분투 18 LTS 기준)의 경우 아래 명령어 이용하여 노드 설치.
$ sudo apt-get update
$ sudo apt-get install -y build-essential
$ sudo apt-get install curl
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash --
$ sudo apt-get install -y nodejs

## VS Code 설치

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

  • VS Code 설치 후 File > Add Folder to Workspace 클릭하여 코딩하고싶은 폴더 추가해주기. (가능하면 윈도우 계정명, 폴더명 등을 영문으로 해주는게 좋음 => 이럴경우 프로그래밍 시 고통받을 확률 업업..)

## 설치 후 확인

  • cmd 실행하여 아래 명령어로 확인
node -v

npm -v

맥/리눅스의 경우 명령어 앞에 sudo 입력
반응형
반응형

# Node.js

  • Node.js 학습을 위해 자바스크립트의 기본문법 이해 필요.

## 노드의 정의

  • 공식 홈페이지 기준 : 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임. (런타임이란 실행기를 의미. 노드는 자바스크립트를 실행하는 실행기를 의미.)
  • 서버의 역할도 수행할 수 있는 자바스크립트 런타임
  • 노드로 자바스크립트로 작성된 서버를 실행할 수 있다.
  • 서버 실행을 위해 필요한 http / https / http2 모듈을 제공한다. (그렇다고 해서 노드가 서버인건 아니다.)

## 런타임

  • 노드 : 자바스크립트 런타임
  • 런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있게 해주는 가상 머신의 상태(크롬의 V8 엔진 사용)
  • 노드는 자바스크립트로 만든 프로그램들을 실행할 수 있게 해준다. 
  • 다른 런타임으로는 웹 브라우저(크롬, 사파리 등)이 존재.
  • 노드 이전에 자바스크립트 런타임을 만들기 위한 많은 시도가 있었지만, 엔진 속도 문제로 실패하였다.
  • 자바스크립트 학습 참고 사이트 : https://ko.javascript.info/
 

모던 JavaScript 튜토리얼

 

ko.javascript.info

## 노드의 내부구조

  • 노드는 V8과 libuv를 내부적으로 포함하고 있다. 
  • V8엔진의 경우 오픈소스 자바스크립트 엔진으로 속도 문제 개선.
  • libuv : 노드의 특성인 이벤트 기반, 논블로킹, I/O 모델을 구현한 라이브러리 ( 노드의 장점 : 싱글 스레드 + 비 동기 모델 )

## 이벤트 기반

  • 이벤트 기반 : 이벤트(클릭, 네트워크 요청, 타이머 등)가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미.
  • 이벤트 리스너 : 이벤트를 등록하는 함수를 의미.
  • 콜백 함수 : 이벤트가 발생했을 때 실행될 함수를 의미.

## 논 블로킹 I/O

  • 오래 걸리는 함수를 백그라운드로 보내 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행하는 것을 의미.
  • 논 블로킹 방식하에 일부 코드는 백그라운드에서 병렬로 실행 (일부 코드 : I/O 작업(파일 시스템 접근, 네트워크 요청), 압축, 암호화 등)
  • 나머지 코드는 블로킹 방식으로 실행되고, I/O 작업이 많을 때 노드의 활용성이 극대화 된다.
블로킹 : 동기 / 코드가 순서대로 실행

논 블로킹 : 비 동기 / 코드가 순서대로 실행되지 않을 수도 있음

## 프로세스와 스레드

  • 프로세스 : 운영체제에서 할당하는 작업의 단위 (프로세스 간 자원 공유 X)
  • 스레드 : 프로세스 내에서 실행되는 작업의 단위 (부모 프로세스 자원 공유)
  • 노드 프로세스 : 멀티 스레드이지만 직접 다룰 수 있는 스레드는 하나 (싱글 스레드)
  • 노드는 주로 멀티 스레드 대신, 멀티 프로세스 활용
  • 노드 14버전부터 멀티 스레드 사용 가능해짐. (멀티 스레드 시 : 동시에 여러 작업이 가능해짐)
  • 노드의 주력은 싱글 스레드임. (싱글 스레드를 효율적으로 관리하는게 노드의 핵심)

## 서버로서의 노드

  • 서버 : 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 or 프로그램
  • 클라이언트 : 서버에 요청을 보내는 주체를 의미. (브라우저, 데스크탑 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버 등)
  • 브라우저(클라이언트 / 요청)가 특정 웹사이트(서버 / 응답)에 접속
  • 노드 != 서버, 그러나 노드는 서버를 구성할 수 있게 하는 모듈을 제공한다.
  • 노드 서버 장점 : 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용 / I/O 작업이 많은 서버로 적합, 멀티 스레드 방식보다 쉬움 / 웹 서버 내장 / 자바스크립트 사용 (세계적으로 많이 사용하는 언어, 안정적) / JSON 형식과 호환하기 쉬움
  • 노드 서버 단점 : 싱글 스레드라 CPU 코어를 하나만 사용 / CPU 작업이 많은 서버로는 부적합 / 하나뿐인 스레드가 멈추지 않도록 관리해야 함 / 서버 규모가 커졌을 때 서버를 관리하기 어려움 / 어중간한 성능
  • CPU 작업을 위해서 AWS Lambda 또는 Google Cloud Functions 같은 별도의 서비스를 사용. (넷플릭스, 페이팔, 월마트, 우버 등에서 메인 또는 서브 서버로 사용함)
반응형

+ Recent posts