2024.07.26.금.TIL 내일배움캠프 71일차 <최종프로젝트Day7>

김기남·2024년 7월 26일
post-thumbnail

안녕하세요, 오늘도 최종프로젝트 진행상황과 기술면접 준비내용을 정리해보았습니다.

대용량 트래픽 발생 시 어떻게 대응해야 하나요?

대용량 트래픽 발생 시 대응 방법은 시스템의 안정성과 성능을 유지하면서 사용자 경험을 보호하기 위해 매우 중요합니다. 아래는 대용량 트래픽 발생 시 효과적으로 대응하기 위한 주요 방법들입니다:

  1. 로드 밸런싱 (Load Balancing)
    정적 로드 밸런싱: 요청을 여러 서버에 고르게 분산하여 특정 서버에 부하가 집중되지 않도록 합니다.
    동적 로드 밸런싱: 실시간 트래픽 패턴을 모니터링하고 트래픽을 적절히 분배합니다.
  2. 스케일 아웃 (Scale Out)
    수평 확장: 서버를 추가하여 시스템의 처리 능력을 높입니다. 예를 들어, 더 많은 웹 서버나 데이터베이스 서버를 추가하는 방법입니다.
    오토 스케일링: 클라우드 서비스에서 제공하는 자동 확장 기능을 활용하여 트래픽 증가에 따라 자동으로 서버를 추가하거나 제거합니다.
  3. 캐싱 (Caching)
    웹 캐시: 자주 요청되는 데이터를 캐시 서버(예: Varnish, Squid)에 저장하여 응답 시간을 단축하고 서버 부하를 줄입니다.
    데이터베이스 캐싱: 데이터베이스 쿼리 결과를 Redis, Memcached와 같은 메모리 기반 캐시 시스템에 저장합니다.
  4. 콘텐츠 전송 네트워크 (CDN)
    CDN을 사용하여 전 세계적으로 분산된 서버를 통해 사용자에게 콘텐츠를 전달함으로써 네트워크 병목 현상을 줄이고 로드 타임을 단축시킵니다.
  5. 데이터베이스 최적화
    쿼리 최적화: 데이터베이스 쿼리를 최적화하여 성능을 향상시킵니다.
    인덱스 사용: 적절한 인덱스를 생성하여 검색 성능을 높입니다.
    데이터베이스 샤딩: 데이터를 여러 데이터베이스 서버에 분산 저장하여 부하를 분산시킵니다.
  6. 애플리케이션 최적화
    코드 최적화: 애플리케이션 코드를 최적화하여 성능을 향상시킵니다.
    비동기 처리: 비동기 작업을 도입하여 요청 응답 시간을 줄입니다.
    큐잉 시스템: RabbitMQ, Apache Kafka 같은 메시지 큐를 사용하여 트래픽을 관리하고 백그라운드 작업을 처리합니다.
  7. 모니터링 및 알림
    실시간 모니터링: 시스템 성능과 트래픽 패턴을 실시간으로 모니터링합니다.
    알림 설정: 트래픽 급증 시 관리자에게 알림을 보내는 시스템을 설정합니다.
  8. 성능 테스트
    부하 테스트: 정기적으로 부하 테스트를 수행하여 시스템이 대량의 트래픽을 어떻게 처리하는지 평가하고 문제를 사전에 발견합니다.
    스트레스 테스트: 극한 상황을 시뮬레이션하여 시스템의 한계를 테스트합니다.
    이러한 방법들을 조합하여 사용하면 대용량 트래픽 발생 시 시스템의 안정성을 유지하고 사용자 경험을 보호할 수 있습니다.

ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?

ORM(객체 관계 매핑)을 사용하면서 쿼리가 복잡해질 경우, 성능 최적화와 코드의 가독성을 위해 여러 가지 방법을 고려할 수 있습니다. 아래는 그 해결 방법들입니다:

  1. 원시 SQL 쿼리 사용
    ORM은 보통 복잡한 쿼리를 처리할 수 있는 기능을 제공하지만, 성능이 중요한 경우에는 원시 SQL 쿼리를 사용하여 직접 데이터베이스에 접근하는 것이 좋습니다.
    대부분의 ORM 프레임워크는 원시 SQL을 실행할 수 있는 메서드를 제공합니다.
  2. 뷰(View) 또는 저장 프로시저(Stored Procedure) 사용
    데이터베이스 뷰를 사용하여 복잡한 쿼리를 미리 정의하고, ORM에서 이 뷰를 간단히 조회할 수 있습니다.
    저장 프로시저를 작성하여 복잡한 로직을 데이터베이스 측에서 처리하고, ORM을 통해 호출할 수 있습니다.
  3. 쿼리 빌더(Query Builder) 사용
    ORM이 제공하는 쿼리 빌더를 사용하여 보다 유연하게 쿼리를 구성할 수 있습니다.
    쿼리 빌더를 사용하면 복잡한 쿼리를 단계적으로 작성하고 재사용하기 쉽습니다.
  4. 적절한 인덱스 사용
    데이터베이스 테이블에 적절한 인덱스를 추가하여 쿼리 성능을 향상시킵니다.
    쿼리가 느리게 실행된다면 실행 계획을 분석하여 인덱스가 필요한 부분을 찾아 추가합니다.
  5. 로딩 전략 최적화
    지연 로딩(Lazy Loading): 필요한 데이터만 로딩하여 불필요한 데이터 로딩을 방지합니다.
    즉시 로딩(Eager Loading): 한 번의 쿼리로 연관된 데이터를 모두 로딩하여 쿼리 수를 줄입니다.
  6. 데이터베이스 정규화 및 비정규화
    데이터 모델을 정규화하여 중복 데이터를 제거하고, 필요한 경우 비정규화를 통해 쿼리 성능을 향상시킵니다.
    예를 들어, 자주 조회되는 데이터를 미리 계산하여 테이블에 저장하거나, 테이블을 분할하여 성능을 개선합니다.
  7. 캐싱
    자주 조회되는 데이터를 캐시하여 데이터베이스 쿼리 수를 줄입니다.
    애플리케이션 레벨 캐싱(예: Redis, Memcached)과 데이터베이스 레벨 캐싱을 고려합니다.
  8. 서브쿼리 최적화
    서브쿼리를 사용하는 경우, IN 절보다는 JOIN을 사용하여 성능을 향상시킵니다.
    필요하다면 서브쿼리를 제거하고 메인 쿼리로 통합합니다.
  9. 데이터베이스 샤딩 및 파티셔닝
    데이터베이스를 샤딩 또는 파티셔닝하여 쿼리 부하를 분산시킵니다.
    큰 테이블을 작은 단위로 분할하여 쿼리 성능을 개선합니다.
  10. ORM 성능 도구 활용
    ORM에서 제공하는 성능 분석 도구나 로깅 기능을 활용하여 쿼리 성능을 분석하고 최적화할 부분을 찾습니다.
    예를 들어, Django의 debug toolbar나 SQLAlchemy의 profiling 툴 등을 사용할 수 있습니다.
    이 방법들을 조합하여 복잡한 쿼리를 최적화하고, 성능과 유지보수성을 모두 향상시킬 수 있습니다.

최종프로젝트

진행상황공유
2차코딩
프론트세팅시작
깃충돌해결

profile
새로운 시작~!

0개의 댓글