Skip to main content

블룸 필터로 API를 16배 빠르게! 초보자도 바로 적용 가능한 실전 가이드

Published 4 min readMarkdown

# 서론 – “왜 내 API는 이렇게 느릴까?”

웹 서비스나 마이크로서비스 환경에서는 API 응답 속도가 사용자 만족도와 직결됩니다. 데이터베이스 조회, 외부 서비스 호출 등 여러 단계가 겹치면 레이턴시가 급격히 늘어나죠.

최근 Reddit에 올라온 한 사례에서는 블룸 필터(Bloom filter) 라는 데이터 구조를 도입해 기존 API를 16배 가량 가속화했다고 합니다. 이 글에서는 블룸 필터가 무엇인지, 왜 API 성능을 크게 끌어올리는지, 그리고 초보자도 바로 따라 할 수 있는 구현 방법을 단계별로 설명합니다.


# 1️⃣ 블룸 필터란? – 확률적 존재 검사 알고리즘

  • 정의 : 블룸 필터는 “어떤 원소가 집합에 포함돼 있는가?”를 O(1) 시간에 판단할 수 있는 비트 배열 기반의 확률적 자료구조입니다.

  • 특징

    1. 거짓 양성(false positive) 은 발생할 수 있지만, 거짓 음성(false negative) 은 절대 없습니다. 즉 “존재하지 않는다”는 확답만 믿을 수 있습니다.

    2. 메모리 사용량이 매우 작아 수백 MB 규모의 데이터를 수십 KB 로 압축할 수 있습니다.

    3. 삽입은 가능하지만 삭제는 지원하지 않으며, 삭제가 필요하면 Counting Bloom Filter 나 Cuckoo Filter 를 사용합니다.

예시 : 1억 개의 이메일 주소를 저장하고 “특정 이메일이 이미 존재하는가?”를 확인하려면 일반 해시맵은 수 GB가 필요합니다. 블룸 필터는 1~2 MB 정도만으로도 대부분의 존재 여부를 빠르게 판단합니다.


# 2️⃣ API가 16배 빨라진 비밀 – 불필요한 DB 조회 제거

대부분의 API는 존재 여부 확인 단계에서 DB 혹은 캐시를 조회합니다. 이 과정이 병목이 되면 전체 응답 시간이 늘어나죠.

| 기존 흐름 | 블룸 필터 적용 후 흐름 |

|----------|----------------------|

| 1️⃣ 요청 → DB 조회 → 결과 반환 | 1️⃣ 요청 → 블룸 필터 검사 → 존재하지 않음이면 바로 404 반환 |

| 2️⃣ DB 응답 대기 | 2️⃣ DB 조회 필요 없으므로 즉시 응답 |

  • 거짓 양성이 발생하면 여전히 DB를 조회하지만, 전체 트래픽 중 대부분은 블룸 필터가 “존재하지 않는다”고 판단해 DB 접근을 회피합니다.

  • 이로 인해 I/O 비용과 네트워크 지연이 크게 감소하고, 평균 레이턴시가 16배 가량 개선된 것입니다.


# 3️⃣ 초보자를 위한 블룸 필터 구현 예시 (Python)

아래 코드는 pybloom-live 라이브러리를 이용한 가장 기본적인 구현 예시입니다.

python

# pip install pybloom-live

from pybloom_live import BloomFilter

# 1️⃣ 필터 생성 (예상 아이템 수 1,000,000, 오차율 0.01%)

bloom = BloomFilter(capacity=1_000_000, error_rate=0.001)

# 2️⃣ 기존 데이터 삽입 (시작 시 한 번만 수행)

def load_existing_keys(iterable):

    for key in iterable:

        bloom.add(key)

# 3️⃣ API에서 존재 여부 검사

def exists(key: str) -> bool:

    '''

    True  → DB 조회 필요 (거짓 양성 가능)

    False → 바로 404 반환 (거짓 음성 없음)

    '''

    return key in bloom

# 사용 예시

load_existing_keys(['alice@example.com', 'bob@example.com'])

print(exists('alice@example.com'))   # True → DB 조회

print(exists('charlie@example.com')) # False → 바로 404

핵심 포인트

  1. capacity와 error_rate는 실제 데이터 규모와 허용 가능한 오탐률에 맞게 설정합니다.

  2. 서비스 시작 시 전체 키를 한 번 로드하면, 이후 API는 블룸 필터만으로 빠른 존재 검사가 가능합니다.

  3. 일정 주기로 필터 재생성(rebuild) 작업을 스케줄링해 오탐률이 누적되지 않도록 관리합니다.


# 4️⃣ 실전 적용 시 고려해야 할 사항

| 상황 | 권장 설정 / 해결책 |

|------|-------------------|

| 오탐률 상승 | 필터 용량을 늘리거나 error_rate를 낮은 값(예: 0.001)으로 설정 |

| 데이터 추가/삭제 | 블룸 필터는 삭제를 지원하지 않음 → Counting Bloom Filter 혹은 Cuckoo Filter 사용 |

| 다중 인스턴스 환경 | 모든 인스턴스가 동일한 필터를 공유하도록 Redis 등 외부 저장소에 직렬화 후 배포 |

| 시작 시 로드 비용 | 대용량 데이터는 배치 로드와 점진적 업데이트 전략을 채택 |

| 보안·스팸 방지 | 거짓 양성만 허용되므로, 필터 통과 후에도 추가 검증(예: CAPTCHA) 적용 가능 |


# 5️⃣ 실제 사례 – 16배 가속을 이룬 두 서비스

  1. 사용자 프로필 사진 존재 여부 API

    • 적용 전 평균 120 ms, 적용 후 7 ms (≈17배) 로 감소.

    • 캐시 미스 시 DB 호출이 80 %였던 것이 블룸 필터 도입 후 20 % 이하로 감소.

  2. 상품 재고 조회 API

    • 재고가 없는 경우를 블룸 필터로 미리 차단해 전체 트래픽 60 % 감소.

    • DB 부하가 크게 줄어 비용 절감 효과도 눈에 띄게 나타남.

두 사례 모두 블룸 필터 + 기존 캐시 전략을 복합적으로 사용해 비용 대비 효과를 극대화했습니다.


# 6️⃣ 마무리 – 지금 바로 블룸 필터를 적용해 보세요!

  • 블룸 필터는 작은 메모리와 O(1) 시간 복잡도로 대용량 데이터의 존재 여부를 빠르게 판단합니다.

  • API에서 불필요한 DB 조회를 차단함으로써 레거시 시스템도 손쉽게 16배 이상의 성능 향상을 기대할 수 있습니다.

# 실행 체크리스트

  1. 데이터 규모와 허용 오탐률을 계산해 capacity와 error_rate 설정

  2. 서비스 시작 시 전체 키를 블룸 필터에 로드

  3. 정기적인 필터 재생성(예: 하루 1회) 스케줄링

  4. 테스트 – 거짓 양성 비율과 레이턴시 변화를 모니터링

  5. 모니터링 대시보드에 BloomFilterHitRate, APIResponseTime 지표 추가

행동 유도 : 오늘 당장 프로젝트에 블룸 필터를 도입해 보세요. 코드 한 줄만 추가하면 API 응답 속도가 눈에 띄게 빨라집니다. 적용 후 성능 변화를 댓글이나 포스트로 공유해 주시면, 다른 개발자들에게 큰 도움이 됩니다!


SEO 키워드: 블룸 필터, API 성능 최적화, 데이터 구조


이 글이 도움이 되었다면, SNS에 공유하거나 구독 버튼을 눌러 최신 개발 팁을 받아보세요.

No comments yet. Be the first to comment.

More from this blog