자료구조/알고리즘 리드·아키텍트 기술면접

자료구조/알고리즘 리드 · 아키텍트 (10년+) 종합 7문항 조회수 38 · 2026-08-04 (화) 15:13:10
1 시스템 설계
Hard

Q. 월간 10억 건의 이벤트를 처리하는 실시간 순위 시스템을 설계해야 합니다. 사용자들은 실시간으로 상위 100위 랭킹을 조회하며, 점수 업데이트는 초당 10만 건 발생합니다. 어떤 자료구조와 아키텍처 전략을 선택하시겠습니까?

실시간 쓰기와 읽기의 트레이드오프, 그리고 정확도와 성능 사이의 균형을 고려해보세요.

A. 모범답안

Redis Sorted Set을 메인 자료구조로 사용하되, 쓰기 부하 분산을 위해 Sharding 전략을 적용합니다. 실시간 업데이트는 ZINCRBY로 처리하고, ZREVRANGE로 상위 100위를 조회합니다. 초당 10만 건의 업데이트를 감당하기 위해 Write-Behind 캐싱 패턴을 적용하여 배치로 묶어 처리하고, 읽기는 별도의 Read Replica에서 처리합니다. 완벽한 실시간 정확도 대신 eventual consistency를 허용하여 성능을 확보하며, 주기적으로 백그라운드에서 정합성을 검증합니다. 장애 대응을 위해 데이터는 Redis Persistence와 별도 DB에 이중화하고, Circuit Breaker 패턴으로 장애 전파를 방지합니다.

핵심 포인트
  • • Redis Sorted Set을 활용한 효율적인 순위 관리
  • • Write-Behind 패턴과 배치 처리로 쓰기 부하 분산
  • • Read Replica 분리와 Eventual Consistency 허용
  • • Sharding과 Circuit Breaker를 통한 확장성과 안정성 확보
답변에 넣으면 좋은 키워드
Sorted Set Sharding Write-Behind Eventual Consistency Circuit Breaker Read Replica
실무에서는

게임 리더보드, 실시간 검색어 순위, 소셜 미디어 인기 콘텐츠 랭킹 시스템에서 활용됩니다.

Follow-up 질문

만약 정확한 실시간 순위가 필수 요구사항이라면 아키텍처를 어떻게 변경하시겠습니까?

2 인성·컬처핏
Medium

Q. 레거시 시스템을 마이그레이션하는 과정에서 개발팀과 비즈니스팀 간 우선순위 갈등이 발생한 경험을 말씀해주세요. 어떻게 조율하셨나요?

이해관계자 간 합의 도출 과정과 데이터 기반 의사결정 방식을 중심으로 설명해보세요.

A. 모범답안

STAR 방식으로 답변을 구성합니다. Situation: 레거시 전환 시 개발팀은 기술부채 해소를, 비즈니스팀은 신규 기능 출시를 우선시한 상황을 설명합니다. Task: 양측의 요구를 모두 충족하면서 프로젝트를 성공시켜야 했던 과제를 명확히 합니다. Action: 각 요구사항의 비즈니스 임팩트와 기술 리스크를 정량화하여 우선순위 매트릭스를 작성하고, Strangler Fig 패턴을 제안하여 점진적 전환과 기능 개발을 병행할 수 있는 로드맵을 제시했던 구체적 행동을 설명합니다. Result: 합의된 일정과 달성한 성과(예: 3개월 내 핵심 기능 이전 완료, 기술부채 40% 감소)를 수치로 제시하고, 이 경험을 통해 배운 이해관계자 관리 원칙을 언급합니다.

핵심 포인트
  • • STAR 구조로 체계적인 답변 구성
  • • 정량적 데이터를 활용한 의사결정 과정
  • • 기술과 비즈니스 요구사항의 균형점 찾기
  • • 구체적인 성과 지표와 학습한 교훈 제시
답변에 넣으면 좋은 키워드
이해관계자 관리 우선순위 매트릭스 Strangler Fig 점진적 마이그레이션 정량적 분석 합의 도출
실무에서는

기술 리더는 기술적 판단뿐 아니라 비즈니스 가치를 이해하고 조율하는 능력이 필수적입니다.

Follow-up 질문

만약 양측이 타협하지 않는 상황이었다면 최종 결정을 어떻게 내리셨을까요?

3 알고리즘 설계
Hard

Q. 대규모 분산 시스템에서 중복 데이터를 효율적으로 탐지해야 합니다. 1억 개의 URL을 메모리 제약 하에서 처리해야 할 때, 어떤 알고리즘과 자료구조를 선택하고 그 이유는 무엇입니까?

완벽한 정확도와 메모리 효율성 사이의 트레이드오프를 고려해보세요.

A. 모범답안

Bloom Filter를 1차 필터로 사용하여 메모리를 획기적으로 절약합니다. Bloom Filter는 False Positive는 허용하지만 False Negative가 없어 중복 가능성이 있는 항목만 추려낼 수 있습니다. 1억 개 URL에 대해 1% 오탐률을 목표로 하면 약 120MB의 메모리만 필요합니다. Bloom Filter에서 중복 의심 판정이 나온 경우에만 Redis Set이나 Database로 2차 검증을 수행하여 정확도를 보장합니다. 시스템이 분산되어 있다면 Consistent Hashing으로 URL을 여러 노드에 분산하여 각 노드가 독립적으로 Bloom Filter를 유지하게 합니다. 주기적으로 Bloom Filter를 초기화하거나 Counting Bloom Filter를 사용하여 삭제 연산도 지원할 수 있습니다.

핵심 포인트
  • • Bloom Filter의 확률적 자료구조 특성과 메모리 효율성
  • • False Positive 허용을 통한 실용적 트레이드오프
  • • 2단계 검증 전략으로 정확도 보장
  • • 분산 환경에서의 Consistent Hashing 활용
답변에 넣으면 좋은 키워드
Bloom Filter False Positive Consistent Hashing 확률적 자료구조 메모리 효율성 2단계 검증
실무에서는

웹 크롤러의 중복 URL 필터링, 스팸 메일 탐지, 캐시 시스템의 중복 요청 처리에서 활용됩니다.

Follow-up 질문

Bloom Filter 대신 HyperLogLog를 사용할 수 있는 상황은 언제이며, 어떤 차이가 있습니까?

4 성능 최적화
Hard

Q. 프로덕션 환경에서 특정 API의 응답 시간이 평소 50ms에서 갑자기 5초로 증가했습니다. 데이터베이스 쿼리는 정상이고 CPU/메모리 사용률도 정상 범위입니다. 어떤 순서로 원인을 진단하고 해결하시겠습니까?

네트워크 계층과 애플리케이션 계층 사이의 숨겨진 병목 지점을 생각해보세요.

A. 모범답안

먼저 APM 도구로 분산 트레이싱을 확인하여 어느 구간에서 지연이 발생하는지 파악합니다. DB와 CPU가 정상이라면 Connection Pool 고갈, Thread Pool 포화, 외부 API 타임아웃 등을 의심합니다. Connection Pool 모니터링으로 Active/Idle 커넥션 수를 확인하고, 만약 Pool이 고갈되었다면 Long-running query나 커넥션 미반환 코드를 찾습니다. Thread Dump를 분석하여 BLOCKED 상태의 스레드가 많다면 동기화 이슈나 Deadlock을 확인합니다. 외부 서비스 호출이 있다면 Circuit Breaker 미적용으로 인한 Cascading Failure를 점검하고, 타임아웃 설정을 검토합니다. 근본 원인 파악 후 즉시 Connection Pool 크기 조정, 타임아웃 설정, Circuit Breaker 적용 등으로 해결하고, 재발 방지를 위해 알림 임계값을 설정합니다.

핵심 포인트
  • • 분산 트레이싱을 통한 병목 구간 특정
  • • Connection Pool과 Thread Pool 상태 모니터링
  • • 외부 의존성의 Cascading Failure 가능성 점검
  • • 즉각적인 조치와 재발 방지 체계 구축
답변에 넣으면 좋은 키워드
분산 트레이싱 Connection Pool Thread Dump Circuit Breaker Cascading Failure APM
실무에서는

마이크로서비스 환경에서 한 서비스의 장애가 전체 시스템으로 전파되는 것을 방지하는 핵심 패턴입니다.

Follow-up 질문

Circuit Breaker 패턴의 구체적인 동작 방식과 상태 전환 조건을 설명해주세요.

5 자료구조 설계
Hard

Q. LRU Cache를 Thread-Safe하게 구현해야 합니다. HashMap과 Doubly Linked List를 사용하는 기본 구현에서 동시성 환경의 성능을 최대화하기 위한 전략과 트레이드오프를 설명해주세요.

전체 자료구조를 하나의 락으로 보호하는 것보다 더 세밀한 동기화 전략을 고려해보세요.

A. 모범답안

기본적으로 ReentrantReadWriteLock을 사용하여 읽기는 동시에, 쓰기는 배타적으로 처리할 수 있지만 이것만으로는 부족합니다. 더 나은 방법은 Segment 단위로 락을 분리하는 Lock Striping 기법을 적용하여 ConcurrentHashMap처럼 동시성을 높이는 것입니다. 각 세그먼트가 독립적인 LRU 리스트를 유지하면 서로 다른 세그먼트에 대한 접근은 동시에 처리됩니다. 또 다른 접근은 Lock-Free 알고리즘을 사용하는 것으로, CAS(Compare-And-Swap) 연산으로 Linked List 조작을 원자적으로 수행하지만 구현 복잡도가 매우 높습니다. 실무에서는 Caffeine 라이브러리처럼 W-TinyLFU 알고리즘을 사용하여 LRU보다 나은 hit rate와 동시성을 모두 확보하는 방법도 고려할 수 있습니다. 트레이드오프는 구현 복잡도, 메모리 오버헤드, 그리고 정확한 LRU 순서 보장 여부입니다.

핵심 포인트
  • • ReadWriteLock과 Lock Striping을 통한 동시성 향상
  • • 세그먼트 단위 분리로 락 경합 최소화
  • • Lock-Free 알고리즘의 장단점 이해
  • • W-TinyLFU 등 대안 알고리즘 고려
답변에 넣으면 좋은 키워드
ReentrantReadWriteLock Lock Striping CAS ConcurrentHashMap W-TinyLFU 동시성 제어
실무에서는

고성능 캐시 시스템, 데이터베이스 버퍼 풀, CDN 엣지 서버 등에서 핵심적으로 사용됩니다.

Follow-up 질문

Lock Striping을 적용할 때 세그먼트 개수를 결정하는 기준은 무엇입니까?

6 데이터베이스 아키텍처
Hard

Q. 시계열 데이터를 저장하는 시스템에서 쓰기는 초당 100만 건, 조회는 최근 7일 데이터에 집중됩니다. RDBMS 기반으로 설계할 때 테이블 파티셔닝, 인덱싱, 데이터 보관 전략을 어떻게 수립하시겠습니까?

Hot Data와 Cold Data의 분리, 그리고 쓰기 성능과 조회 성능의 균형을 고려해보세요.

A. 모범답안

Range Partitioning을 일 단위로 적용하여 매일 새로운 파티션을 생성하고, 오래된 파티션은 별도 스토리지로 이동하거나 압축합니다. 최근 7일 데이터(Hot Data)는 SSD 기반 스토리지에, 그 이전 데이터(Cold Data)는 저렴한 HDD나 Object Storage에 보관합니다. 인덱스는 timestamp + entity_id 복합 인덱스를 생성하되, 파티션별로 Local Index를 유지하여 인덱스 크기를 제한합니다. 쓰기 성능을 위해 Bulk Insert와 배치 처리를 활용하고, WAL(Write-Ahead Log) 설정을 최적화합니다. 조회 성능을 위해 최근 7일 데이터는 Materialized View나 Summary Table로 사전 집계하여 제공합니다. 파티션 관리는 자동화하여 매일 새 파티션 생성, 7일 이전 파티션 아카이빙, 90일 이전 파티션 삭제 등을 스케줄링합니다.

핵심 포인트
  • • Range Partitioning을 통한 데이터 생명주기 관리
  • • Hot/Cold Data 분리와 스토리지 계층화
  • • Local Index와 Materialized View 활용
  • • 자동화된 파티션 관리 프로세스 구축
답변에 넣으면 좋은 키워드
Range Partitioning Hot Data Cold Data Local Index Materialized View 데이터 아카이빙
실무에서는

IoT 센서 데이터, 애플리케이션 로그, 금융 거래 내역, 모니터링 메트릭 저장 시스템에서 활용됩니다.

Follow-up 질문

RDBMS 대신 InfluxDB나 TimescaleDB 같은 전문 시계열 DB를 선택하는 기준은 무엇입니까?

7 알고리즘 복잡도 분석
Medium

Q. 대규모 그래프에서 최단 경로를 찾아야 할 때, Dijkstra 알고리즘의 시간 복잡도를 개선할 수 있는 방법들과 각각의 적용 조건을 설명해주세요.

우선순위 큐의 구현 방식과 그래프의 특성에 따라 최적화 방법이 달라집니다.

A. 모범답안

기본 Dijkstra는 인접 리스트와 Binary Heap을 사용하면 O((V+E)logV)이지만, Fibonacci Heap을 사용하면 O(E + VlogV)로 개선됩니다. 그러나 Fibonacci Heap은 구현 복잡도와 상수 계수가 커서 실무에서는 Binary Heap이 더 효율적인 경우가 많습니다. 그래프가 sparse하다면(E가 V^2보다 훨씬 작음) 인접 리스트가, dense하다면 인접 행렬이 유리합니다. A* 알고리즘을 사용하면 휴리스틱 함수로 탐색 공간을 줄여 실제 수행 시간을 크게 단축할 수 있습니다. 양방향 탐색(Bidirectional Search)을 적용하면 탐색 공간이 절반으로 줄어듭니다. 실시간 경로 탐색이 필요하다면 Contraction Hierarchies나 Highway Hierarchies 같은 전처리 기반 알고리즘을 사용하여 쿼리 시간을 밀리초 단위로 줄일 수 있지만, 그래프 변경 시 재계산 비용이 큽니다.

핵심 포인트
  • • 자료구조 선택에 따른 시간 복잡도 차이 이해
  • • 그래프 특성(sparse/dense)에 따른 최적화
  • • A* 알고리즘과 양방향 탐색의 실용적 개선
  • • 전처리 기반 알고리즘의 트레이드오프
답변에 넣으면 좋은 키워드
Dijkstra Fibonacci Heap A* 알고리즘 양방향 탐색 Contraction Hierarchies 시간 복잡도
실무에서는

지도 내비게이션, 네트워크 라우팅, 물류 최적화, 소셜 네트워크 분석 등에서 핵심적으로 사용됩니다.

Follow-up 질문

음수 가중치가 있는 그래프에서는 어떤 알고리즘을 선택해야 하며, 그 이유는 무엇입니까?

댓글 0

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

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