면접을 준비하는 과정에서 가장 중요한 것은 무엇일까요?
바로 “면접 예상 질문”에 대한 답변을 스스로 작성해보고, 계속 연습해보는 것입니다.
스스로에게 납득이 될 수 있을 정도로 충분히 연습해서 최종 합격까지 하시길 기원합니다! 😁
<aside> 🤓 인성면접 예상질문 (20개)
</aside>
지원 동기
개발 관심 정도
메타인지
먼저 3개월 동안은 CS 지식과 Javascript, Node.js를 조금 더 공부할 예정입니다. 좋은 코드는 CS 지식과 프로그래밍 언어와 Framework의 기본기가 더욱 탄탄하게, 많이 쌓일수록 더욱 잘 작성된다고 생각합니다. 또한 현업에서도 실수 없이, 좋은 코드를 작성하기 위해 이 부분은 필수라고 생각합니다.
6개월 계획은 Kafka, Redis, 등 대용량 트래픽 처리 관련 System 설계 시 필요한 기술 Stack을 공부할 예정입니다.
삶의 태도
조직 문화 적합성
<aside> 🤓 기술면접 예상질문 - CS기초 지식 (26개)
</aside>
알고리즘
시간복잡도는 문제를 해결하는데 걸리는 시간과 입력의 함수 관계를 말합니다. 즉, 어떠한 알고리즘의 로직이 ‘얼마나 오랜 시간’ 걸리는지를 나타내는데 쓰이며, 보통 빅O 표기법으로 나타냅니다.
공간 복잡도는 프로그램을 실행시켰을 때 필요로 하는 자원 공간의 양을 의미합니다. 공간 복잡도의 총 필요 저장 공간은 코드 저장 공간과 단순 변수 및 상수를 저장하는 고정 공간과 알고리즘 실행과 관련 있는 공간인 가변 공간의 합으로 이루어져 있습니다.
즉 고정 공간은 상수이므로 공간 복잡도는 가변 공간에 의해 좌우됩니다.
재미있게 공부한 알고리즘이 있다면 설명해주실 수 있을까요?
포트폴리오에서 시간복잡도를 낮춘 사례가 있다면 설명해주실 수 있을까요?
항해 99 최종 프로젝트인 TicketNest에서 시간복잡도를 낮춘 사례가 있습니다. TypeORM의 Save Method를 통해 어떠한 데이터를 Update를 할 경우에 먼저 Select 문을 진행하고, 이후 Update를 진행하는 것이 확인되었으며, 이것으로 인해 Latency가 높은 현상이 확인되었습니다.
이를 기반으로 하여 동적 쿼리를 사용하여 Update만 하도록 변경하였으며 이로 인해 Latency가 크게 줄어들었으며 시간 복잡도를 낮췄습니다.
이분 탐색이란 정렬된 이진 트리에서 어떠한 데이터를 탐색하는 기법으로, 다음과 같은 속성을 가지고 있습니다.
이분 탐색의 시간복잡도는 O(LogN)이며, 이를 설명하자면 탐색 시 검색해야 되는 데이터 양을 절반씩 줄이기 때문에 O(LogN)이 됩니다.
시간복잡도가 높은 경우 취할 수 있는 일반 전략을 3가지 정도 설명해주실 수 있을까요?
공간복잡도가 높은 경우 취할 수 있는 일반 전략을 3가지 정도 설명해주실 수 있을까요?
자료구조
최근에 Hash에 대해서 공부하였으며, Hash 함수를 어떻게 작성해야 효율적이고, 충돌을 피할 수 있을지 고민하는 점에서 굉장히 재밌는 자료구조라고 생각하게 되었습니다
스택은 제한적으로 접근할 수 있는 나열구조입니다. 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형구조로 되어있습니다. 자료를 넣는 것을 푸쉬라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝이라고 합니다. 이때 꺼내지는 자료는 가장 최근에 푸쉬한 자료부터 나오게 됩니다. Stack의 사용 사례로는 주로 웹 브라우저 방문 기록, 실행 취소 등이 있습니다.
큐는 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(선입선출) 구조로 저장하는 형식을 의미합니다. 큐는 Rear에서 이루어지는 삽입 연산을 Enqueue라고 부르며, Front에서 이루어지는 삭제 연산을 Dequeue라고 합니다. Queue는 주로 은행 업무, 대기열 순서와 같은 우선 순위의 작업 예약 등 이러한 부분에서 많이 사용됩니다.
Array, 즉 배열은 입력된 데이터들이 메모리 공간에서 연속적으로 저장되어 있는 자료구조를 의미합니다. 메모리 상에서 연속적으로 저장되어 있는 특징을 갖기 때문에, Index를 통한 접근이 용이합니다.
배열은 인덱스를 통한 빠른 접근이 가능하지만, 삽입/삭제의 경우 시간 복잡도가 O(n)이기 때문에 오래 걸리며, 배열 중간에 있는 데이터가 삭제 되면 공간 낭비가 발생합니다.
LinkedList는 여러 개의 노드들이 순차적으로 연결된 형태를 갖는 자료구조이며, 첫 번째 노드를 Head, 마지막 노드를 Tail이라고 한다. 각 노드는 데이터와 다음 노드를 가리키는 포인터로 이루어져 있습니다. 배열과는 다르게 순차적으로 접근해야 하는 면에서 불리할 수도 있으나 노드가 연결된 구조이기 때문에 삽입과 삭제가 용이합니다.
따라서 배열은 빠른 접근이 요구되고, 데이터와 삽입과 삭제가 적을 때 사용하며, 연결 리스트는 삽입과 삭제 연산이 많고, 검색 빈도가 적을 때 사용합니다.
해시테이블은 해시함수를 사용하여 키를 해시값으로 매핑하고, 이 해시값을 색인(인덱스) 또는 주소삼아 데이터를 key와 함께 저장하는 자료구조이다. 단순하게 key - value로 이루어진 자료구조라고 생각하면 된다.
Hash Function은 key를 고정된 길이의 Hash로 변경해주는 역할을 하며, 이 과정을 hashing이라고 합니다. key를 hash function에 input으로 넣어서 Output으로 나오는 것이 Hash라고 생각하면 되고, 이 Hash가 저장 위치가 된다고 생각하면 된다.
데이터베이스
인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키는 자료구조입니다. 인덱스는 보통 B-트리라는 자료구조를 활용하여 검색 속도를 상승시킵니다.
B-Tree는 트리 자료구조의 일종으로, 이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조입니다. 이는 루트 노드, 리프 노드, 그리고 루트 노드와 리프 노드 사이에 있는 브랜치 노드로 나뉩니다. 트리 탐색은 맨 위 루트 노드부터 탐색이 일어나며 브랜치 노드를 거쳐 리프 노드까지 내려오는 하향식 탐색 기법이 적용되어 있습니다.
루트 노드에서 탐색을 시작한다.
K를 찾았다면 탐색을 종료한다.
K와 노드의 key값을 비교해 알맞은 자식 노드로 내려간다.
해당 과정을 리프 노드에 도달할 때까지 반복한다.
리프 노드에서도 K를 찾지 못한다면 트리에 값이 존재하지 않는 것이다.
모든 요소에 인덱스를 걸지 않는 이유는 무엇일까요?
인덱스는 테이블을 조회하는 속도와 그에 따른 성능을 향상 시킬 수 있고, 전반적인 시스템의 부하를 줄일 수 있다는 장점이 있지만, 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하며, 또한 추가 작업이 필요합니다.
그리고 인덱스를 생성해두면 해당 테이블의 Insert, Update, Delete 작업 진행 시, 인덱스에도 수정 작업이 동시에 발생하기 때문에 인덱스를 너무 많이 만들면 오히려 성능이 저하될 수 있습니다.
Composite Index는 데이터베이스에서 여러 개의 컬럼(열)들을 조합하여 인덱스를 생성하는 것을 의미합니다. 주로 단일 컬럼으로는 나쁜 분포도를 가지지만 여러 개의 컬럼을 합친다면 좋은 분포도를 가지고, Where절에서 AND 조건에 많이 사용되는 컬럼들을 복합 인덱스로 구성합니다. index Table에서 where에 포함된 값을 찾아옵니다. 해당 값의 table_id[PK]을 가져옵니다. 가져온 table_id [PK] 값으로 원본 테이블에서 값을 조회해옵니다.
Transaction이란 데이터 베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위입니다. 즉, 여러 단계의 처리를 하나의 처리처럼 다루는 기능입니다.
트랜잭션을 쓰는 이유는 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위해서입니다.
원자성은 Transaction이 실행되는 쿼리문이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것을 의미합니다.
일관성은 Transaction의 작업 처리 결과가 항상 일관성이 있어야 한다는 것을 의미합니다. 이는 작업이 실패하더라도 실패한 상태로 데이터를 방치하지 않는 특징을 의미합니다.
고립성은 둘 이상의 Transaction이 동시에 병행 실행되고 있을 경우에 어느 하나의 Transaction이라도 다른 Transaction의 연산에 끼어들 수 없는 것을 의미합니다.
지속성은 Transaction이 성공적으로 완료되었을 경우, 영구적으로 반영되어야 한다는 점입니다.
정규화란 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화 하는 프로세스입니다.
정규화의 장점은 데이터베이스의 변경 시 이상 현상을 제거할 수 있으며, 데이터 베이스 구조 확장 시 재 디자인을 최소화 시킬 수 있습니다.
또한 저장 공간을 효율적으로 사용할 수 있다는 장점도 존재합니다.
정규화 절차는 제 1~5 정규화 과정으로 순차적으로 진행되며, 대표적으로 제1~3 정규화 까지 진행됩니다.
간단하게 설명하면
제 1정규화는 같은 성격과 내용의 컬럼이 연속적으로 나타나는 컬럼이 존재할 때, 해당 컬럼을 제거하고 기본테이블의 PK를 추가해 새로운 테이블을 생성하고, 기존의 테이블과 1:N 관계를 형성하는 것입니다.
제 2정규화는 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것입니다.
제 3정규화는 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미합니다.
그러나 단점으로는 정규화 과정 자체가 복잡하며, 너무 많은 테이블로 분해되면 Join 연산이 늘어나 쿼리의 성능이 저하될 수 있습니다.
네트워크
기타
먼저 인코딩이란 어떠한 정보/데이터의 형태나 형식을 다른 형태나 형식으로 변환하는 것을 말합니다. 인코딩을 하는 이유로는 데이터의 표준화, 처리 속도 향상, 저장 공간 절약, 보안 등이 있습니다.
Base64 인코딩이란 Binary Data(이진 데이터)를 ASCll 문자로만 이루어진 Text로 변환시키는 인코딩이다.