1. 시간복잡도와 공간복잡도가 무엇인지 설명해주실 수 있을까요?
특정 크기의 데이터가 입력 되었을 때 어떤 문제를 해결하는데 걸리는 알고리즘의 수행 시간이 시간 복잡도, 해당 알고리즘이 수행하는 동안의 메모리 사용량이 공간 복잡도를 의미합니다. 이러한 복잡도라는 척도를 통해 특정 알고리즘의 성능을 평가할 수 있는데 과거 메모리 공간이 부족하던 때와 달리 컴퓨터 성능의 발달로 공간 복잡도 보다는 시간 복잡도를 중심으로 프로그래밍을 작성한다고 알고 있습니다. 시간복잡도에서는 점근 표기법을 사용하는데 종류에는 빅오(Big-O) 표기법, 빅오메가(Big-Ω) 표기법이 있습니다. 빅오 표기법은 최악의 성능이 나올 때 어느 정도의 연산량이 걸릴것인지, 빅오메가 표기법은 최선의 성능이 나올 때 어느 정도의 연산량이 걸릴 것인지에 대해 표기합니다.
2. 스택, 큐에 대해 설명해주실 수 있을까요?
스택은 가장 마지막에 지정된 데이터가 가장 먼저 삭제되는 후입선출의 구조입니다. 사용되는 예로는 브라우저의 뒤로가기, 실행 취소 가 있으며 스택의 자료 구조는 삽입과 삭제시에 O(1), 탐색에는 O(n)의 시간복잡도를 가지게 됩니다. 큐는 스택과는 달리 한쪽에서 데이터 삽입, 다른 한쪽에서는 데이터의 삭제만 가능한 선입선출의 구조를 가지고 있습니다. 사용되는 예로는 BFS 알고리즘, 프린터의 대기열이 있습니다. 큐에는 우선순위 큐, 원형 큐라는 2개의 종류가 더 있기 때문에 지금 설명하는 큐는 선형 큐(Linear Queue)라고도 부릅니다. 큐는 스택과 마찬가지로 삽입과 삭제에는 O(1), 탐색에는 O(n)의 시간복잡도를 가집니다.
3. 배열, 링크드리스트를 비교하여 설명해주실 수 있을까요?
배열은 정적 자료구조입니다. 배열을 만들기 위해서는 미리 크기를 정해 놓아서 해당 크기만큼의 연속된 메모리 주소를 할당 받게 됩니다. 연속된 메모리 주소를 할당 받고 있기 때문에 인덱스라는 것을 갖게 됩니다. 인덱스를 갖게된다는 것은 임의 접근이 가능하다는 장점이 있으므로 접근과 탐색이 용이합니다. 하지만, 크기를 미리 정해 놓았기 때문에 수정하는 것이 불가능하며 해당 배열 크기이상의 데이터를 저장할 수 없다는 단점이 있습니다.
링크드리스트는 동적 자료구조입니다. 배열과 다르게 크기를 정할 필요가 없으며 크기의 제한이 없으므로 데이터 추가, 삭제가 자유롭다는 장점이 있습니다. 연속된 메모리 주소를 할당 받지 않기때문에 임의로 접근하는 것이 불가능합니다. 데이터를 탐색할때 순차적으로 접근해야하는 것 입니다. 그대신 노드라는게 존재하며 노드안에 데이터가 있고 다음 데이터를 가리키는 주소를 가지고 있습니다.
4. 트랜잭션이란 무엇이고 원자성, 일관성, 고립성, 지속성이란 무엇인지 설명해주실 수 있을까요?
트랜잭션(transaction)은 데이터베이스에서 수행되는 여러개의 작업을 일관되게 처리하기 위한 기능입니다. 예를들어, 은행에서 입금과 출금을 할 때 일관적으로 처리되어야 하는데 입금은 성공하고 출금은 실패했을 때 입금도 실패하여야 합니다. 이러한 작업을 트랜잭션으로 관리할 수 있습니다. 원자성(atomicity)은 트랜잭션이 수행될 때 이를 여러개의 작업으로 나눌 수 없게 하는 기능입니다. 일관성(consistenty)은 트랜잭션이 시작하기 전과 종료 후에도 데이터베이스가 일관된 상태를 유지한다는 의미입니다. 고립성(isolation)은 트랜잭션이 수행중일 때 다른 트랜잭션이 이 트랜잭션에 영향을 주지 않도록 하는 기능입니다. 이를 위해 데이터베이스 시스템에서는 각 트랜잭션을 수행할 때 잠금(lock)을 걸어 접근을 제한할 수 있습니다. 지속성(duability)은 트랜잭션이 성공적으로 완료된 경우, 이 결과가 영구적으로 반영된다는 의미입니다.
5. 정규화란 무엇이고 대표적인 장점과 단점은 무엇이 있을까요?
데이터베이스 설계에서 데이터 중복을 줄이기 위해 데이터베이스를 구상하고 구조화하는 프로세스 입니다. 정규화를 통해 데이터 중복을 최소화하고 데이터의 일관성이 유지되어 데이터베이스의 정확성이 향상됩니다. 데이터의 이상현상(Anomalies)를 방지할 수 있습니다. 단점은 Join연산의 증가로 응답 시간이 저하될 수 있습니다. 따라서 서비스에 따라 정규화 또는 반정규화(De-normalization) 과정의 적절한 수행이 필요합니다.
6. CORS란 무엇이고 어떻게 허용할 수 있나요?
CORS는 추가 HTTP 헤더를 사용하여, 한 출처에서 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제입니다. 보안 상의 이유로 브라우저는 스크립트에서 시작한 교차 출처 HTTP 요청을 제한합니다. 예를 들어, AJAX, Fetch API는 동일 출처 정책을 따르는데, 자신의 출처와 동일한 리소스만 불러올 수 있으며, 다른 출처의 리소스를 불러오려면 그 출처에서 올바른 CORS 헤더를 포함한 응답을 반환해야 합니다. CORS 의 허용방법은 크게 두가지입니다. 하나는 직접 헤더를 명시해서 출처(origin)을 필터링하는 것이고, 다른 하나는 CORS 노드 패키지(미들웨어)를 사용해 좀더 간편하면서 유기적으로 출처를 필터링 할 수 있습니다.
7. var, let, const 에 대해 설명해주실 수 있을까요?
var는 재 할당과 재 선언이 가능하고 let은 재 할당이 가능하지만 재 선언은 불가합니다. const는 재 할당, 재 선언 모두 불가 합니다.
var로 선언한 변수는 재할당 및 재선언이 모두 가능합니다. 또한 함수 스코프를 가지고 있어 선언 전에 변수를 사용하더라도 에러가 발생하지 않습니다. 변수를 유연하게 사용할 수 있다는 장점이 될 수 있지만, 코드량이 많아질 경우 변수의 존재를 잊고 재할당하는 등의 실수나, 어느 부분에서 문제가 발생했는지 파악하기 힘들 수 있습니다. 이러한 단점을 보완해서 나온 것이 let과 const입니다. let과 const 는 블록 스코프를 가집니다. let은 중복 선언은 불가능하지만 값을 재할당하는 것은 가능합니다. const는 중복 선언과 값의 재할당 모두 불가능 합니다. 그래서 주로 const는 상수를 선언하는 키워드로 사용됩니다.
8. Promise란 무엇인지 설명해주실 수 있을까요?
콜백 함수를 보완하며 비동기 처리에 사용되는 객체를 Promise라 합니다. Promise를 사용하면 비동기 작업을 조금 더 구조적으로 처리할 수 있으며 콜백 지옥과 같은 콜백 패턴의 복잡성을 줄일 수 있습니다. Promise는 ES6(ECMAScript 2015)에서 표준으로 도입되었으며, 비동기 코드를 보다 가독성 있고 관리하기 쉬운 방식으로 다룰 수 있도록 도와줍니다. 이후 ES8부터는 async/await 구문을 통해 Promise를 더 편리하게 사용할 수 있게 되었습니다. Promise 객체는 대기(Pending), 이행(Fulfilled), 거부(Rejected) 중 하나의 상태를 갖습니다.
9. Hoisting이란 무엇인지 설명해주실 수 있을까요?
JavaScript에서 변수나 함수 선언이 해당 스코프의 최상단으로 끌어올려지는 현상입니다. 변수 선언의 경우 var 키워드로 선언한 경우 호이스팅이 발생하며 초기값은 호이스팅 되지 않아 접근 시 undefined가 출력된다. 함수 선언의 경우 함수 전체가 호이스팅되며, 함수 선언 전에 호출이 가능합니다. 호이스팅은 개발자가 의도하지 않은 결과를 초래할 수 있기 때문에 변수나 함수를 선언할 때 최상단에서 선언하거나 let, const 키워드를 사용하는 블록 단위 스코프를 사용할 수 있습니다.
10. async/await 이란 무엇인지 설명해주실 수 있을까요?
JavaScript에서 비동기 처리를 위해 사용되는 문법 중 하나로 async 함수 내부에서 await 키워드를 통해 Promise를 처리할 수 있습니다. async 함수는 내부에서 Promise 객체를 반환하며 이 promise 객체는 함수가 실행되면서 처리된 결과 값을 가지고 있습니다. async 함수 내부에서 await 키워드를 사용하면 해당 Promise 객체가 완료될 때까지 기다리다 결과 값을 받아올 수 있습니다.
11. Arrow Function 이란 무엇인지 설명해주실 수 있을까요?
화살표 함수는 function 키워드 대신 화살표를 사용하여 보다 간결한 방식으로 함수를 선언할 수 있습니다. 모든 경우 화살표 함수로 선언할 수 있는 것은 아니고 함수 표현식으로 익명 함수만 선언 가능합니다. 일반 함수와 화살표 함수의 가장 큰 차이점의 this 입니다. 일반 함수 this는 window 객체를 가리키지만 화살표 함수 this는 언제나 상위 스코프의 this를 가리킵니다. 이것을 Lexical this라고 하는데 이러한 특성 덕분에 화살표 함수는 콜백 함수로 사용하기 용이합니다. 그리고 Arguments 객체, methods를 사용할 수 없고, 생성자로 사용할 수 없습니다.
12. ‘==’와 ‘===’ 연산자의 차이는 무엇인지 설명해주실 수 있을까요?
"==" 는 동등 연산자 입니다. 두 값이 같은지 비교하기 전에 타입을 자동으로 변환합니다. 따라서 다른 타입의 값을 비교할때도 사용합니다.
"==="는 일치 연산자 입니다. 타입 변환을 허용하지 않습니다. 값, 타입 모두 정확히 일치하는지 확인합니다. 따라서 값이 같더라도 타입이 다르면 false를 반환합니다.
13. 즐겨 보는 테크 유튜버나 뉴스레터가 있다면 알려주실 수 있을까요?
노마드 코더를 즐겨봅니다. 프로그래밍을 사랑하는게 느껴지고 코딩에 대한 순수한 열정이 느껴져서 좋습니다. 또한, 최신 기술에 대한 유용한 정보를 제공해줘서 도움이 많이 됩니다.
14. Express란 무엇이고 왜 필요하며 대안은 무엇이 있는지 설명해주실 수 있을까요?
Express는 노드상에서 동작하는 웹프레임워크입니다. 가볍고 유연하게 웹 프레임워크를 구성할 수 있다는 장점이 있습니다. JavaScript코드로 작성된 다양한 기능의 미들웨어는 개발자가 필요한 것만 선택하여 Express와 결합해 사용할 수 있습니다. 대안으로는 Nest.js가 있습니다. TypeScript기반으로한 Node.js의 프레임워크로 Angular와 비슷한 구조 및 패턴을 사용합니다. 주로 대규모 애플리케이션과 마이크로서비스를 개발하는 데 사용됩니다.
15. npm 이란 무엇인지 설명해주실 수 있을까요?
npm은 Node Package Manager로 Javascript 언어로 작성된 소프트웨어 패키지를 관리하기 위한 소프트웨어 관리 시스템입니다. 자바스크립트 및 node.js 환경에서 사용할 수 있는 다양한 툴을 등록하거나 다운로드 받을 수 있고, 이를 사용하기 위한 CLI를 지원한다. npm은 설치된 패키지들을 관리하는 기능도 가지고 있다. 설치된 패키지들의 버전이 업데이트되는 경우 다른 패키지와 충돌할 수 있는 가능성이 있다. 이를 대비해서 npm 은 패키지 설치 시 pakege.json을 같이 생성하여 프로젝트와 패키지의 의존성을 관리한다. 해당 프로젝트의 패키지와 의존 정보를 모두 갖고 있기 때문에 초기에 다른 프로젝트의 pakage.json를 가져와 개발 환경을 빠르게 구축할 수도 있다.
16. 사용자 패스워드를 전송하고 보관하는 방법을 설명해주실 수 있을까요?
유저의 패스워드를 받은 클라이언트는 평문으로 서버로 전송합니다. 평문을 받은 서버는 패스워드를 단방향 해시 함수로 암호화하여 보관합니다. 단방향 해시함수는 수학적 연산에 의해 원본 데이터를 완전히 다른 암호화된 데이터(다이제스트)로 변환하는 것을 말합니다. 원본 데이터로는 다이제스트를 구할 수 있지만 다이제스트로는 원본데이터를 구할 수 없어야 합니다. 이것을 단방향이라 합니다. 단방향 해시함수는 브루트포스 공격으로 쉽게 당할 수 있기 때문에 이를 보완하기 위해 입력된 다이제스트를 N번 반복해서 생성하는 것인 key stretching과 원문 패스워드에 임의의 문자열을 추가하여 해싱하는 것인 salting을 이용해 보안의 강도를 높힐 수 있습니다.
17. 최근에 본 기술 아티클에 대해 설명해주실 수 있을까요?
"백엔드 입문자를 위한 자바스크립트 생태계" 입니다. 과거에서부터 현 시점까지 자바스크립트가 어떠한 환경으로 성장해왔는지 적혀있는 아티클입니다. 현 시점에서 자바스크립트는 프론트엔드, 백엔드, 인프라, 앱개발 등 안쓰이는 곳이 없는 범용프로그래밍 언어로 티오베 사이트에서는 2021년 부터 7위의 자리를 지켜오고 있다고합니다. 이처럼 패키지 매니저, 빌드 자동화 도구, 코드 편집기, 프레임 워크, 백엔드 개발 환경, 인프라 6가지 항목으로 자바스크립트의 개발 환경이 잘 준비가 되어있는지 적혀있었습니다.
18. 포트폴리오에서 시간복잡도를 낮춘 사례가 있다면 설명해주실 수 있을까요?
회사와 채용공고를 크롤링해야하는 상황이었는데, 처음에는 puppeteer을 통해 크롤링을 시도하였으나 처리속도가 너무 느린 부분이 있었습니다. delay를 걸은 것도 아닌데 왜 이렇게 느릴까 생각했습니다. 사이트에 진입해서 페이지를 조회하고 웹 스크래핑을 하는 과정 자체에서 많은 리소스를 사용하는 것으로 보았고 간단한 HTTP 요청을 사용하여 데이터를 가져오는 Axios로 변경하여 시도해보았습니다. 위의 해결방안을 통해 puppeteer 1m22s → Axios 3.8s로 실행시간을 95% 개선했습니다.
19. 웹 서버란 무엇인지 NGiNX와 Apache를 비교하여 설명해주실 수 있을까요?
웹 서버란 사용자의 요청을 전달하고, 서버로부터 처리한 데이터를 응답하는 서비스 프로그램으로 볼 수 있습니다. 대표적으로 Apache와 Nginx가 있습니다. Apache는 스레드/프로세스 기반의 구조로 되어있으며, 요청이 올 때마다 새로운 스레드를 생성하여 처리합니다. 다만, 요청이 올 때마다 새로운 스레드를 생성하는 구조이기 때문에 클라이언트의 요청이 대량으로 들어올 경우 프로세스가 blocking되어 대기 상태에 빠질 경우가 생깁니다. Nginx의 경우 Apache의 단점을 보완하여 새로운 스레드를 생성하는 것이 아닌 Event-Handler를 통해 비동기 방식으로 처리하기 때문에 요청이 대량으로 늘어나더라도 추가적인 생성비용이 들지 않습니다. 반면에 외부 프로세서에 전달하고 렌더링 된 컨텐츠를 다시 전송할 때까지 기다려야 하기 때문에 프로세스의 속도 저하가 있을 수 있습니다.
20. 동기와 비동기를 비교하여 설명해주실 수 있을까요?
동기는 작업이 순차적으로 실행되는 것을 말하며 한 작업이 다른 작업이 완료될때까지 기다리며 그 이후에 실행되는걸 말합니다. 비동기는 순차적으로 실행되지 않으며 한 작업을 기다리지 않고 작업을 계속 수행합니다. 비동기는 작업이 빠르게 완료되고 작업 중 잠시 멈추더라도 다른 작업이 진행되는 것을 허락하기 때문에 동기보다 빠른 속도로 작업을 처리할 수 있습니다.
21. 모든 요소에 인덱스를 걸지 않는 이유는 무엇일까요?
인덱스를 사용하면 테이블을 검색하는 속도와 성능이 향상되는 장점이 있지만 인덱스를 관리하기 위한 추가 작업이 필요하며, 추가 저장 공간 또한 필요합니다. 잘못 사용하는 경우 오히려 성능이 저하될 수 있으며 인덱스가 적용된 칼럼에 삽입, 삭제, 수정이 잦다면 인덱스 또한 수정해야 하기 때문에 성능이 낮아지며. 또한 인덱스는 제거되는 것이 아니라 '사용하지 않음'으로 남겨 두기 때문에 인덱스가 과도하게 커질 수 있기 때문에 모든 요소에 인덱스를 걸지 않아야합니다.
22. 이분탐색이 무엇이고 시간복잡도는 어떻게 되며 그 이유는 무엇인가요?
정렬되어 있는 배열에서 데이터를 찾으려 시도할 때, 탐색 범위를 절반씩 줄여가며 찾는 Search 방법입니다. 이분 탐색의 시간복잡도는 O(log n)입니다. 이는 배열의 크기가 n일 때, 이분 탐색을 통해 원소를 찾는 데 최악의 경우에도 log₂(n) 단계만큼의 비교가 필요하다는 것을 의미합니다. 이분 탐색은 데이터 양이 많은 경우에도 효율적으로 동작하며, 선형 탐색(O(n))에 비해 빠른 검색을 제공합니다. 이분 탐색의 시간복잡도가 O(log n)인 이유는 매 단계에서 현재 탐색 범위를 절반으로 줄이기 때문입니다. 이로 인해 데이터 양이 두 배로 증가할 때도 추가적인 비교 횟수가 log₂(n)만큼 증가하므로, 큰 데이터 집합에서도 효율적으로 동작합니다. 이러한 특성은 이분 탐색을 정렬된 데이터에서 빠른 검색을 수행하는 데 사용되는 이유 중 하나입니다.
23. 트리, 그래프를 비교하여 설명해주실 수 있을까요?
그래프는 정점과 간선들로 이루어진 자료구조를 말합니다. 정점(Vertex)은 노드라고도 불리며 그래프를 형성하는 기본 단위이고, 분할할 수 없는 객체이자 “점”으로 표현되는 위치, 사람, 물건 등이 될 수 있습니다. 간선(Edge)은 정점을 잇는 선을 의미하며, 관계, 경로 등이 될 수 있습니다. 트리는 그래프의 일종입니다. 트리 역시 정점과 간선으로 이루어져 있지만, 노드 간에 자식노드와 부모노드라는 계층적인 구조를 가집니다. 그래프는 간선이 단방향, 양방향(무방향)이 모두 가능하지만, 트리는 무방향이고 사이클이 없습니다. 트리는 또한 V - 1 = E (정점 - 1 = 간선), 임의의 두 노드 사이의 경로는 ‘유일무이’하게 ‘존재’한다는 특징도 있습니다.
24. 인덱스란 무엇이고 일반적인 원리는 어떠한지 설명해주실 수 있을까요?
인덱스란 데이터와 데이터의 위치를 포함한 자료 구조이며, 이로써 DB 테이블의 검색 속도가 향상되어 데이터를 빠르게 조회할 수 있게 됩니다. 만약 인덱스를 사용하지 않고 조회를 할 시에는, 테이블 전체를 탐색하는 Full Scan이 수행됨으로써 처리 속도가 떨어지게 됩니다. 인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조입니다. 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장합니다. 인덱스가 생성 되었다면 생성한 인덱스의 컬럼을 Where 조건으로 쿼리하면 옵티마이저에서 판단하여 생성된 인덱스를 타게 됩니다. 그러면 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오게 됩니다.
25. 복합 인덱스란 무엇인지 원리를 설명해주실 수 있을까요?
복합 인덱스란 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것을 말합니다. 주로 단일 컬럼으로는 나쁜 분포도를 가지지만 여러 개의 컬럼을 합친다면 좋은 분포도를 가지고, WHERE 절에서 AND 조건에 많이 사용되는 컬럼들을 복합 인덱스로 구성합니다. 두개 이상의 조건이 OR로 조회되는 경우에는 복합 인덱스를 만들면 안됩니다. 인덱스를 이용하여 성능 향상의 효과를 기대할 수 있으려면 먼저 해당 인덱스를 이용하여 처리범위를 최대한 감소시켜야 한다. 복합 인덱스 컬럼의 설정 시 고려해야 할 우선순위는 1. where절 조건에 많이 사용되는 컬럼이 우선시 되야하고, 2. Equal 로 사용되는 컬럼이 우선되어야하고 3. 분포도가 좋은 컬럼을 우선으로 하고, 4. 자주 이용되는 순서대로 결합 인덱스 컬럼의 순서를 결정해야합니다.
26. HTTP에 비해 HTTPS가 더 안전한 원리를 설명해주실 수 있을까요?
HTTP란 서버/클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜입니다. 이 HTTP에는 3가지 문제가 있습니다. 첫 번째 HTTP 는 평문 통신이기 때문에 도청이 가능하다. 두 번째 통신 상대를 확인하지 않기 때문에 위장이 가능하다. 세 번째 완전성을 증명할 수 없기 때문에 변조가 가능하다. 이 3가지 문제를 해결하기 위해 HTTPS는 SSL(Secure Socket Layer) or TLS(Transport Layer Security)와 같은 프로토콜을 사용하여 공개키/개인키 기반으로 데이터를 암호화하고 있습니다. 데이터는 암호화되어 전송되기 때문에 임의의 사용자가 데이터를 조회하여도 원본의 데이터를 보는 것은 불가능하고, 완정성 또한 증명할 수 있습니다.
27. TCP 3 way handshake란 무엇인지 설명해주실 수 있을까요?
TCP 3 way handshake란 연결하고자 하는 두 장치 간의 논리적 접속을 성립하기 위해 사용하는 연결 확인 방식으로, 3번의 확인 과정을 거친다고 해서 3 way handshake라고 부릅니다. 동작 과정은
1. SYN (synchronize sequence numbers) 연결 확인을 위해 보내는 무작위의 숫자값으로 클라이언트에서 서버로 보내고
2. ACK (acknowledgements) Client 혹은 Server로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK와 SYN을 같이 보냅니다.
3. ACK (acknowledgements)를 보내 연결을 확인합니다.
28. TCP 와 UDP 를 비교하여 설명해주실 수 있을까요?
TCP는 연속성보다 신뢰성 있는 전송이 중요할 때에 사용되는 프로토콜이며,UDP는 TCP보다 빠르고 네트워크 부하가 적다는 장점이 있지만 신뢰성 있는 데이터 전송을 보장하지는 않습니다.그렇기 때문에 신뢰성보다는 연속성이 중요한 실시간 스트리밍과 같은 서비스에 자주 사용됩니다.
TCP는 Transmission Control Protocol의 약자이고, UDP는 User Datagram Protocol의 약자입니다. 두 프로토콜은 모두 패킷을 한 컴퓨터에서 다른 컴퓨터로 전달해주는 IP 프로토콜을 기반으로 구현되어 있고, 데이터 오류 검사를 위한 체크섬이 존재하지만, 서로 다른 특징을 가지고 있습니다. 신뢰성이 요구되는 애플리케이션에서는 TCP를 사용하고 간단한 데이터를 빠른 속도로 전송하고자 하는 애플리케이션에서는 UDP를 사용합니다. 또한 연결이 성공해야만 통신이 가능한 TCP와는 달리 연결 없이 UDP는 연결 없이 통신이 가능합니다.
29. Base64 인코딩이란 무엇인가요?
문자 그대로 직역하면 64진법 이라는 뜻입니다. base64 인코딩을 사용하면 64개의 아스키 문자열 형태로 바이너리 데이터를 변환시킬 수 있습니다. 이들을 3바이트씩 묶어 6비트로 나누면 그룹당 4개로 나눠지는데, 이를 base64 변환표에 맞게 다시 문자열로 변환시킵니다. base64를 통해 대부분의 화면단에 표시가 가능한 아스키문자들로 바꿔 전송이 가능하도록 되기 때문에, 이메일이나 HTML등에서 자주 사용됩니다. 다만 단점으로 데이터 크기 자체는 30%넘게 불어나기 때문에 효율이 좋지는 않습니다
30. 프로세스와 스레드를 비교하여 설명해주실 수 있을까요?
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다. 프로세스는 실행 될 때 운영채제로부터 프로세서, 필요한 주소 공간, 메모리 등 자원을 할당받습니다. 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 스레드끼리 공유하면서 실행됩니다. 운영체제는 시스템 자원을 효율적으로 관리하기 위해서 스레드를 사용합니다. 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있습니다. 뿐만 아니라 프로세스 간의 통신보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어들게 됩니다. 이처럼 스레드를 활용하면 자원의 효율성이 증가하기도 하지만 스레드 간의 자원공유는 전역 변수를 이용하므로 동기화 문제에 신경을 써야합니다.
31. 동시성과 병렬성을 비교하여 설명해주실 수 있을까요?
동시성은 동시에 실행되는 것처럼 보이는 것입니다. 동시성과 병렬성은 같은 개념이지만 동시성은 논리적인 부분이고 병렬성은 물리적인 부분입니다. 동시성은 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할을 포함합니다. 우리가 흔히 동시라고 얘기하지만 컴퓨터는 한번에 하나의 명령어만 처리 할 수 있습니다. 즉 두개 이상의 알고리즘이 하나의 코어내에서 스레드 간에 빠르게 교차되며 실행되기 때문에 동시라고 느끼는 것입니다. 병렬성은 적어도 2개의 코어가 있어야 합니다. 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어 내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말합니다. 그러므로 두개의 알고리즘이 정확히 같은 시점에 실행될 때 이를 병렬적이라고 말할수 있습니다.
32. 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주실 수 있을까요?
깊은 복사란 메모리에 저장되어 있는 실제 값을 복사하는 방식이고 얕은 복사란 메모리에 저장되어 있는 주소 값을 복사하는 방식입니다. 깊은 복사를 하였을 때에는 실제 값을 복사하였기 때문에 원래의 값이 바뀌어도 복사 값이 바뀌지 않지만 얕은 복사는 주소 값을 복사하였기 때문에 원래의 값이 바뀌었을 때 복사한 값도 같이 바뀐다는 특징이 있습니다. 일반적으로 원시형 데이터가 깊은복사가 가능하고 참조형 데이터가 얕은 복사가 됩니다. 참조형 데이터를 깊은 복사 하기 위해서는 JSON.parse와 JSON.stringify를 사용하는 방법이 있습니다.
33. JS의 passed by value 와 passed by reference 에 대해 아는 만큼 설명해주실 수 있을까요?
원시타입의 값은 값에 의한 전달(passed by value) 방식으로 전달됩니다. 원시 타입의 값은 변경할 수 없는 값이므로 원시 타입의 값을 변경하려면 새로운 값을 재할당해야 합니다. 또한 원시 타입의 값은 변경할 수 없는 값이므로 함수의 매개변수로 원시 타입의 값을 전달하면 함수 내부에서 매개변수의 값을 변경해도 원본의 값은 변경되지 않습니다.
객체타입의 값은 참조에 의한 전달(passed by reference)방식으로 전달됩니다. 객체 타입의 값은 변경할 수 있는 값이므로 함수의 매개변수로 객체 타입의 값을 전달하면 함수 내부에서 매개변수의 값을 변경하면 원본 값도 변경됩니다. 객체 타입의 값은 변경할 수 있는 값이므로 함수의 매개변수로 객체 타입의 값을 전달하면 함수 내부에서 매개변수의 값을 변경하면 원본 값도 변경됩니다.
34. 고차 함수란 무엇인지 설명해주실 수 있을까요?
함수를 파라미터로 전달 받거나 연산의 결과로 반환해주는 method 를 일컫습니다. 요즘 자주 거론되는 함수형 프로그래밍의 핵심이기도 하고, 자바스크립트를 함수형 프로그래밍에 알맞은 언어를 만들어주는 특성이기도 합니다. 함수형 프로그래밍이란 함수를 다른 함수의 파라미터로 넘길 수도 있고 반환(return)값으로 함수를 받을수도 있는 프로그래밍 형태를 말합니다. forEach(), map(), find(), findIndex(), filter(), reduce(), sort(), some(), every() method 등이 고차 함수의 예시입니다. 고차 함수를 사용하면, 함수의 재사용성이 높아지기 때문에 코드를 간결하게 작성할 수 있습니다. 또한, 고차 함수를 사용하면 코드의 가독성도 높아지며, 함수형 프로그래밍의 기본 개념을 쉽게 이해할 수 있습니다.
35. JWT에 대해 설명해주실 수 있을까요? 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출 시 어떻게 잡아서 인증 처리하는지 말씀해주시면 좋습니다.
인증 및 권한 부여를 위한 인터넷 표준으로 사용됩니다. JWT는 JSON 객체를 사용하여 클라이언트와 서버 간에 인증 정보를 안전하게 전송합니다. JWT는 사용자가 로그인하면 서버가 JWT를 발행합니다. 이 JWT는 암호화되어 있으며, 사용자의 식별 정보를 포함합니다. 클라이언트는 이 JWT를 받아 로컬 저장소에 저장하고, 인증이 필요한 요청을 보낼 때마다 헤더에 JWT를 포함하여 서버에 전송합니다. JWT를 처리하는 위치는 보통 서버의 미들웨어나 인증 미들웨어에서 처리합니다. 이 미들웨어에서 JWT를 확인하고 검증한 후, 유효한 사용자인지를 확인하여 요청에 대한 응답을 제공합니다. 검증을 위해서는 JWT 내에 있는 시그니처와 비밀키를 사용하여 검증합니다. JWT를 사용하는 서버에서는 유효기간이 만료된 JWT를 재발급합니다. 보통은 JWT에 유효기간을 설정하고, 일정 시간이 지나면 서버에서 새로운 JWT를 발행하여 클라이언트에게 전달합니다.
36. Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주실 수 있을까요?
Single Thread란 하나의 프로세스에서 하나의 스레드를 실행하므로 프로세스 내의 작업을 순차적으로 실행하며, 유저와 상호작용하는 애플리케이션의 경우, 한가지 작업이 끝난 뒤에야 다음 작업으로 이동하기 때문에 유저가 원하는 작업 수행이 빠르게 이루어지지 않을 수 있습니다. 그래도 Node.js가 single-threaded라 불리는 이유는 자바스크립트를 작동시키는 것은 바로 V8 엔진이며, V8엔진은 Call Stack과 Memory Heap로 구성되어 있습니다. 이 V8 엔진 덕분에 자바스크립트는 브라우저 내부에서도, 외부에서도 동작할 수 있습니다. V8 엔진과 런타임이 만나면 이벤트 루프가 작동하게 되며, 이벤트 루프는 비동기 처리를 가능하게 해주는 일종의 시스템입니다. 이벤트 루프는 싱글 스레드로 작동한다. 이 때문에 Node.js는 single-threaded 기반이라고 생각합니다.
37. Node.js는 non-blocking, asynchronous 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주실 수 있을까요?
Non-Blocking이란 이전 작업이 완료될 때 까지 기다리지 않고, 다음작업이 바로 진행될 수 있도록 동작하는 패러다임입니다. 직접 제어할 수 없는 작업이 완료되기 전에 제어권을 넘겨주는 경우를 말합니다. 호출된 함수에서 I/O작업등을 요청했을 경우 I/O작업의 처리여부와 관계없이 바로 다음 작업을 할 수 있습니다. Asynchronous란 호출된 작업의 리턴하는 시간과 결과를 반환하는 시간이 일치하지 않는 경우를 말합니다. 동기와 반대로 대상이 작업시간이 같지 않을 때 비동기적이라고 봅니다. 동작방식은 비동기이므로 각각의 작업이 순차적인 실행순서를 보장하지 않습니다. 요청 A가 요청되고 I/O작업까지 호출되면 논블로킹되어 Kernel은 다른 작업을 받을 대기를 하고, 그 사이 요청 B가 요청되고 Kernel을 작업을 완료하고 결과를 반환합니다. I/O작업이 완료되면 요청 A역시 결과를 반환하여 모든 프로세스가 완료됩니다.
38. Node.js의 이벤트 루프란 무엇이고 왜 필요하며 어떻게 작동하는지 아는 만큼 설명해주실 수 있을까요?
자바스크립트기반인 Node.js는 싱글 스레드 기반 언어이기 때문에, 한번에 하나씩 작업을 진행한다. 그러나 자바스크립트가 사용되는 환경을 생각해보면, 많은 작업이 동시에 처리되고 있는 것을 알 수 있습니다. 예를 들면, 웹브라우저는 애니메이션 효과를 보여주면서 마우스 입력을 받아서 처리하고, Nodejs기반의 웹서버에서는 동시에 여러개의 http요청을 처리할 수 있습니다. 즉 이벤트 루프는 비동기 처리를 가능하게 해주는 일종의 시스템입니다. 이벤트 루프의 동작 방식은 1. 코드가 호출스택에 쌓인 후, 실행되면 자바스크립트 엔진은 비동기 작업을 Web API에게 위임한다. 2. Web API는 해당 비동기 작업을 수행하고, 콜백 함수를 이벤트 루프를 통해서 테스크 큐에 넘겨주게된다. 3. 이벤트 루프는 콜스택에 쌓여있는 함수가 없을 때, 테스 큐에서 대기하고 있던 콜백함수를 콜스택으로 넘겨준다. 4. 콜스택에 쌓인 콜백함수가 실행되고, 콜스택에서 제거된다.
39. 트랜스파일러와 번들러에 대해 설명해주실 수 있을까요?
트랜스파일러(Transpiler)는 최신 JavaScript 버전(예: ES6, ES7)으로 작성된 코드를 이전 버전(예: ES5)으로 변환하는 도구입니다. 이를 통해 다양한 브라우저 및 환경에서 코드 호환성을 유지하면서 최신 기능을 활용할 수 있습니다. 대표적인 툴로 Babel이 있습니다.
번들러(Bundler)는 여러 JavaScript 파일 및 리소스(이미지, 스타일 시트 등)을 하나의 번들 파일로 결합하고 최적화하는 도구입니다. 이로써 웹 애플리케이션의 로딩 속도가 향상하고 네트워크 요청 수가 감소합니다. Webpack은 이를 위한 주요 번들러 중 하나입니다. 이들 도구는 모던 프런트엔드 개발에서 핵심 역할을 하며 성능과 개발 생산성을 향상시킵니다.
'혼자 고민해보기_ 개발 > CS' 카테고리의 다른 글
자료구조 (1) | 2023.11.10 |
---|---|
프로그래밍 패러다임 (선언형과 함수형, 객체지향, 절차형) (1) | 2023.11.09 |
네트워크 OSI 7 계층 (OSI 7 LAYER) (1) | 2023.11.08 |
디자인 패턴 (MVC, MVP, MVVM) (1) | 2023.11.08 |
메모리, 페이징, 세그먼테이션 (1) | 2023.11.07 |