나는 비전공자이다보니 CS에 굉장히 약하다. 한 문제씩 여러 블로그, 책, 유튜브 영상을 통해 이해를 위한 공부를 하려고 하고 있다.
🙇♂️개인공부 목적을 위한 CS공부입니다. 실제 면접에서는 단순 암기식이 아닌 꼬리질문이 이어지니 본 포스팅은 단순 기초용으로만 참고 부탁드립니다
시간 복잡도와 공간 복잡도는 알고리즘 성능 평가시 사용되는 개념입니다. 위 복잡도가 낮을수록 좋은 알고리즘 입니다. 시간 복잡도는 특정 알고리즘이 어떤 문제를 해결하는데 걸리는 시간을 의미합니다. 공간 복잡도는 작성한 프로그램이 얼마나 많은 공간(메모리)를 차지하느냐를 분석하는 방법입니다. 하지만 예전에 비해 컴퓨터 성능의 발달로 메모리 공간이 넘쳐나다 보니 중요도는 떨어졌습니다. 시간 복잡도와 공간 복잡도는 반비례적인 성향이 있습니다.
스택과 큐는 자료구조에 대한 개념입니다. 스택은 차곡차곡 쌓아올린 형태의 자료구조를 뜻하는데, 같은 구조의 자료를 정해진 방향으로만 쌓을 수 있으며 top으로 정한 곳에서만 접근이 가능합니다. 따라서 나중에 들어온 것이 맨 먼저 나가게 되는 후입선출(LIFO, Last-In-First-Out) 구조를 띄게 됩니다. 사용예시는 웹브라우저의 뒤로가기를 들 수 있습니다. 큐는 스택과는 반대로 한쪽에서는 삭제연산을, 한쪽에서는 삽입연산만을 담당하여 먼저 들어온 것이 먼저 나가게 되는 선입선출(FIFO, First in first out) 방식의 구조를 가집니다. 삭제연산만 이루어지는 곳을 프론트라고 하며 여기서의 작업을 디큐라고 칭하며, 삽입연산이 이루어지는 곳은 리어라고 하며, 여기서의 작업을 인큐라고 칭합니다. 큐는 주로 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용합니다.스택은 브라우저 앞으로 가기, 뒤로가기와 같이 후입선출 구조인 자료구조이고 큐는 음식점 줄과 같이 선입선출 구조인 자료구조입니다. 둘 다 array나 linked list로 표현할 수 있습니다.
Array은 입력된 데이터들이 메모리 공간에서 연속적으로 저장되어 index를 통한 접근이 가능한 자료 구조입니다. Array의 장점은 인덱스를 통한 빠른 접근이며 단점으로는 삽입과 삭제가 느리며, 배열 중간 데이터 삭제시 공간 낭비가 발생합니다. 데이터의 접근을 주로 한다면 Array의 사용이 편리합니다.(알고리즘 문제같은 메모리 공간 파악이 가능한 N의 크기가 제시되기때문에 Array 사용이 효율적) Linked List는 여러 개의 노드들이 순차적으로 연결된 구조이며 첫번째 노드는 head, 마지막 노드는 tail이라 하며, 데이터와 다음 노드를 가리키는 포인터로 구성되어 있습니다. 특징으로는 메모리를 연속사용하지 않으며, 순차적으로 접근해야 하는 점이 차이점있습니다. Linked List의 장점은 삽입과 삭제가 쉽고 단점으로는 임의 접근 불가하며 처음부터 탐색을 진행해야 합니다. 데이터 수정이 잦다면 Linked List를 사용이 효율적입니다.
CORS (Cross Origin Resource Sharing) 란 가져오는 리소스들이 안전한지 검사하는 브라우저의 방화벽이라고 생각합니다. Cross-Origin Resource Sharing" 문장을 직역하면 "교차 출처 리소스 공유 정책"이라고 해석할 수 있는데, 여기서 교차 출처라고 하는 것은 (엇갈린) 다른 출처를 의미하는 것으로 보면 됩니다. 여기서 Origin이란 Protolcol 과 Host 그리고 Port 까지 모두 합친 URL을 의미합니다. Access-Control-Allow-Origin 응답 헤더 세팅 서버측 응답에서 접근 권한을 주는 헤더를 추가하여 해결할 수 있습니다. 또한 cors 모듈 사용하여 아무 옵션없이 설정하면 모든 cross-origin 요청에 대해 응답이므로, 특정 도메인이나 특정 요청에만 응답하게 옵션을 설정할 수 있다. 특정 도메인 접근 허용 및 특정 요청 접근 허용등이 있다.
유저의 패스워드를 받은 클라이언트는 평문으로 서버로 전송합니다. 평문을 받은 서버는 패스워드를 단방향 해시 함수로 암호화하여 보관합니다. 단방향 해시함수는 수학적 연산에 의해 원본 데이터를 완전히 다른 암호화된 데이터(다이제스트)로 변환하는 것을 말합니다. 원본 데이터로는 다이제스트를 구할 수 있지만 다이제스트로는 원본데이터를 구할 수 없어야 합니다. 이것을 단방향이라 합니다. 단방향 해시함수는 브루트포스 공격으로 쉽게 당할 수 있기 때문에 이를 보완하기 위해 입력된 다이제스트를 N번 반복해서 생성하는 것인 key stretching과 원문 패스워드에 임의의 문자열을 추가하여 해싱하는 것인 salting을 이용해 보안의 강도를 높힐 수 있습니다.
저희가 이번 프로젝트에서 사용한 가입/로그인 방법은 프론트에서 유저의 정보를 입력받아 서버로 전송하면 서버에서 ID와 비밀번호를 검증 후 엑세스 토큰과 리프레쉬 토큰을 발급해 유저에게 돌려줍니다 이때 프론트에서는 쿠키에 토큰을 저장하여 로
var는 재선언, 재할당 모두 가능하고, 함수 스코프로 함수내에서 모든 변수에 접근이 가능합니다. 변수가 선언되기 전에 코드에서 참조될 수 있습니다. 반면에 let, const는 블록 스코프로 블록 외부에서 접근이 불가능하며 초기화가 되기 전에는 코드를 참조할 수 없습니다. 또한 let은 재선언은 불가능하지만, 재할당이 가능하고, const는 재선언, 재할당 모두 불가능합니다. 요즘에는 var 대신에 let과 const를 주로 사용합니다. 왜냐하면 var의 경우에는 중복된 이름을 선언했을 경우에 오류사항이 나지 않으므로, 배포시에 위험성이 있기 때문입니다.
프로미스는 자바스크립트 비동기 처리에 사용되는 객체입니다. 여기서 자바스크립트의 비동기 처리란 ‘특정 코드의 실행이 완료될 때까지 기다리지 않고 다음 코드를 먼저 수행하는 자바스크립트의 특성’을 의미합니다.
호이스팅이란 코드가 실행하기 전 변수선언/함수선언이 해당 스코프의 최상단으로 끌어올려진것 같은 현상을 말합니다. 호이스팅이 발생하는 이유는 자바스크립트 엔진은 코드를 실행하기전 실행컨텍스트가 생성되는데 이 실행컨텍스트는 코드를 원활하게 실행될 수 있도록 환경을 만들어주는 역할입니다. 실행컨텍스트는 생성단계와 실행단계가 있는데 그중 코드를 읽기 전 생성단계에서 자신의 스코프 내에 선언된 변수와 함수들을 미리 스코프내에 등록시키는 작업이 진행됩니다. 이 원리 때문에 호이스팅이라는 현상이 발생하게 됩니다. var랑 함수와는 다르게 let과 const가 호이스팅된것 같지 않은 이유는 초기화 단계 이전인 선언단계까지만 진행된 상태이므로 선언문을 만나기 전까지 변수를 사용할 수 없기 때문입니다.
async와 await는 자바스크립트의 비동기 처리 패턴 중 최근에 나온 문법입니다. 자바스크립트는 싱글스레드 기반 언어이기 때문에 비동기 처리가 필수적입니다. 비동기 처리는 결과를 예측할 수 없기 때문에 동기식의 처리가 필요합니다. 대표적으로 promise, callback이 있습니다. async와 await는 기존 동기식 처리의 단점을 보완하고 가독성을 높혀주는 코드를 작성할 수 있다. 사용법은 function 앞에 async만 붙여주면 되고 비동기로 처리되는 부분 앞에 await만 붙여주면 됩니다. 그리고 한가지 알아둬야 할 점은 await 뒤에 오는 부분은 반드시 promise를 반환해주어야 하고, async가 붙은 function도 promise를 반환해야 한다는 점 입니다.