Interview

성능 이슈 해결 방법은?

DevOps Engineer 2025. 3. 17. 19:26
728x90

API 응답 속도 및 데이터베이스 성능 개선을 위한 방법은?

 

 

API 성능 최적화모니터링 → 병목 지점 분석 → 캐싱, 비동기 처리, 로드 밸런싱 적용으로 접근하며,
데이터베이스 최적화인덱싱, 샤딩, 쿼리 개선, 정규화 vs 비정규화 등을 고려하여 성능을 개선합니다.

 

 

API 응답 속도 저하와 데이터베이스 성능 문제는 모니터링 → 원인 분석 → 최적화의 단계적 접근 방식으로 해결합니다.

 

1️⃣ 특정 API 응답 속도가 느려졌다면 어떻게 디버깅하고 최적화할 것인가요?

(1) API 성능 저하 원인 분석 (Root Cause Analysis)

🔹 단계별 디버깅 프로세스

  1. 모니터링 및 로그 분석
    • Grafana, Prometheus, Datadog, AWS CloudWatch로 API 응답 시간 분석
    • ELK Stack (Elasticsearch, Logstash, Kibana) / Loki로 애플리케이션 로그 확인
    • 분산 트레이싱 (OpenTelemetry, Jaeger, AWS X-Ray) 활용하여 병목 구간 식별

예시:
"API 응답 시간이 500ms에서 2초 이상으로 증가한 경우, Prometheus에서 latency > 2s인 요청을 추적하고, Jaeger로 서비스 간 호출을 분석합니다."

  1. 서버 리소스 확인
    • CPU, 메모리 사용량 확인 (top, htop, Prometheus)
    • 네트워크 대역폭 문제 여부 확인 (AWS VPC Flow Logs, Netdata)
    • 디스크 I/O 확인 (iostat, vmstat)

예시:
"CPU 사용률이 90% 이상이면, HPA(Kubernetes Horizontal Pod Autoscaler)를 조정하여 인스턴스를 추가 확장합니다."

  1. API 요청 흐름 분석
    • Database Query Latency
    • 외부 API 호출 문제 여부 (HTTP Timeout, Third-Party API 지연)
    • 캐싱 적용 여부 확인

예시:
"API가 DB에서 데이터를 가져오는데 5초가 걸린다면, Slow Query를 분석하여 쿼리 최적화를 진행합니다."

 

(2) API 최적화 방법

  1. 캐싱 적용 (Redis, Memcached)
    • 반복되는 API 요청을 캐싱하여 데이터베이스 부하 감소
    • TTL(Time-To-Live) 설정으로 데이터 최신성 유지

예시:
"자주 조회되는 상품 목록 API는 Redis에 캐싱하여 API 응답 속도를 100ms 이하로 유지합니다."

  1. 비동기 처리 (Async Processing)
    • Queue (Kafka, RabbitMQ, SQS) 활용하여 백그라운드 작업 처리
    • **WebSocket, Server-Sent Events (SSE)**로 실시간 데이터 제공

예시:
"결제 완료 후 주문 확인 이메일 전송은 Kafka 이벤트로 처리하여 API 응답 속도를 단축합니다."

  1. Database Connection Pool 최적화
    • DB Connection Pool (HikariCP, PgBouncer) 사용하여 커넥션 재사용
    • DB Timeout 설정으로 과부하 방지

예시:
"HikariCP의 maximumPoolSize를 조정하여 동시 연결을 최적화합니다."

  1. Load Balancing & Auto Scaling 적용
    • AWS ALB, Nginx Reverse Proxy를 통해 부하 분산
    • Kubernetes HPA로 트래픽 증가 시 자동 확장

예시:
"트래픽 급증 시 Auto Scaling Group을 활용하여 EC2 인스턴스를 동적으로 증가시킵니다."

 

 

2️⃣ 데이터베이스 쿼리 성능을 개선해야 한다면 어떤 방법을 사용할 것인가요?

(1) 데이터베이스 성능 저하 원인 분석

  1. Slow Query 확인
    • MySQL → SHOW PROCESSLIST; / EXPLAIN ANALYZE
    • PostgreSQL → pg_stat_statements / EXPLAIN (ANALYZE, BUFFERS)
    • MongoDB → db.system.profile.find()

예시:
"MySQL EXPLAIN을 사용하여 특정 인덱스를 타지 않는 쿼리를 분석하고 최적화합니다."

  1. Locking & Deadlock 분석
    • Row Lock vs Table Lock 확인 (SHOW ENGINE INNODB STATUS;)
    • Deadlock 방지를 위해 트랜잭션 순서 조정

예시:
"INSERT 시 SELECT FOR UPDATE를 잘못 사용하여 Deadlock이 발생하는 경우, Optimistic Locking을 적용합니다."

 

(2) 데이터베이스 성능 최적화 전략

  1. 인덱스(Indexing) 최적화
    • B-Tree, Hash Index, Full-Text Index 활용
    • Covering Index로 쿼리 속도 개선

예시:
"자주 조회되는 order_id 컬럼에 인덱스를 추가하여 SELECT 성능을 5배 향상시켰습니다."

  1. 데이터베이스 샤딩 (Sharding)
    • User ID 기반 샤딩 → 데이터 균등 분배
    • Range Sharding vs Hash Sharding 비교 적용

예시:
"사용자 트랜잭션 데이터를 user_id % 10으로 10개의 샤드에 분산 저장하여 성능을 최적화합니다."

  1. 데이터 정규화 & 비정규화 선택
    • 정규화 → 데이터 중복 방지 (3NF, BCNF)
    • 비정규화 → JOIN 최소화하여 성능 개선

예시:
"실시간 조회 성능을 높이기 위해 User 테이블과 Order 테이블을 조인하는 대신, Order 테이블에 User 정보를 캐싱합니다."

  1. 쿼리 최적화 (Query Optimization)
    • JOIN 최적화 → Nested Loop 대신 Hash Join 사용
    • LIMIT / OFFSET 대신 Key-based Pagination 적용

예시:
"OFFSET 10000을 사용하는 대신, id > last_seen_id LIMIT 100 방식으로 Key-based Pagination을 적용하여 성능을 10배 향상시켰습니다."

 

 

 

 

728x90