TypeScript 시니어 CS 기초 기술면접

TypeScript 시니어 (7년+) CS 기초 5문항 조회수 119 · 2026-05-06 (수) 11:10:57
1 자료구조
Hard

Q. TypeScript로 LRU 캐시를 구현할 때 Map과 doubly linked list를 조합하여 O(1) 시간복잡도로 get/put 연산을 수행하는 자료구조를 설계해야 합니다. 각 자료구조의 역할과 타입 안전성을 보장하면서 제네릭으로 구현하는 방법을 설명해주세요. 특히 WeakMap 대신 Map을 사용하는 이유와 메모리 관리 전략도 포함해주세요.

A. 모범답안

Map은 캐시 키의 삽입 순서를 추적하고 O(1) 조회를 제공하며, doubly linked list는 LRU 순서를 유지하고 O(1) 삭제/이동을 가능하게 합니다. Map의 value로 linked list 노드의 참조를 저장하여 양방향 연결을 구현합니다. WeakMap은 자동 GC를 제공하지만 이터레이션과 크기 제한이 불가능하여 LRU에 부적합합니다. 제네릭 타입 <K, V>로 키와 값의 타입 안전성을 보장하고, capacity 초과 시 tail 노드를 제거하는 eviction 정책을 구현합니다. private 필드와 readonly 속성으로 내부 상태의 불변성을 보호합니다.

핵심 포인트
  • • Map은 O(1) 조회, doubly linked list는 O(1) 순서 조정을 담당하는 역할 분리
  • • Map의 value에 노드 참조를 저장하여 양방향 접근 구조 구현
  • • WeakMap은 이터레이션과 size 제한이 불가능하여 LRU 캐시에 부적합
  • • 제네릭 <K, V>로 타입 안전성 보장 및 capacity 기반 eviction 정책 구현
Follow-up 질문

멀티스레드 환경에서 LRU 캐시의 동시성 문제를 해결하기 위한 lock-free 알고리즘이나 세그먼트 기반 캐시 설계 방안을 설명해주세요.

2 네트워크
Hard

Q. HTTP/2의 멀티플렉싱과 HTTP/3의 QUIC 프로토콜이 head-of-line blocking 문제를 해결하는 방식의 차이를 설명하고, TypeScript로 구현된 Node.js 서버에서 각 프로토콜의 장점을 활용하기 위한 설정과 고려사항을 설명해주세요. 특히 패킷 손실 상황에서의 동작 차이를 포함해주세요.

A. 모범답안

HTTP/2는 단일 TCP 연결 위에서 멀티플렉싱하지만 TCP 레벨에서 패킷 손실 시 모든 스트림이 블로킹되는 HOL 문제가 있습니다. HTTP/3는 UDP 기반 QUIC을 사용하여 스트림별 독립적인 순서 보장으로 한 스트림의 패킷 손실이 다른 스트림에 영향을 주지 않습니다. Node.js에서는 http2 모듈로 HTTP/2를 네이티브 지원하며, HTTP/3는 quiche나 cloudflare의 quic 라이브러리를 사용합니다. 모바일 환경이나 고지연 네트워크에서는 HTTP/3가 유리하지만, 일부 방화벽이 UDP를 차단할 수 있어 fallback 전략이 필요합니다.

핵심 포인트
  • • HTTP/2는 TCP 레벨 HOL blocking으로 패킷 손실 시 모든 스트림 영향
  • • HTTP/3 QUIC은 스트림별 독립적 순서 보장으로 HOL blocking 완전 해결
  • • Node.js http2 모듈 네이티브 지원, HTTP/3는 별도 라이브러리 필요
  • • UDP 차단 가능성으로 HTTP/2 fallback 전략 필수
Follow-up 질문

0-RTT 연결 재개 기능이 보안에 미치는 영향과 replay attack을 방지하기 위한 방안을 설명해주세요.

3 운영체제
Medium

Q. Node.js의 이벤트 루프는 단일 스레드로 동작하지만 libuv의 스레드 풀을 활용하여 I/O 작업을 처리합니다. 이벤트 루프의 각 페이즈(timers, pending callbacks, poll, check, close callbacks)의 역할과 실행 순서를 설명하고, CPU 집약적 작업이 이벤트 루프를 블로킹하는 문제를 Worker Threads로 해결하는 방법을 TypeScript 타입 관점에서 설명해주세요.

A. 모범답안

이벤트 루프는 timers(setTimeout/setInterval) → pending callbacks(이전 루프 연기된 I/O) → poll(새로운 I/O 이벤트) → check(setImmediate) → close callbacks 순서로 실행됩니다. 각 페이즈 사이에 process.nextTick과 Promise microtask queue가 우선 실행됩니다. CPU 집약적 작업은 메인 스레드를 블로킹하므로 Worker Threads로 분리하며, worker_threads 모듈의 Worker 클래스를 사용합니다. TypeScript에서는 postMessage/onmessage의 데이터를 구조화된 복제 알고리즘으로 전달하므로 Transferable 타입과 SharedArrayBuffer를 활용한 타입 정의가 필요합니다.

핵심 포인트
  • • 이벤트 루프 6개 페이즈와 각 페이즈 간 microtask queue 우선 실행
  • • poll 페이즈에서 I/O 대기 및 콜백 실행, check 페이즈에서 setImmediate 처리
  • • Worker Threads로 CPU 집약 작업 분리하여 메인 스레드 블로킹 방지
  • • postMessage의 구조화된 복제와 Transferable 객체 타입 정의 필요
Follow-up 질문

Worker Threads와 Child Process의 차이점을 메모리 공유 관점에서 설명하고, 각각의 적합한 사용 사례를 제시해주세요.

4 데이터베이스
Hard

Q. PostgreSQL에서 MVCC(Multi-Version Concurrency Control) 메커니즘이 동시성을 보장하는 원리를 설명하고, TypeScript ORM(TypeORM, Prisma)을 사용할 때 트랜잭션 격리 수준(isolation level)에 따른 phantom read, non-repeatable read, dirty read 문제를 방지하는 방법을 설명해주세요. 특히 Serializable 격리 수준의 성능 트레이드오프를 포함해주세요.

A. 모범답안

MVCC는 각 트랜잭션이 스냅샷 시점의 데이터 버전을 읽어 lock 없이 동시 읽기/쓰기를 가능하게 하며, xmin/xmax 컬럼으로 버전을 관리합니다. Read Committed는 dirty read만 방지하고, Repeatable Read는 non-repeatable read까지, Serializable은 phantom read까지 방지합니다. TypeORM에서는 @Transaction 데코레이터와 isolation 옵션으로 격리 수준을 설정하며, Prisma는 $transaction의 두 번째 인자로 설정합니다. Serializable은 완전한 격리를 제공하지만 serialization failure로 인한 재시도 로직이 필요하고, lock contention으로 처리량이 감소합니다.

핵심 포인트
  • • MVCC는 스냅샷 기반 버전 관리로 lock 없는 동시성 제어 구현
  • • 격리 수준별 방지 범위: Read Committed < Repeatable Read < Serializable
  • • TypeORM @Transaction, Prisma $transaction으로 격리 수준 설정
  • • Serializable은 완전한 격리 제공하지만 serialization failure와 성능 저하 발생
Follow-up 질문

낙관적 락(Optimistic Locking)과 비관적 락(Pessimistic Locking)의 구현 방식과 각각의 적합한 사용 시나리오를 설명해주세요.

5 알고리즘
Hard

Q. 대규모 분산 시스템에서 일관된 해싱(Consistent Hashing)이 노드 추가/제거 시 데이터 재분배를 최소화하는 원리를 설명하고, TypeScript로 가상 노드(Virtual Node)를 구현하여 데이터 분포의 균등성을 보장하는 방법을 설명해주세요. 특히 해시 함수 선택 기준과 가상 노드 개수 결정 전략을 포함해주세요.

A. 모범답안

일관된 해싱은 해시 링 구조에서 키와 노드를 동일한 해시 공간에 배치하여, 노드 변경 시 K/N(전체 키/노드 수)만큼만 재배치되도록 합니다. 가상 노드는 물리 노드당 여러 개의 해시 포인트를 생성하여 데이터 분포 편향을 방지합니다. 해시 함수는 충돌이 적고 균등 분포를 보장하는 MD5나 MurmurHash를 사용하며, TypeScript에서는 crypto 모듈로 구현합니다. 가상 노드는 물리 노드당 100-200개가 적절하며, SortedMap이나 이진 탐색으로 O(log N) 조회를 구현합니다. 제네릭 타입으로 키와 노드의 타입 안전성을 보장합니다.

핵심 포인트
  • • 해시 링 구조로 노드 변경 시 K/N만큼만 재배치하여 최소화
  • • 가상 노드로 물리 노드당 다수 해시 포인트 생성하여 균등 분포 보장
  • • MD5/MurmurHash 등 균등 분포 해시 함수 사용, 가상 노드 100-200개 권장
  • • SortedMap 또는 이진 탐색으로 O(log N) 노드 조회 구현
Follow-up 질문

Rendezvous Hashing(HRW)과 Consistent Hashing의 차이점을 설명하고, 각각의 장단점과 적합한 사용 사례를 비교해주세요.

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!