600===Dev AWS/ElasticSearch

🔍Elasticsearch: 강력한 검색 엔진의 모든 것!

블로글러 2024. 10. 30. 23:15
                      " "
               ' ' ' ' ' ' ' ' '
             ' ' ' ' ' ' ' ' ' ' '
           ' ' ' ' ' ' ' ' ' ' ' ' '
          ' ' ' ' ' ' ' ' ' ' ' ' ' '
          ' ' ' ' ' ' ' ' ' ' ' ' ' '
          ' ' ' ' ' ' ' ' ' ' ' ' ' '
           ' ' ' ' ' ' ' ' ' ' ' ' '
            ' ' ' ' ' ' ' ' ' ' ' '
             ' ' ' ' ' ' ' ' ' ' '
              ' ' ' ' ' ' ' ' ' '
               ' ' ' ' ' ' ' ' '
                ' ' ' ' ' ' ' '
                 ' ' ' ' ' ' '
                  ' ' ' ' ' '
                   ' ' ' ' '
                    ' ' ' '
                     ' ' '
                      ' '
                       '

 

데이터베이스에서 LIKE '%검색어%' 쿼리의 느린 속도에 답답했던 경험, 다들 한 번쯤 있으시죠? 서비스가 커지면서 데이터는 수백만, 수십억 건으로 늘어나는데, 어떻게 사용자에게 1초도 안 되는 시간에 정확한 검색 결과를 보여줄 수 있을까요? 바로 이 문제를 해결하기 위해 등장한 기술이 Elasticsearch입니다.

 

TL;DR
이 글에서는 Elasticsearch가 어떻게 빠른 검색을 구현하는지 핵심 원리부터 차근차근 알아봅니다. 실제 코드를 통해 데이터를 저장하고 검색하는 방법까지 실습하며, 단순 검색 엔진을 넘어 AI 시대의 필수 기술로 자리 잡은 이유를 파헤쳐 봅니다.


목차

  1. 배경: 왜 RDBMS가 아니라 Elasticsearch일까?
  2. 핵심 개념 정리: Elasticsearch는 어떻게 작동하는가?
  3. 실습 / 코드: Docker로 5분 만에 경험하는 Elasticsearch
  4. 모범 사례: 이럴 땐 쓰고, 이럴 땐 피하세요!
  5. 마치며 & 참고자료

1. 배경: 왜 RDBMS가 아니라 Elasticsearch일까?

우리가 흔히 사용하는 관계형 데이터베이스(RDBMS)는 데이터의 일관성과 무결성을 보장하는 데 최적화되어 있습니다[2]. 하지만 전문적인 텍스트 '검색' 기능에는 몇 가지 한계가 있습니다. LIKE 연산은 데이터가 많아질수록 성능이 급격히 저하되고, 검색 결과의 관련도(정확도)를 매겨 정렬하기도 어렵습니다.

Elasticsearch는 바로 이 지점에서 출발했습니다. 방대한 양의 정형, 비정형 데이터를 거의 실시간으로 저장, 검색, 분석하기 위해 태어난 분산 검색 엔진입니다[1][8].

 

주요 용어 정리

  • Elasticsearch: Apache Lucene 기반으로 만들어진 오픈소스 분산 검색 및 분석 엔진입니다[4][6].
  • Lucene (루씬): Elasticsearch의 심장부로, 고성능 텍스트 검색 기능을 제공하는 자바 라이브러리입니다[1][6].
  • ELK Stack: 데이터 수집기(Logstash), 검색 엔진(Elasticsearch), 시각화 도구(Kibana)를 묶어 데이터 파이프라인을 구성하는 스택입니다[2][6].
  • JSON 문서 (Document): Elasticsearch에서 데이터를 저장하고 색인하는 기본 단위입니다. 스키마가 없어 유연한 데이터 구조를 가질 수 있습니다[2][4].
  • 인덱스 (Index): 관련된 문서들의 모음입니다. RDBMS의 '데이터베이스'와 비슷한 개념으로 볼 수 있습니다[2].
  • 샤드 (Shard): 인덱스를 여러 조각으로 나눈 단위입니다. 데이터를 분산 저장하여 수평적 확장을 가능하게 합니다[2].

2. 핵심 개념 정리: Elasticsearch는 어떻게 작동하는가?

Elasticsearch는 '역색인(Inverted Index)' 구조를 통해 방대한 텍스트 데이터에서 특정 단어를 포함하는 문서를 초고속으로 찾아내는 분산 검색 엔진입니다[2].

 

책 맨 뒤의 '찾아보기'를 생각하면 쉽습니다. 'Elasticsearch'라는 단어가 몇 페이지에 있는지 바로 알려주는 것처럼, 역색인은 특정 단어가 어떤 문서에 포함되어 있는지 미리 정리해 둡니다[2]. 덕분에 모든 문서를 일일이 훑어볼 필요 없이 즉각적인 검색이 가능합니다.

 

주요 특징

  • RESTful API: 데이터 생성, 조회, 수정, 삭제(CRUD) 등 모든 기능을 간단한 HTTP API와 JSON 형식으로 제어할 수 있습니다[2][4]. 덕분에 Java, Python, JavaScript 등 어떤 언어로든 쉽게 연동이 가능합니다[4][5].
  • 분산 및 확장성: 데이터는 샤드(Shard) 단위로 여러 서버(노드)에 분산 저장됩니다[2]. 데이터가 늘어나면 서버를 추가하는 것만으로 간단하게 전체 시스템의 용량과 성능을 높일 수 있습니다(Scale-out)[1].
  • 고가용성: 클러스터를 구성하는 서버 중 일부에 장애가 발생하더라도, 복제된 데이터를 통해 중단 없이 안정적인 서비스 운영이 가능합니다[2].
  • 다양한 활용성: 단순 텍스트 검색을 넘어 로그 분석, 애플리케이션 성능 모니터링(APM), 보안 위협 탐지, 그리고 최근에는 벡터 검색을 활용한 AI 애플리케이션(RAG)까지 폭넓게 사용됩니다[1][3][5].

3. 실습 / 코드: Docker로 5분 만에 경험하는 Elasticsearch

백문이 불여일견! 직접 Elasticsearch를 실행하고 데이터를 넣어보겠습니다. 로컬 환경에 Docker가 설치되어 있다면 누구나 따라 할 수 있습니다.

① 설치 및 실행 (Docker)

터미널을 열고 아래 명령어를 입력해 Elasticsearch를 실행합니다.

# Elasticsearch 8.x 버전 실행 (개발 모드, 비밀번호 없이)
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:8.14.0

 

이제 http://localhost:9200 주소로 Elasticsearch와 통신할 수 있습니다.

② 데이터 생성 (Indexing)

curl 명령어를 사용해 'books'라는 인덱스에 첫 번째 책 데이터를 저장해 보겠습니다.

# 'books' 인덱스에 ID가 1인 문서를 생성
# -X PUT: 데이터를 생성하거나 덮어쓰겠다는 HTTP 메서드
# -H 'Content-Type: application/json': 전송하는 데이터가 JSON 형식임을 명시
# -d '{...}': 실제 전송할 데이터 본문
curl -X PUT "http://localhost:9200/books/_doc/1" -H 'Content-Type: application/json' -d'
{
  "title": "Learning Elasticsearch for Beginners",
  "author": "John Doe",
  "published_year": 2024
}
'

 

성공적으로 실행되면 {..., "result":"created", ...}와 같은 응답을 받게 됩니다.

③ 데이터 검색 (Searching)

이제 방금 저장한 데이터를 검색해 봅시다. title 필드에 'elasticsearch'라는 단어가 포함된 문서를 찾아보겠습니다.

# 'books' 인덱스에서 검색 실행
curl -X GET "http://localhost:9200/books/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}
'

 

출력 결과 (일부)

{
  "took": 2,
  "timed_out": false,
  "_shards": { ... },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "books",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "title": "Learning Elasticsearch for Beginners",
          "author": "John Doe",
          "published_year": 2024
        }
      }
    ]
  }
}

hits.hits 배열 안에 우리가 찾던 문서가 정확하게 검색된 것을 확인할 수 있습니다.

4. 모범 사례: 이럴 땐 쓰고, 이럴 땐 피하세요!

Elasticsearch는 강력한 도구지만 만능은 아닙니다. 장점을 극대화하고 단점을 피하기 위한 사용 전략이 필요합니다[2].

패턴 / 사용 사례 장점 주의점
전문 텍스트 검색 RDBMS LIKE 대비 압도적인 속도와 관련도 점수(Relevance Score) 기반의 정교한 정렬을 제공합니다[2]. 데이터 생성 후 검색 가능하기까지 약간의 지연(NRT, Near Real-Time)이 있습니다[2][4].
로그 및 메트릭 분석 방대한 시계열 데이터를 실시간으로 집계하고 Kibana로 시각화하는 데 탁월합니다[2][3]. 데이터 UPDATE는 내부적으로 삭제 후 재색인 방식으로 비용이 높습니다. 잦은 업데이트가 필요한 데이터에는 부적합합니다[2].
AI/벡터 검색 벡터 데이터 저장 및 유사도 검색을 지원하여 RAG(검색 증강 생성) 등 AI 애플리케이션 구축에 활용됩니다[1][5]. 2021년 라이선스 정책 변경으로 최신 버전은 완전한 오픈소스가 아닙니다. 대안으로 AWS의 OpenSearch 포크가 있습니다[4].
시스템의 주 저장소 분산 아키텍처로 빠른 읽기 속도와 고가용성을 보장합니다[1][2]. 트랜잭션과 롤백을 지원하지 않습니다. 데이터 무결성이 중요한 금융 시스템 등의 주 데이터베이스로는 부적합합니다[2].

5. 마치며

오늘 우리는 Elasticsearch의 강력함이 어디서 오는지, 그리고 어떻게 활용할 수 있는지 알아보았습니다.

  • Elasticsearch의 핵심은 '역색인'이며, 이것이 초고속 텍스트 검색을 가능하게 합니다.
  • 단순 검색을 넘어 로그 분석, 보안, AI 검색까지 확장 가능한 유연한 플랫폼입니다.
  • 분산 아키텍처 덕분에 데이터가 아무리 많아져도 수평적으로 쉽게 확장할 수 있습니다.

💡실제 프로젝트 적용 팁: 초기 개발 단계에서는 스키마 없이 유연하게 사용하는 것이 편리하지만, 프로덕션 환경에서는 명시적인 매핑(Mapping)을 통해 데이터 타입과 분석 방식을 정의하는 것이 좋습니다. 이를 통해 예기치 않은 검색 오류를 막고 성능을 최적화할 수 있습니다.


❤️ 이 글이 Elasticsearch를 이해하는 데 도움이 되셨다면 하트댓글 부탁드립니다! 궁금한 점이 있다면 언제든 질문해주세요.

참고자료

  • Elasticsearch 공식 문서: https://www.elastic.co/kr/elasticsearch[1]
  • 공식 GitHub 리포지토리: https://github.com/elastic/elasticsearch[5]
  • 추가 읽을거리 1: AWS의 Elasticsearch 소개[4]
  • 추가 읽을거리 2: Velog - Elasticsearch란?[2]

[1] https://www.elastic.co/kr/elasticsearch
[2] https://velog.io/@emily2307/ElasticSearch%EB%9E%80
[3] https://www.elastic.co/kr/
[4] https://aws.amazon.com/ko/what-is/elasticsearch/
[5] https://github.com/elastic/elasticsearch
[6] https://victorydntmd.tistory.com/308
[7] https://12bme.tistory.com/471
[8] https://brunch.co.kr/@dif/46
[9] https://www.samsungsds.com/kr/insights/elastic_data_modeling.html

728x90
반응형