올바른 방법으로 자바스크립트에서 Elasticsearch, 2부

프로덕션 모범 사례를 검토하고 서버리스 환경에서 Elasticsearch Node.js 클라이언트를 실행하는 방법을 설명합니다.

Elasticsearch를 직접 체험하려면 당사의 샘플 노트북을 살펴보거나, 무료 클라우드 체험판을 시작하거나, 지금 바로 로컬 기기에서 Elastic을 사용해 보세요.

이번 글은 자바스크립트에서의 Elasticsearch 시리즈의 두 번째 파트입니다. 첫 번째 파트에서는 환경을 올바르게 설정하고, Node.js 클라이언트를 구성하고, 데이터를 색인하고, 검색하는 방법을 배웠습니다. 이 두 번째 파트에서는 프로덕션 모범 사례를 구현하고 서버리스 환경에서 Elasticsearch Node.js 클라이언트를 실행하는 방법에 대해 알아보세요.

검토하겠습니다:

여기에서 예제와 함께 소스 코드를 확인할 수 있습니다.

프로덕션 모범 사례

오류 처리

Node.js의 Elasticsearch 클라이언트의 유용한 기능은 Elasticsearch에서 발생할 수 있는 오류에 대한 객체를 노출하여 다양한 방식으로 오류의 유효성을 검사하고 처리할 수 있다는 점입니다.

모두 보려면 이 링크를 실행하세요: 

검색 예제로 돌아가서 몇 가지 가능한 오류를 처리해 보겠습니다:

ResponseError 특히 응답이 4xx 또는 5xx 인 경우 요청이 잘못되었거나 서버를 사용할 수 없음을 의미합니다.

텍스트 유형 필드에 용어 쿼리를시도하는 등 잘못된 쿼리를 생성하여 이러한 유형의 오류를 테스트할 수 있습니다:

기본 오류입니다:

사용자 지정 오류:

또한 각 오류 유형을 특정 방식으로 캡처하고 처리할 수도 있습니다. 예를 들어 TimeoutError 에 재시도 로직을 추가할 수 있습니다.

테스팅

테스트는 앱의 안정성을 보장하기 위한 핵심 요소입니다. Elasticsearch와 분리된 방식으로 코드를 테스트하려면 클러스터를 생성할 때 elasticsearch-js-mock 라이브러리를 사용할 수 있습니다.

이 라이브러리를 사용하면 실제 클라이언트와 매우 유사하지만 클라이언트의 HTTP 계층만 모의 계층으로 바꾸고 나머지는 원본과 동일하게 유지하여 구성에 응답하는 클라이언트를 인스턴스화할 수 있습니다.

자동화된 테스트를 위해 모의 라이브러리와 AVA를 설치합니다.

npm install @elastic/elasticsearch-mock

npm install --save-dev ava

테스트를 실행하도록 package.json 파일을 구성하겠습니다. 이렇게 표시되는지 확인합니다:

이제 test.js 파일을 생성하고 모의 클라이언트를 설치해 보겠습니다:

이제 시맨틱 검색을 위한 모형을 추가합니다:

이제 코드에 대한 테스트를 생성하여 Elasticsearch 부분이 항상 동일한 결과를 반환하는지 확인할 수 있습니다:

테스트를 실행해 보겠습니다.

npm run test

완료! 이제부터는 외부 요소가 아닌 코드에 100 % 초점을 맞춰 앱을 테스트할 수 있습니다.

서버리스 환경

Elastic 서버리스에서 클라이언트 실행

클라우드 또는 온프레미스에서 Elasticsearch를 실행하는 방법에 대해 설명했지만, Node.js 클라이언트는 Elastic Cloud 서버리스에 대한 연결도 지원합니다.

Elastic Cloud Serverless를 사용하면 Elastic이 내부적으로 처리하므로 인프라에 대해 걱정할 필요가 없는 프로젝트를 만들 수 있으며, 사용자는 색인하려는 데이터와 액세스 기간에 대해서만 걱정하면 됩니다.

사용 관점에서 서버리스는 스토리지에서 컴퓨팅을 분리하여 검색과 인덱싱 모두에 자동 확장 기능을 제공합니다. 이를 통해 실제로 필요한 리소스만 성장시킬 수 있습니다.

클라이언트는 서버리스에 연결하기 위해 다음과 같이 조정합니다:

  • 스니핑을 끄고 모든 스니핑 관련 옵션을 무시합니다.
  • 첫 번째 노드를 제외한 구성에서 전달된 모든 노드를 무시하고 모든 노드 필터링 및 선택 옵션을 무시합니다.
  • 압축 및 `TLSv1_2_method`를 활성화합니다(Elastic Cloud에 대해 구성할 때와 동일).
  • 모든 요청에 `elastic-api-version` HTTP 헤더를 추가합니다.
  • 기본적으로 '가중치 연결 풀' 대신 '클라우드 연결 풀'을 사용합니다.
  • 표준 MIME 유형을 위해 공급업체의 `content-type` 및 `accept` 헤더를 끕니다.

서버리스 프로젝트를 연결하려면 서버모드: 서버리스 매개변수를 사용해야 합니다.

서비스형 기능 환경에서 클라이언트 실행하기

이 예제에서는 Node.js 서버를 사용했지만 AWS 람다, GCP 실행 등과 같은 기능을 갖춘 서비스형 기능 환경을 사용하여 연결할 수도 있습니다.

또 다른 예는 서버리스 서비스인 Vercel과 같은 서비스에 연결하는 것입니다. 이 전체 예제에서 이를 수행하는 방법을 확인할 수 있지만 검색 엔드포인트의 가장 관련성이 높은 부분은 다음과 같습니다:

이 엔드포인트는 /api 폴더에 있으며 서버 측에서 실행되므로 클라이언트는 검색어에 해당하는 'text' 매개변수만 제어할 수 있습니다.

함수형 서비스 사용의 의미는 24시간 연중무휴로 실행되는 서버와 달리 함수는 해당 기능을 실행하는 컴퓨터만 불러오고, 작업이 끝나면 컴퓨터가 휴식 모드로 전환되어 리소스를 덜 소비한다는 것입니다.

이 구성은 애플리케이션에 요청이 너무 많지 않은 경우 편리할 수 있지만, 그렇지 않은 경우 비용이 많이 들 수 있습니다. 또한 함수의 수명 주기와 실행 시간(경우에 따라 몇 초에 불과할 수도 있음)도 고려해야 합니다.

결론

이 글에서는 프로덕션 환경에서 매우 중요한 오류를 처리하는 방법에 대해 알아보았습니다. 또한 클러스터의 상태에 관계없이 안정적인 테스트를 제공하고 코드에 집중할 수 있게 해주는 Elasticsearch 서비스를 모의하면서 애플리케이션을 테스트하는 방법도 다루었습니다.

마지막으로, Elastic Cloud 서버리스와 Vercel 애플리케이션을 모두 프로비저닝하여 완전한 서버리스 스택을 스핀업하는 방법을 시연했습니다.

관련 콘텐츠

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요