백엔드 Node.js 멘토링 준비(2)

‍박소연·2023년 10월 4일
post-thumbnail

자바스크립트 문법

화살표 함수

//add1, 2, 3, 4는 전부 같은 함수

function add1(x, y) {
	return x + y;
}

const add2 = (x, y) => {
	return x + y;
};
// 중괄호 뒤에 바로 return이 오는 경우 생략 가능
const add3 = (x, y) => x + y;

const add4 = (x, y) => (x + y);

Promise, async/await

promise

자바스크립트 비동기 처리에 사용되는 객체, 비동기 처리의 단점을 보완하여 동기적으로 처리할수있게 도와준다.

비동기란?

특정 코드의 실행이 완료될때까지 기다리지 않고 다음 코드를 먼저 수행하는 특성을 말함), (요청 후 정상처리 되기도 전에 화면에 빈 데이터를 표시하는 상태)

비동기 작업 예시

브라우저에서는 이른바 ajax라 불리웠던 XMLHttpRequest 객체 를 활용하여 비동기적으로 요청을 보내고 받을 수 있을테고, 최근에는 Fetch API 를 사용하는 방법들이 늘고 있습니다. Node.js 에서는, 예를 들자면, 파일을 다룰 때 쓰는 모든 함수 들이 비동기로 구성되어 있습니다. 파일을 읽으려먼 우리의 하드디스크나 SSD를 동작시켜야 하는데 이 때 CPU 입장에서는 SSD가 너무 느려터져서 속이 답답할 지경일 겁니다. 한 번에 여러 개의 파일을 읽을 수 있다면 좋겠지요?

비동기 작업의 단점

  1. 흐름을 예측하기 어렵다.
    ex) 임의로 일을 시킬때 작업을 동시에 시작할 수 있으므로 상당한 효율을 달성했습니다! 그렇습니다. 우리는 동시에 시작하기만 할 수 있지, 어떤 작업이 언제 끝나리라는 건 알 수 없습니다.
  2. 콜백 지옥
    ex) 비동기 작업은 그 특성상 각각의 비동기 작업이 "끝"났을 때 뒤에 이어질 작업을 미리 부여하는 식으로 흐름을 제어합니다. 만약 비동기 작업이 차례대로 주루룩 이어져있다면, 이는 우리가 자바스크립트를 배울 때 한번 쯤 들어봤던, 콜백 지옥 을 뜻합니다. 콜백 지옥이라는 상황이 벌어지는 이유는, 비동기 작업을 관리한다는 개념 자체가 없어서 코드가 지저분해질 수 밖에 없기 때문입니다.

promise가 필요한 이유?

비동기 작업의 특징은 작업이 언제 끝날지 모르기 때문에 일단 배를 떠나보낸다고 이야기했습니다. 그럼 그 이후에 이 작업이 성공하거나 실패하는 순간에 우리가 또 뒷처리를 해줘야겠죠? Promise 가 끝나고 난 다음의 동작을 우리가 설정해줄 수 있는데, 그것이 바로 then 메소드와 catch 메소드입니다. 서버에서는 받아온 데이터를 처리하기 위해, fetch등으로 서버에서 데이터를 요청하고 받아온 뒤 처리하기 위하여 Promise가 필요하다.

promise의 장점

promise는 .then() .catch()등 promiseAPI를 사용할수있어 코드의 양을 줄이고 가독성을 증가시킬수있다.

promise의 3가지 상태

  • pending : 대기 - 비동기 처리 로직이 아직 완료되지 않은 상태
  • fulfilled : 이행 - 비동기 처리가 완료되어 프로미스가 결과 값을 반환해준 상태
  • rejected : 실패 - 비동기 처리가 실패하거나 오류가 발생한 상태

async/ await

async

프로미스 함수의 일종으로, 함수를 선언할 때 붙여서 비동기 작업을 만드는 키워드이다.

await

Promise 가 끝날 때까지 기다리게 한다. async 함수 내부에서만 사용할 수 있다.

async/await의 필요성
프로미스 코드를 축약할 수 있다.

function findAndSaveUser(Users){
	Users.findOne({})
		.then((user) => {
			user.name = 'zero';
			return user.save();
		})
		.then((user) => {
			return Users.findOne({gender:'m'});
		})
}
async function findAndSaveUser(Users) {
	let user = await Users.findOne({});
	user.name = 'zero';
	user = await user.save();
	user = await Users.findOne({ gender:'m' });
}

노드 내장 모듈 알아보기

url, dns, searchParams

url에 대한 기본적인 설명 추가해주면 좋을듯

쿼리스트링

GET을 통한 요청은 URL 주소 끝에 파라미터로 포함되어 전송되며, 이 부분을 쿼리 스트링 (query string) 이라고 부른다.

문제) {A:'B', C:'D', E:'F'} 를 쿼리스트링 표현으로 바꾸면 ?A=B&C=D&E=F

문제) ?A=B&A=D&E=F 를 쿼리스트링 표현으로 바꾸면 {A:'[B','D'], E:'F'}


crypto와 util

단방향 암호화

1) Hash

해시함수는 임의 길이의 입력값을 받아 고정된 길이의 출력값(해시)으로 매핑하는 함수

취약점

  • Rainbow Table Attack : 미리 해쉬값들을 계산해 놓은 테이블을 통해 역산한다.
  • 처리속도가 최대한 빠르도록 설계된 해시함수의 속성 때문에 공격자는 매우 빠른 속도로 임의 문자열의 다이제스트와 해킹할 다이제스트를 비교할 수 있다.(패스워드를 알아내는데 긴 시간이 걸리지 않는다.)

양방향 암호화

프론트-서버 개발에서 거의 사용하지 않음...그 이유 자세하게 말해주기


이벤트 이해하기

스레드풀과 커스텀 이벤트

Thread Pool 용도
CPU 또는 I/O intensive 한 작업에 내부적으로 쓰인다.
(개발자가 직접 컨트롤하지 않아도)

nodejs eventloop 에서 처리하기에 무거운 작업이 자동으로 thread pool 내의 thread 에 위임된다.
ex) 'crypto' 모듈의 해시함수 연산, 기타 'fs' 모듈 파일 관련 작업


에러 처리하기

예외(Exception): 처리하지 못한 에러
노드 프로세스/스레드를 멈춤
노드는 기본적으로 싱글 스레드라 스레드가 멈춘다는 것은 프로세스가 멈추는 것
에러 처리는 필수


HTTP 서버 만들기

서버- 클라이언트 질문 복습

질문) 백엔드는 그럼 response를 해주는지 request를 해주는지

포트: 서버 내에서 프로세스를 구분하는 번호

서버를 실행하는 순간 프로세스를 올려주고, 프로세스는 포트 하나를 잡아먹는다.

0개의 댓글