01.08.일(Node.js)

유희선·2023년 1월 8일
0

TIL

목록 보기
17/29
post-thumbnail

1. 특징
1) Non-blocking (논 블로킹) IO

-함수가 실행되는 중에도 다른 작업을 동시에 진행할 수 있다는 장점
2) Single Thread (싱글 스레드)
-스레드 하나를 사용, 동시에 하나의 작업만 처리할 수 있음
-1개의 프로그램에서 여러개의 스레드를 사용한다면,
연산할 수 있는 시간을 단축할 수 있음

*스레드
프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위

3) 이벤트 루프
-싱글 스레드가 가지고 있는 약점을 극복하기 위해 생김
-나중에 별도로 깊게 공부하기


2. 동기(Sync) & 비동기(Async)
1) 동기
-먼저 실행된 코드의 결과가 나올 때까지 대기
2) 비동기
-실행된 순서와 관계없이 결과가 나오는 것
3) 비동기 함수 특징
(1) 비동기 함수의 결과 값은 항상 Promise 객체로 resolve
(2) 비동기 함수 안에서만 await 연산자 사용 가능
<해당 코드>

// 비동기 + 일반 함수
async function 함수이름() {
	// 명령문
}

// 비동기 + 익명 함수
async function() {
  // 명령문
}

// 비동기 + 화살표 함수
async () => {
	// 명령문
}

+await 연산자
-Promise가 fulfill 상태가 되거나 rejected될 때 까지
함수의 실행을 중단하고 기다릴 수 있음
<해당 코드>

async function 함수이름() {
	const result = await 'Test!';
	console.log(result);
}

함수이름();
// Print: 'Test!';

3. Blocking Model & Non-Blocking Model
1) Blocking Model
-코드의 실행이 끝나기 전까지
실행 제어권을 다른 곳에 넘기지 않아 다른 작업을 하지 못하고 대기하는 것
=비동기 처리 불가능
2) Non- blocking Model
-코드의 실행이 끝나지 않아도
실행 제어권을 다른 곳에 넘겨 다음 코드가 실행됭 수 있는 것
=비동기 처리 가능

*JS는
Async + Non-blocking Model 채용하여,
현재 실행중인 코드의 실행이 끝나지 않아도 다음 코드 호출


4. Promise
1) 개념
-비동기 처리를 동기로 처리할 수 있도록 돕는 객체 유형

new Promise(executor)
new Promise((resolve, reject) => { //명령문 })

2) 진행 코드
(1) 기본

① 에러가 발생하지 않은 경우
-executor 실행 > resolve 함수 호출 > Promise.then 실행
② 에러가 발생한 경우
-executor 실행 > resolve 함수 호출 > Promise.catch 실행
(2) resolve 설명

const firstPromise = new Promise((resolve, reject) => {
  resolve('First');
});

firstPromise.then((value) => {
	console.log(value);
});

// Print: 'First'

5. Constructor (생성자)
-원시 타입(String, Boolean 등)을
제외한 대부분의 타입들이 객체(Object)로 구성
<해당 코드>

function printFunc(data){
  console.log(data);
}

// 생성자 함수
const obj = new Object();
const promise = new Promise(printFunc);

obj
// Print : {}

6. 객체 리터럴 (Object Literal)
-객체를 생성하기 위한 표기법
1) 객체 리터럴은 {} 내에 0개 이상의 프로퍼티를 정의해서 선언

let objectLiteral = {
    key: 'Value',
    helloWorld: function () {
        return "Hello world";
    }
};

*Property (프로퍼티)
-객체의 상태를 나타내는 값
-key와 value

*method (메서드)
-프로퍼티를 참조하고 조작할 수 있는 동작
-객체의 프로퍼티 값이 함수로 구성되어 있을 경우

let objectLiteral = {
    key: 'Value', // 프로퍼티
    helloWorld: function () { // 메서드
        return "Hello world";
    }
};
console.log(objectLiteral.helloWorld()); // Hello world

7. Error handling
-에러를 관리하는 방법, 예상치 못한 상황에 대처하는 방식
-구분 ) 예상할 수 있는 에러, 예상치 못한 에러
(1) try / catch 문
-서버에서 에러가 발생하지 않도록 사용
-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

console.error(Error: ${err.message});
에러가 발생할 때 확인할 수 있는 코드

(2) 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: 잔고가 부족합니다.

(3) finally
-try에서 HTTP 연결이 되고 있거나
파일과 같은 특정한 자원을 가지고 처리할 때,
'자원'을 계속 가지고 있을 경우
무의미한 메모리를 차지하게 되서 일정 시점에 해당 자원 삭제
-에러 발생 여부와 상관없음
<해당 코드>

function errorException(isThrow) {
  try {
    console.log('자원을 할당하였습니다.');
    if (isThrow) throw new Error();
  } catch (error) {0
    console.log('에러가 발생했습니다.');
  } finally {
    console.log('자원을 제거하였습니다.');
  }
}

errorException(false);
// 자원을 할당하였습니다.
// 자원을 제거하였습니다.
errorException(true);
// 자원을 할당하였습니다.
// 에러가 발생했습니다.
// 자원을 제거하였습니다.

8. Class (클래스)
-현실과 비슷한 개념(객체)을 나타내기 위한 도구

+Instance (인스턴스)
-동일한 클래스를 이용해 생성한 객체

1) Constructor (생성자)

👉 “클래스 내부에서 constructor()로 정의한 메서드를
"생성자"라고 부릅니다.

미리 정의한 클래스를 기반으로 인스턴스를 생성할 때
Javascript 내부에서 호출되는 메서드인데요.

class User {
  constructor(name, age, tech) { // User 클래스의 생성자
    this.name = name;
    this.age = age;
    this.tech = tech;
  }
}

const user = new User("이용우", "28", "Node.js"); // user 인스턴스 생성
console.log(user.name); // 이용우
console.log(user.age); // 28
console.log(user.tech); // Node.js

2) Method (메서드)
자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값으로 사용 가능
👉프로퍼티 값이 함수일 경우에는 일반 함수와 구분하기 위해 사용

즉, 메서드는 객체(Object) 에 묶여 있는 함수

클래스에서도
데이터를 나타내는 속성뿐만아니라 함수와 같이 특정 코드를 실행할 수 있는 문법 사용 가능
여기서는 Class라는 객체(Object)에 묶여있는 함수를 메서드(Method)라고 부릅니다.

class User {
  constructor(name, age, tech) { // User 클래스의 생성자
    this.name = name;
    this.age = age;
    this.tech = tech;
  }

  getName() { return this.name; } // getName 메서드
  getAge() { return this.age; }.  // getAge 메서드
  getTech() { return this.tech; } // getTech 메서드
}

const user = new User("이용우", "28", "Node.js"); // user 인스턴스 생성
console.log(user.getName()); // 이용우
console.log(user.getAge()); // 28
console.log(user.getTech()); // Node.js

3) 상속
-일반적으로 클래스와 인스턴스는 선언한 클래스의 기능을 모두 상속함
-상속을 이용해 부모 클래스와 자식 클래스로 나눌 수 있음
-부모 클래스의 경우 메서드,
내부 변수와 같은 정보를 자식 클래스에게 할당 가능


9. devDependencies
1) 개념
-개발 단계에서만 필요한 모듈들을 설치할 경우 이곳에 포함됨
npm install -D (모듈이름)

2) 추가설명
(1) dependencies
-실제로 배포가 되고 프로젝트를 실행하기 위해서 필요로 한 것들
npm install
(2) devDependencies
-개발 단계에서만 필요로 한 것


10. 주의할 점
1) git에 배포할 시, 올리면 안 되는 아이
package.json
node_modules
_.gitignore에 추가하면 됨'
2) package.json만 있으면 환경에 맞는 모듈 설치 가능

0개의 댓글