Part 2 · 알고리즘9 분 읽기

알고리즘: 사용자가 늘어도 코드가 버틸지 가늠하는 법

빅오, 이진 탐색, 재귀를 코딩 테스트 이론이 아니라 데이터와 사용자가 늘어날 때 코드가 버틸지 예측하는 도구로 설명합니다.

게시일: 2026년 6월 24일최종 업데이트: 2026년 6월 26일

알고리즘은 문제를 푸는 절차입니다.

조금 추상적으로 들리니 요리로 생각해봅시다. 알고리즘은 레시피입니다. 같은 요리도 엉성한 레시피와 깔끔한 레시피가 있습니다. 한 명 먹일 때는 둘 다 될 수 있습니다. 손님이 몰리는 식당에서는 하나만 살아남습니다.

실무에서 중요한 질문은 "이 코드가 코딩 테스트를 통과하나?"가 아닙니다.

더 쓸모 있는 질문은 이것입니다.

데이터가 늘어나면 무슨 일이 생기나?

빅오: 미래의 병목을 예측하는 도구

빅오(Big O)는 입력이 늘어날 때 작업량이 어떻게 늘어나는지 표현합니다.

데이터가 10개일 때는 거의 모든 코드가 빨라 보입니다. 데이터가 1,000,000개가 되면 증가 패턴이 중요해집니다.

O(1)상수 시간

바로 꺼냅니다. 크기가 거의 상관없습니다.

O(log n)로그 시간

검색 범위를 계속 절반으로 줄입니다.

O(n)선형 시간

모든 항목을 한 번씩 봅니다.

O(n log n)효율적 정렬

실무적인 정렬 알고리즘에서 자주 봅니다.

O(n²)제곱 시간

모든 항목을 모든 항목과 비교합니다.

O(1) O(log n) O(n) O(n²) 1,000,000 1,000 ~10 1 작업량 (n=1,000 기준)
O(1) — 상수 O(log n) — 로그 O(n) — 선형 O(n²) — 제곱

데이터 1,000개의 감각

복잡도일상 비유1,000개일 때 대략 작업량예시
O(1)이름표로 사물함 바로 열기1해시맵 조회
O(log n)사전을 가운데부터 펴서 좁히기10이진 탐색
O(n)줄 선 사람을 한 명씩 확인1,000배열 전체 훑기
O(n log n)카드를 효율적으로 정렬10,000병합 정렬 / 퀵 정렬
O(n²)모든 사람을 모든 사람과 비교1,000,000같은 목록에 대한 중첩 반복문

O(n²)이 무서운 이유는 수학 기호 때문이 아닙니다. 데이터가 10배 늘면 작업량이 100배 늘 수 있기 때문입니다.

이진 탐색: 사전을 펴는 우아한 방법

종이 사전에서 "오징어"를 찾는다고 해봅시다.

첫 페이지부터 넘기지 않을 겁니다. 가운데를 펴고, 찾는 단어가 앞쪽인지 뒤쪽인지 판단한 뒤, 남은 범위를 다시 절반으로 줄입니다.

이게 이진 탐색(Binary Search)입니다.

정렬된 데이터에서만 쓸 수 있다는 조건이 있습니다. 하지만 쓸 수 있을 때는 강력합니다. 매번 문제 크기가 절반으로 줄기 때문입니다.

이진 탐색은 이런 곳에 나옵니다.

  • 정렬된 데이터에서 항목 찾기.
  • 시간 범위 검색.
  • 기준값 찾기.
  • "작동하는 가장 작은 값은 무엇인가?" 같은 최적화 질문.

재귀: 같은 문제 안의 같은 문제

재귀(Recursion)는 함수가 자기 자신을 다시 부르는 구조입니다.

친숙한 비유는 러시아 인형입니다. 인형을 열면 더 작은 같은 모양의 인형이 나오고, 또 열면 같은 패턴이 반복됩니다. 가장 작은 인형에서 멈춥니다.

재귀는 같은 모양이 내부에 반복되는 데이터에 잘 맞습니다.

  • 폴더 안의 폴더.
  • 답글이 달린 댓글.
  • 서브메뉴가 있는 메뉴.
  • 조직도.
  • 트리 탐색.

핵심은 멈추는 조건입니다. 멈추는 조건이 없으면 인형을 영원히 열게 됩니다.

빌더에게 실제로 필요한 것

제품을 만들기 전에 모든 알고리즘을 외울 필요는 없습니다.

하지만 이 패턴은 알아야 합니다.

  • 반복해서 전체를 훑는 것보다 바로 조회하는 편이 나은 경우가 많습니다.
  • 한 번 정렬해두면 반복 검색이 빨라질 수 있습니다.
  • 커지는 데이터에 대한 중첩 반복문은 의심해야 합니다.
  • 트리와 중첩 구조에는 재귀가 자연스럽습니다.
  • 추측보다 측정이 낫습니다.

AI가 만든 앱에서 자주 보이는 문제

AI는 프롬프트 안의 작은 예시 데이터에는 맞는 코드를 잘 씁니다. 문제는 예시 데이터가 보통 아주 작다는 것입니다.

주의할 패턴:

  1. 전체 스캔 반복 데이터가 바뀔 때마다 전체 목록, 전체 테이블, 전체 문서를 다시 훑습니다.

  2. 중첩 반복문 모든 사용자를 모든 게시물과 비교하거나, 모든 문서를 모든 문서와 비교합니다.

  3. 느린 조회 ID 검색을 매번 array.find()로 처리하고, Map, Set, 인덱스를 쓰지 않습니다.

  4. 불필요한 전체 정렬 상위 10개만 필요한데 전체 데이터를 매번 정렬합니다.

  5. pagination 부재 필요한 일부만 보여주면 되는데 모든 레코드를 한 번에 가져옵니다.

  6. 데이터베이스 인덱스 부재 검색, 정렬, 날짜 필터, 상태 필터에 인덱스 없이 쿼리를 실행합니다.

  7. N+1 쿼리(목록 1번 + 항목별 N번 쿼리) 목록 하나를 가져온 뒤 각 행마다 데이터베이스 쿼리를 따로 보냅니다.

  8. 브라우저 후처리 과다 데이터베이스에서 필터링하지 않고 모든 데이터를 가져온 뒤 브라우저에서 걸러냅니다.

  9. 렌더링마다 비싼 계산 groupBy, 차트 데이터 생성, 마크다운 파싱, 날짜 포맷팅을 렌더링마다 반복합니다.

  10. 이벤트 폭주 검색 입력, 스크롤, 화면 크기 변경 이벤트마다 디바운스/스로틀(debounce/throttle, 너무 잦은 실행을 제한하는 기법) 없이 계산이나 API 호출을 실행합니다.

  11. 캐시/메모이제이션 부재 같은 계산, 같은 API 응답, 같은 AI 결과, 같은 임베딩을 매번 다시 만듭니다.

  12. 묶음/병렬 처리 부재 여러 API 호출, AI 호출, 이미지 처리, 이메일 분류를 하나씩 순서대로 처리합니다.

  13. 큐 없는 긴 작업 PDF 분석, 대량 내보내기, AI 분석, 파일 처리 같은 긴 작업을 요청-응답 흐름 안에서 처리합니다.

  14. AI/RAG 비효율 모든 문서를 프롬프트에 넣거나, 임베딩을 매번 만들거나, 검색 결과를 순위 조정 없이 그대로 사용합니다.

    RAG(Retrieval-Augmented Generation)는 관련 문서를 먼저 찾아 AI 답변의 근거로 넣는 방식입니다.

  15. 대용량 처리 방식 부재 큰 CSV, JSON, 이미지, 로그, 내보내기 파일을 스트리밍 없이 메모리에 한 번에 올립니다.

자주 묻는 질문

빅오 표기법은 무엇인가요?

빅오 표기법은 입력이 늘어날 때 알고리즘이 얼마나 많은 작업을 하는지 표현합니다. 데이터가 커졌을 때 코드가 빠르게 유지될지 물러질지 예측하는 데 씁니다.

이진 탐색은 무엇에 쓰이나요?

정렬된 데이터에서 원하는 항목을 찾을 때 씁니다. 검색 범위를 반으로 계속 줄여가므로 모든 항목을 하나씩 확인하는 것보다 훨씬 빠릅니다.

알고리즘 성능은 언제 걱정해야 하나요?

늘어나는 데이터에 대한 중첩 반복문, 반복되는 전체 스캔, 레코드 수가 늘어날수록 눈에 띄게 느려지는 연산이 있을 때 걱정해야 합니다.

재귀는 무엇에 좋나요?

같은 모양이 납부에 반복되는 문제에 좋습니다. 폴다 안의 폴다, 댓글의 답글, 트리 탐색 등이 예시입니다.

AI가 만든 코드에서 느린 알고리즘은 어떻게 찾나요?

반복되는 array.find, array.filter, 같은 리스트에 대한 중첩 반복문, 작은 결과를 위해 전체를 정렬하는 코드, 반복문 안의 데이터베이스 쿼리를 찾으세요.

핵심 정리

알고리즘은 퍼즐 기술이 아닙니다. 오늘 작동하는 데모가 내일 느린 제품이 될지 예측하는 방법입니다.

목표는 모든 풀이를 아는 것이 아닙니다. 데이터가 커질 때 문제가 달라지는 순간을 알아차리는 것입니다.

저자 소개

송재희

송재희

포춘 500대 기업을 위한 데이터 시스템을 구축한 20년 이상의 경력을 가진 엔터프라이즈 데이터 플랫폼 아키텍트. 바이브 코딩과 AI 개발을 수백 명의 학생에게 가르친 AI 개발 교육자. 한국 기술 스타트업이 미국 시장을 navigating하도록 돕는 Seattle Partners의 창립자.

AI 개발 가이드 저자