var - 함수 스코프, 재선언/재할당 가능, 호이스팅 시 undefined로 초기화
let - 블록 스코프, 재선언 불가/재할당 가능, TDZ 존재
const - 블록 스코프 재선언/재할당 불가, TDZ 존재
TDZ(Temporal Dead Zone) - 스코프의 시작 지점부터 초기화 시작 지점까지의 구간
TDZ 발생 이유 - var는 선언과 초기화를 동시에 진행 / let,const는 3단계로 진행
비동기 작업의 최종 완료/실패를 나타내는 객체
Promise를 사용하면 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있다
Pending(대기) / Fulfilled(이행) / Rejected(거부) 3가지 상태로 구분
then(a,b) - 이행된 경우의 a, 거부된 경우 b를 반환하는 콜백 함수
Promise.all() - 주어진 모든 프로미스가 이행하거나, 한 프로미스가 거부될 때까지 대기하는 새로운 프로미스를 반환
Promise 체인을 사용하면 콜백 지옥과 같이 가독성이 훼손되고 에러가 발생한 지점을 알기 어렵기때문에 이를 보완하고 좀 더 쉽게 다루기 위한 생긴 문법.
async - async 함수는 항상 Promise를 반환
await - Promise의 상태가 변할 때까지 대기
변수와 함수 선언이 코드의 최상단으로 끌어올려지는 현상
var는 호이스팅 시 undefined로 초기화됨
let/const는 TDZ로 인해 참조 에러 발생
함수 선언문은 전체가 호이스팅 -> 정상 작동
function 키워드 대신 =>를 사용하는 함수 표현식
this 바인딩이 없음 (렉시컬 스코프의 this 사용)
생성자 함수로 사용할 수 없음
arguments 객체를 가지지 않음
Node.js 웹 애플리케이션 프레임워크이며, 미들웨어 기반으로 유연성이 높음
HTTP req/res를 단순화해 빠르게 API 서버를 구축할 수 있음
미들웨어 함수는 req/res 사이클 도중에 목적에 맞게 처리를 하는 함수
대안으로 NestJS 등이 존재
NestJS는 express 기반
깊은 복사 - 모든 객체를 재귀적으로 복사
structuredClone() 사용으로 손쉽게 가능해짐 -> but 함수 등은 유실
JSON.parse(JSON.stringify()) -> 느리고 함수 유실
얕은 복사 - 1단계까지만 복사, 중첩 객체는 참조를 공유
전개 연산자, Object.assign()
온라인 네트워크에서 정보를 안전하게 통신할 때 사용하는 인터넷 표준 토큰
header, payload, signature로 구성 -> stateless
HTTP 요청 헤더로 전달 -> 서버에서 JWT 검증 후 사용자 식별 및 요청 처리
req 헤더에서 추출 -> 시그니처 검증 -> 페이로드 확인
JWT는 Access Token, Refresh Token으로 관리 -> 클라는 AT가 만료되면 RT를 서버에 전달
-> RT 검증 후 새 AT 발급 / AT 유효 기간 짧음, RT 유효 기간 김
nodejs는 Single-threaded지만, 이벤트 루프와 libUV를 통해 효과적으로 비동기 작업을 처리.
비동기 작업은 콜백 큐를 통해 처리.
싱글 스레드이기 때문에 CPU 집약적인 처리는 느리고 주의가 필요
요청이 처리되는 동안 다른 요청도 같이 처리. 논블로킹
작업이 완료될 때까지 무작정 대기하지 않고 콜백이나 Promise로 결과를 처리
nodejs의 핵심 메커니즘으로 비동기 작업을 관리한다.
호출 스택과 콜백 큐 등을 감시하다가 어디가 비어있고 어떤 것을 채워야할지 정하고 이를 수행한다.
nodejs의 비동기 I/O를 지원하는 C 라이브러리
플랫폼 간 호환성 제공
비동기 I/O 작업 처리
스레드풀을 통해 CPU 집약적 작업과 블로킹 작업을 처리
I/O 루프와 스레드풀로 구성
작업이 완료되면 이벤트 루프을 통해 콜백 실행
동기는 작업이 순차적으로 진행되는 것, 비동기는 작업이 병렬로 실행되는 것 -> 결과는 콜백이나 Promise로 처리
블로킹은 호출이 완료될 때까지 대기, 논블로킹은 호출 후 즉시 반환 -> 작업은 백그라운드
비동기는 작업의 실행 방식과 관련, 논블로킹은 호출의 반환 방식과 관련
알고리즘의 성능을 분석할 때 사용되는 표기법
입력 크기(n)에 따른 시간 복잡도와 공간 복잡도를 표현
최악의 경우 실행 시간을 나타냄.
알고리즘의 성능을 입력 크기에 따라 비교하기 쉽도록 수학적으로 표현.
선택 정렬(Selection Sort)
배열에서 가장 작은 값을 선택하여 맨 앞 요소와 교체하는 과정을 반복.
버블 정렬(Bubble Sort)
인접한 두 요소를 비교해 더 큰 값을 뒤로 보내는 작업을 반복.
병합 정렬(Merge Sort)
배열을 반으로 나누고 각각을 정렬한 뒤 병합.
삽입 정렬(Insertion Sort)
현재 요소를 적절한 위치에 삽입하는 방식으로 정렬.
퀵 정렬(Quick Sort)
피벗을 기준으로 작은 값과 큰 값으로 분할하여 재귀적으로 정렬.
힙 정렬(Heap Sort)
최대 힙/최소 힙을 이용해 정렬.
DFS - 깊이 우선 탐색. 한 경로를 끝까지 탐색
BFS - 넓이 우선 탐색. 동일 계층의 노드를 탐색