그저 내가 되었고

🌟신입 백엔드 개발자 기술 면접 질문&답변(21~30) 본문

개발/BE 일반*개발 이야기

🌟신입 백엔드 개발자 기술 면접 질문&답변(21~30)

hyuunii 2022. 12. 21. 20:11

21. JS; 동기와 비동기 비교하여 설명

자바스크립트는 기본적으로 싱글쓰레드 방식으로 동작하므로 한 번에 한 가지 일만 수행할 수 있습니다. 이러한 자바스크립트의 본성 탓에 비동기적인 프로그래밍이 필요합니다.
(물론 싱글쓰레드에서 비동기적인 프로그래밍을 한다고 해서 멀티쓰레드처럼 동시 다발적인 작업이 가능해지는것은 아니지만, 싱글쓰레드라고는 하나 사람이 인지할 수 없을 정도로 찰나의 시간으로 순차적인 실행이 이루어지기 때문에 동시에 실행되는 것과 다름없게 느껴지긴 합니다.)
비동기라는것은 결국 동시다발적인 요청에 응하기 위해 싱글쓰레드에서 할 수 있는 최선의 방식이라 할 수 있습니다.
동기 방식은 서버에서 요청을 보냈을 때 응답이 돌아와야만 다음 동작을 수행합니다. 즉 A작업이 완료될때까지 B작업은 대기해야 합니다. 코드에서는 위에서부터 아래로 내려가면서 하나가 끝나면 다음 코드가 실행되는 방식을 동기적 처리(Synchronous)라고 합니다.
이와는 반대로 비동기 방식은 서버에서 요청을 보냈을 때 응답 상태와 관계 없이 다음 동작을 수행할 수 있습니다. 즉 A작업이 시작하면 동시에 B작업이 실행될 수 있습니다. A작업의 결괏값은 나오는대로 출력됩니다. 즉 프로그램 실행 타임라인의 분기를 나눠서 두 개 이상의 함수가 동시에 동작할 수 있는 것입니다.
동기는 코드 디자인이 비동기보다 간단하고 직관적일 수 있지만 결과가 주어질 때까지 아무것도 못하고 대기해야하는 문제가 있습니다.
비동기는 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그동안 다른 작업을 할 수 있어 효율적일 수 있습니다.
(더 쉽게 이해하려면 생활속의 예시로 카페의 풍경을 생각해볼 수 있습니다. 예컨대 카페에서 커피를 주문하는 상황이라고 해봅시다. 동기카페에서는 커피를 주문하면 그 커피를 받을 때까지 카운터 앞에서 자리를 지켜야만 합니다. 반면에 비동기카페에서는 주문을 하면 진동호출기를 나눠주고, 이것을 갖고 장소를 옮기거나 대기하며 다른 용무를 볼 수 있습니다. 그리고 주문한 커피가 준비되면 호출기가 울려 주문자가 알 수 있습니다. 앞의 동기카페는 특정 일이 완료되어야 다음 일을 진행할 수 있지만, 뒤의 비동기 카페는 특정 일의 완료 여부와 상관 없이 다른 일을 할 수 있습니다.)

 

23. CS-DataBase; 모든 요소에 인덱스를 걸지 않는 이유

DB 서버에 성능문제가 발생하면 가장 먼저 생각해볼 수 있는 해결책이 인덱스 추가 생성입니다.
인덱스가 데이터 액세스 속도의 효율성을 증가시키는것과 마찬가지로 잘못 선택하면 오히려 데이터 액세스 효율성을 저하시킬 수도 있습니다.
인덱스란 그 생성 시점에 해당 테이블에 존재하는 데이터를 기준으로 생성됩니다. 그러므로 테이블에 데이터가 추가, 업데이트, 삭제될 때마다 인덱스 업데이트 역시 필요합니다. 
즉, 인덱스가 많으면 퍼포먼스 비용이 생길 수 밖에 없습니다.
또한 저장공간 문제도 있습니다. 인덱스 역시 당연하게도 저장 공간을 사용하며, 거대한 볼륨의 데이터를 핸들링하는 서비스일 경우 인덱스의 크기 역시 매우 커져서 물리적 저장소(Physical Storage)와 메모리 사용량이 급증하게 됩니다.
결론적으로, 모든 요소에 인덱스를 걸면 CRUD 의 4개 요소에서 “R”이외의 다른 요소들은 극단적으로 성능이 저하되며 사용량 또한 급증합니다.
그렇기에 인덱스부터 생성하는것 보다는 SQL문을 좀 더 효율적으로 짜는 방향을 고려해야합니다.
(참고: https://grip.news/archives/1428)

 

24. Algorithm; 이분탐색이 무엇이고 시간복잡도는 어떻게 되며 그 이유는 무엇인지

이분탐색(BST, Binary Search Tree)은 정렬된 배열에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법입니다. 
start, end, mid의 변수 세개를 사용하여 탐색하며, 찾으려는 데이터와 중간값 데이터를 반복적으로 비교해서 원하는 데이터를 찾는 과정입니다.
이분탐색은 노드를 이동할 때마다 경우의 수가 절반으로 줄어들며, 시간복잡도는 O(log N)(Logarithmic Complexity, 로그 복잡도)입니다.
운이 좋으면 찾는값이 중간값과 동일해서 탐색이 바로 끝나지만 최악의 경우 남은 데이터가 하나가 될 때까지 탐색을 반복합니다. 이를 고려해 시간 복잡도를 계산할 수 있습니다.
전체 데이터 수를 N이라고 했을 때, 첫 번째 탐색 후 절반만 남은 데이터의 갯수는 2/N입니다.
두 번째 탐색 후 다시 절반만 남은 데이터의 갯수는 2/N * 1/2입니다.
이후 같은 로직으로 k번째 탐색에서 남은 데이터 갯수는 N * (1/2)^k가 됩니다.
위 식 양변에 2^k를 곱하고 다시 양변에 2를 밑으로 하는 로그를 취하면 최종 식은 k=로그2의N이 됩니다.
k는 탐색 횟수로 N에따라 시행 횟수는 로그2의N이 됩니다. 
따라서 시간복잡도는 O(logN)으로 나타낼 수 있습니다.
(참고: https://kangworld.tistory.com/65)

 

25. CS-Data Structure; 트리, 그래프를 비교하여 설명

결론부터 말씀드리자면 트리는 특정 조건을 만족하는 그래프입니다. 트리는 그래프이지만 그래프는 트리가 아닙니다.
그래프는 노드(하나의 점)와 노드 간을 간선(Edge)으로 연결한 자료구조입니다. 이를 통해 연결된 노드 간의 '관계'를 표현합니다.
루트 노드의 개념이 없고, 부모-자식 관계라는 개념 역시 존재하지 않습니다. 
현실에서도 찾아볼 수 있으며, 흔히 보는 지하철 노선도가 그 예에 해당합니다. '강남역'이 개체(노드), '강남역'과 '역삼역'을 이어주는 선이 '관계(간선)'입니다. 
트리는 그래프와 같이 노드와 노드를 연결하는 간선으로 구성된 자료구조입니다. 그러나 처음에 말씀드렸듯 트리는 그래프 중에서도 특수한 케이스에 해당합니다. 트리는 두개의 노드 사이에 반드시 1개만의 경로를 가지며, 사이클(단순 경로-모두 다른 정점으로 구성된 경로-중에서 경로의 시작 정점과 마지막 정점이 같은 경로)이 존재하지 않는 방향 그래프입니다. 부모-자식 관계가 존재해 최상위 노드인 루트 노드에서부터부터 리프 노드까지의 레벨이 존재합니다. 현실에서도 트리를 찾아볼 수 있으며, 회사의 조직도가 바로 트리의 대표적인 예시입니다.
그래프는 개체 간의 '관계'를 표현한다면 트리는 개체를 '계층'구조로 표현합니다.

+ 추가_트리와 그래프:

트리 vs 그래프

 

26. CS-DataBase; 인덱스란 무엇이고 일반적인 원리는 어떠한지 설명

인덱스는 효과적으로 제목을 찾기 위해 '색인'작업을 하는 것을 뜻합니다. 
예컨대 사전에서 'database'라는 단어를 찾을 때 첫 페이지부터 이 단어를 찾는 사람은 없을 것입니다.
일반적으로 'd'의 색인(혹은 목차)을 기준으로 'de' 시작 페이지로 이동할 것이고, 이런 행위를 반복해 'database' 설명이 있는 페이지를 찾을 것입니다.
DB에서도 마찬가지로 정보 검색에 있어 성능을 최적화하기 위해 인덱스를 붙입니다.
인덱스가 없다면 DB는 모든 행을 검사해야 합니다. 데이터 양이 적다면 큰 문제가 되지 않겠지만, 데이터가 아주 많다면 계속해서 DB 전체를 훑어야하는건 트래픽에 따라 성능 저하를 불러올 수밖에 없습니다. 
이때 자주 조회되는 Column에 대한 Index Table을 따로 만들어 SELECT문이 들어왔을 때 Index Table에 있는 값들로 결과 값을 조회하여 검색 연산 실행시 성능을 드라마틱하게 올릴 수 있습니다.
인덱스를 생성할때는 먼저 기준이 될 컬럼의 데이터를 수집하여 수집한 데이터를 정렬한 후 tree구조로 정리합니다.
일반적으로 B+ tree 알고리즘을 사용하며, 이 경우 루트 노드에서부터 어떤 리프 노드만 확인하면 되는지 알려주어 원하는 데이터를 찾는 시간이 훨씬 줄어듭니다.
이렇게 Index는 검색 속도를 향상하는 장점이 있지만, 항상 데이터를 정렬된 상태로 유지하기 때문에 insert, update, delete 과정에서는 상대적으로 속도가 저하된다는 단점이 있습니다. TABLE의 Index 정보를 갱신하는 비용이 추가되기 때문입니다.
그러므로 데이터 갱신보다는 조회에 주로 사용되는 컬럼에 Index를 생성하는 것이 유리합니다.
(참고: https://grip.news/archives/1311 /// https://seunghyunson.tistory.com/19)

 

29. CS-DataBase; 복합 인덱스란 무엇인지 원리를 설명

복합 인덱스란 하나의 컬럼이 아닌 여러 개의 컬럼으로 인덱스를 만드는것을 말하며(= multi column index = multi index.),실제로는 주로 두 컬럼에 대해 인덱스를 생성합니다.
이대 정렬은 앞선 칼럼에 의존하여, 즉 앞에 있는 컬럼 순서대로 실행됩니다.
예를 들어 name과 birthday컬럼으로 다중 컬럼 인덱스를 생성했다고 가정했을때, birthday의 값이 아무리 낮더라도, 짝지어진 name의 값이 높을 경우 해당 데이터는 인덱스의 아래쪽에 쌓이게 됩니다. 첫번째 컬럼인 name에 의존하기 때문입니다.
이 때문에 다중 컬럼 인덱스를 생성할 때에는 순서에 매우 신중해야 합니다.
또한 위의 예시에서 name이 함께 검색되지 않고 birthday만 사용하면 인덱스를 타지 못합니다. 복합 인덱스를 사용할 경우 index의 제일 왼쪽 칼럼을 함께 조회해야합니다. name 단독으로 검사하는 경우는 가능합니다.
(참고_DB 인덱스의 동작 원리:https://kyungyeon.dev/posts/66)