TypeScript 시니어 CS 기초 기술면접
새 면접Q. B-Tree와 B+Tree의 구조적 차이를 설명하고, 데이터베이스 인덱스에서 B+Tree를 선호하는 이유를 설명해주세요. TypeScript로 대용량 인메모리 인덱스 시스템을 구현할 때 B+Tree의 노드 구조를 제네릭으로 설계하는 방법과, 범위 쿼리 성능을 최적화하기 위한 리프 노드 연결 전략을 포함해주세요.
B-Tree는 모든 노드에 키와 데이터를 저장하지만, B+Tree는 리프 노드에만 데이터를 저장하고 내부 노드는 인덱스 역할만 합니다. B+Tree의 리프 노드는 연결 리스트로 연결되어 있어 범위 쿼리 시 순차 스캔이 가능합니다. 데이터베이스는 B+Tree를 선호하는데, 내부 노드가 더 많은 키를 저장할 수 있어 트리 높이가 낮아지고, 리프 노드 간 연결로 범위 쿼리와 풀 스캔이 효율적이며, 모든 데이터가 같은 깊이에 있어 일관된 성능을 보장하기 때문입니다. TypeScript 구현 시 제네릭 타입으로 키와 값의 타입을 분리하고, 내부 노드와 리프 노드를 별도 클래스로 설계하며, 리프 노드에 next 포인터를 추가하여 순회를 최적화합니다.
- • B+Tree는 리프 노드에만 데이터 저장, 내부 노드는 인덱스만 보유
- • 리프 노드 연결 리스트 구조로 범위 쿼리 최적화
- • 트리 높이 감소와 일관된 성능 보장
- • 제네릭 타입으로 키/값 분리 설계
B+Tree의 노드 분할(split)과 병합(merge) 알고리즘을 구현할 때 발생할 수 있는 동시성 문제와, Copy-on-Write 기법을 활용한 락프리 B+Tree 구현 방법을 설명해주세요.
Q. TCP의 혼잡 제어 알고리즘(Slow Start, Congestion Avoidance, Fast Retransmit, Fast Recovery)의 동작 원리를 설명하고, 고대역폭 장거리 네트워크 환경에서 TCP의 성능 한계를 극복하기 위한 방법을 설명해주세요. TypeScript로 구현된 Node.js 서버에서 TCP 소켓 옵션을 튜닝하여 처리량을 최적화하는 전략도 포함해주세요.
TCP 혼잡 제어는 네트워크 상태에 따라 전송 속도를 조절합니다. Slow Start는 지수적으로 윈도우 크기를 증가시키고, Congestion Avoidance는 임계값 이후 선형 증가하며, Fast Retransmit은 3개의 중복 ACK 수신 시 즉시 재전송하고, Fast Recovery는 혼잡 윈도우를 절반으로 줄인 후 선형 증가합니다. 고대역폭 장거리 네트워크(BDP가 큰 환경)에서는 윈도우 크기 제한으로 대역폭을 충분히 활용하지 못하므로, TCP Window Scaling 옵션을 활성화하고, CUBIC이나 BBR 같은 개선된 혼잡 제어 알고리즘을 사용합니다. Node.js에서는 net.Socket의 setKeepAlive, setNoDelay(Nagle 알고리즘 비활성화), 버퍼 크기 조정 등의 옵션을 설정하여 최적화할 수 있습니다.
- • 4단계 혼잡 제어 알고리즘의 상태 전환 메커니즘
- • BDP 환경에서 윈도우 스케일링과 개선된 알고리즘 필요
- • Node.js 소켓 옵션 튜닝으로 처리량 최적화
- • Nagle 알고리즘과 지연 ACK의 트레이드오프
Google의 BBR 혼잡 제어 알고리즘이 기존 손실 기반 알고리즘과 다르게 병목 대역폭과 RTT를 추정하는 방식과, 이를 Node.js 환경에서 활성화하는 방법을 설명해주세요.
Q. 가상 메모리 시스템에서 페이지 교체 알고리즘(FIFO, LRU, LFU, Clock)의 동작 원리와 각각의 장단점을 설명하고, Belady's Anomaly 현상을 설명해주세요. TypeScript로 구현된 대용량 캐싱 시스템에서 메모리 압박 상황을 감지하고 적응적으로 캐시 크기를 조절하는 전략도 포함해주세요.
페이지 교체 알고리즘은 메모리가 부족할 때 어떤 페이지를 제거할지 결정합니다. FIFO는 가장 오래된 페이지를 제거하지만 자주 사용되는 페이지도 제거될 수 있고, LRU는 최근 사용 시간을 추적하여 가장 오래 사용되지 않은 페이지를 제거하며, LFU는 참조 횟수를 기준으로 하지만 초기 높은 참조 후 사용되지 않는 페이지가 남을 수 있고, Clock 알고리즘은 순환 리스트와 참조 비트로 LRU를 근사합니다. Belady's Anomaly는 FIFO에서 프레임 수를 늘렸는데 페이지 폴트가 증가하는 현상입니다. TypeScript 캐싱 시스템에서는 process.memoryUsage()로 힙 사용량을 모니터링하고, 임계값 초과 시 캐시 크기를 동적으로 줄이며, WeakMap이나 FinalizationRegistry를 활용하여 가비지 컬렉션과 협력하는 전략을 사용합니다.
- • 각 페이지 교체 알고리즘의 구현 복잡도와 성능 트레이드오프
- • Belady's Anomaly는 FIFO의 비직관적 현상
- • 메모리 압박 감지와 적응적 캐시 크기 조절
- • Node.js 메모리 API와 가비지 컬렉션 협력
Working Set 모델과 Page Fault Frequency 알고리즘을 활용하여 프로세스별 최적 메모리 할당량을 동적으로 결정하는 방법과, 이를 컨테이너 환경에서 적용할 때의 고려사항을 설명해주세요.
Q. 데이터베이스 인덱스의 카디널리티(Cardinality)와 선택도(Selectivity)가 쿼리 성능에 미치는 영향을 설명하고, 복합 인덱스의 컬럼 순서를 결정하는 원칙을 설명해주세요. TypeScript ORM 사용 시 N+1 쿼리 문제를 DataLoader 패턴으로 해결하면서도 타입 안정성을 유지하는 방법도 포함해주세요.
카디널리티는 고유한 값의 개수를 의미하며, 선택도는 전체 레코드 중 특정 조건을 만족하는 비율입니다. 높은 카디널리티와 낮은 선택도를 가진 컬럼이 인덱스로 효과적이며, 복합 인덱스는 선택도가 낮은(필터링 효과가 큰) 컬럼을 앞에 배치하고, 동등 조건을 범위 조건보다 앞에 두며, 쿼리 패턴에 따라 순서를 최적화해야 합니다. N+1 문제는 연관 데이터를 개별 쿼리로 조회할 때 발생하며, DataLoader는 요청을 배칭하고 중복을 제거하여 해결합니다. TypeScript에서는 제네릭 타입으로 DataLoader<Key, Value>를 정의하고, 로더 함수의 반환 타입을 명확히 하며, Promise 배열의 순서를 보장하여 타입 안정성을 유지합니다.
- • 카디널리티와 선택도가 인덱스 효율성 결정
- • 복합 인덱스 컬럼 순서는 선택도와 쿼리 패턴 기반
- • DataLoader의 배칭과 캐싱으로 N+1 해결
- • 제네릭 타입으로 로더의 타입 안정성 보장
커버링 인덱스(Covering Index)의 개념과 이를 활용한 쿼리 최적화 방법, 그리고 인덱스 온리 스캔이 불가능한 상황에서의 대안을 설명해주세요.
Q. Bloom Filter의 동작 원리와 False Positive가 발생하는 이유를 설명하고, 비트 배열 크기와 해시 함수 개수를 결정하는 수학적 공식을 설명해주세요. TypeScript로 대규모 분산 시스템에서 중복 요청 필터링을 위한 Counting Bloom Filter를 구현할 때 고려해야 할 동시성 제어와 메모리 효율성 전략도 포함해주세요.
Bloom Filter는 원소의 존재 여부를 확률적으로 판단하는 공간 효율적 자료구조로, 여러 해시 함수로 비트 배열의 여러 위치를 1로 설정합니다. False Positive는 서로 다른 원소들이 같은 비트 위치를 공유할 때 발생하며, False Negative는 없습니다. 비트 배열 크기 m = -(n * ln(p)) / (ln(2)^2), 해시 함수 개수 k = (m/n) * ln(2)로 계산하며, n은 예상 원소 수, p는 허용 오류율입니다. Counting Bloom Filter는 비트 대신 카운터를 사용하여 삭제를 지원하며, TypeScript 구현 시 SharedArrayBuffer와 Atomics API로 동시성을 제어하고, 카운터 오버플로우 방지를 위해 4비트 카운터를 사용하거나, 분산 환경에서는 Redis의 BITFIELD 명령으로 원자적 연산을 보장합니다.
- • 확률적 자료구조로 공간 효율성과 False Positive 트레이드오프
- • 비트 배열 크기와 해시 함수 개수의 수학적 최적화
- • Counting Bloom Filter로 삭제 연산 지원
- • SharedArrayBuffer와 Atomics로 동시성 제어
Cuckoo Filter가 Bloom Filter보다 우수한 점과, 동적으로 크기를 조절할 수 있는 Scalable Bloom Filter의 구현 원리를 설명해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!