수업 목표

  • 데이터베이스의 인덱스와 실행 계획을 이해하고, 이를 활용하여 쿼리 성능을 최적화하는 방법을 학습합니다.
  • 트랜잭션 전파 옵션, 롤백 전략, 외부 API 연동 및 예외 처리 기법을 학습하여 안정적이고 신뢰할 수 있는 트랜잭션 설계를 구현하실 수 있습니다. 

 

1일차. 인덱스 설계 및 활용

 데이터베이스 인덱스의 개념과 동작 원리를 이해하고, 이를 활용해 데이터 조회 성능을 최적화하는 방법을 배우게 됩니다. 인덱스의 주요 유형인 기본 인덱스, 복합 인덱스, 부분 인덱스, 커버링 인덱스에 대해 학습하며, WHERE, JOIN, ORDER BY 절과 인덱스의 관계를 파악합니다. 마지막으로, 인덱스가 적용된 쿼리와 적용되지 않은 쿼리의 성능을 비교하고, 효과적인 인덱스 설계와 실습을 통해 실무 적용 능력을 향상시킵니다.

 

대부분의 관계형 데이터베이스에서 인덱스는 B-Tree라는 구조를 기반으로 작동합니다. B-Tree는 자기 균형 트리(Self-balancing Tree)의 일종으로, 데이터의 삽입이나 삭제가 발생해도 트리의 높이를 일정하게 유지하여 항상 효율적인 검색 성능을 보장합니다.

 

인덱스 설계 전략: 데이터베이스 성능 최적화의 핵심

쿼리 조건에 적합한 인덱스 설계

  • 기본 원칙: 쿼리에서 가장 자주 사용되는 조건절에 맞는 인덱스를 설계해야 합니다.
  • 복합 인덱스 설계 시:
    • 카디널리티가 높은 컬럼을 인덱스의 가장 앞쪽에 배치하는 것이 일반적인 권장 사항입니다. 이는 인덱스가 가장 먼저 가장 많은 양의 데이터를 효과적으로 필터링할 수 있도록 돕습니다.
    • 예를 들어, (user_id, updated_at) 복합 인덱스에서 user_id의 카디널리티가 updated_at보다 훨씬 높다면, user_id를 먼저 두는 것이 좋습니다.

2. 페이징 처리 및 최적화 사례 실습

 

EXPLAIN SELECT * FROM products WHERE category_id = 500;

 

EXPLAIN 명령어를 실행하면 다양한 필드가 반환되며, 각각의 필드는 쿼리 실행 방식과 성능에 중요한 정보를 제공합니다.

  1. type (쿼리 실행 방법)
    • 쿼리의 성능에 가장 큰 영향을 미치는 필드로, 데이터 검색 방식을 나타냅니다.
    • 주요 값:
      • ALL:
        • 테이블의 모든 데이터를 탐색하는 Full Table Scan.
        • 성능이 가장 낮으며, 일반적으로 피해야 합니다.
      • index:
        • 테이블의 전체 인덱스를 탐색하며, 성능이 ALL보다 좋습니다.
      • range:
        • 범위를 지정하여 데이터를 검색합니다.
        • 주로 BETWEEN, >, < 같은 범위 조건에서 사용됩니다.
      • ref:
        • 인덱스를 사용하여 특정 값을 검색합니다.
        • 예: 외래 키나 WHERE 절의 조건으로 사용되는 경우.
      • eq_ref:
        • 고유한 값(Primary Key, Unique Key)을 기준으로 검색합니다.
        • 가장 효율적인 검색 방식 중 하나입니다.
      • const/system:
        • 단 하나의 행만 참조하며, 매우 빠른 검색 방식입니다.
  • OFFSET:
    • 데이터베이스에서 결과 집합의 시작 위치를 지정합니다.
    • 예: OFFSET 10은 11번째 행부터 결과를 반환.
  • LIMIT:
    • 결과 집합에서 반환할 최대 행 수를 지정합니다.
    • 예: LIMIT 10은 10개의 결과를 반환합니다.

 

OFFSET 값이 커질수록 쿼리 성능이 저하됩니다. 이는 데이터베이스가 불필요한 데이터를 스캔하고 버리는 작업을 수행하기 때문입니다.

 

 

3. 트랜잭션 전파 옵션

 

4. 롤백 전략과 외부 API 연동

  1. 잡한 트랜잭션 관리:
    • 대량 데이터를 처리하거나, 여러 작업이 반복적으로 수행되는 경우 일부 작업이 실패할 때 이미 커밋된 부분을 개별적으로 관리해야 하는 복잡성이 존재합니다.
    • 예시: 여러 상품에 대해 일괄 판매를 처리할 때, 일부 상품의 재고 부족으로 예외가 발생하면, 이미 처리된 다른 상품들의 재고 변경 여부를 개별적으로 검토하고 관리해야 할 수 있습니다.
  2. 재시도 대상 예외:
    • value 속성을 사용해 재시도 대상 예외를 지정합니다. 예제에서는 RemoteException이 발생하면 재시도를 수행합니다.
  3. 최대 재시도 횟수:
    • maxAttempts 속성을 통해 재시도를 몇 번 수행할지 설정합니다. 예제에서는 최대 3번까지 재시도를 수행합니다.
  4. 재시도 간격:
    • @Backoff 속성을 사용해 각 재시도 사이의 대기 시간을 설정합니다. 예제에서는 2초 간격으로 재시도를 수행합니다.
  5. 실패 처리:
    • 최대 재시도 횟수 내에서도 실패하면 최종적으로 RemoteException이 호출자에게 전달됩니다.

Spring Cloud FeignClient를 사용하는 경우, 타임아웃을 설정할 수 있습니다.

 

LIST

+ Recent posts