ACOR v1.3.0: HTTP와 gRPC 서버 어댑터

들어가며 ACOR v1.3.0에서 HTTP와 gRPC 서버 어댑터가 추가되었다. 이제 ACOR을 마이크로서비스 아키텍처에 쉽게 통합하거나, 별도의 서버로 배포할 수 있다. 이 포스트에서는 두 어댑터의 사용법과 배포 방법을 살펴본다. 아키텍처 개요 v1.3.0에서 pkg/server 패키지가 추가되어 기존 pkg/acor API를 HTTP JSON과 gRPC로 노출한다: ┌ │ └ ─ ─ ─ ─ ─ ─ ─ C ─ ─ l ─ ─ i ─ ─ e ─ ─ n ─ ─ t ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ ┘ ─ ─ ─ ─ ▶ ┌ │ │ └ ┌ │ └ ┌ │ └ ─ ─ ─ ─ ─ ─ ─ H ─ ─ ─ ─ ─ ─ T ─ ─ p ─ ─ ─ ─ T S ─ ─ k ─ ─ ─ ─ P e ─ ─ g ─ ─ R ─ ─ / r ─ ─ / ─ ─ e ─ ─ g v ┬ │ ▼ a ┬ │ ▼ d ─ ─ R e ─ ─ c ─ ─ i ─ ─ P r ─ ─ o ─ ─ s ─ ─ C ─ ─ r ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ │ ┘ ┐ │ ┘ ┐ │ ┘ HTTP 서버 기본 사용법 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package main import ( "log" "net/http" "github.com/skyoo2003/acor/pkg/acor" "github.com/skyoo2003/acor/pkg/server" ) func main() { ac, err := acor.Create(&acor.AhoCorasickArgs{ Addr: "localhost:6379", Name: "sample", }) if err != nil { log.Fatal(err) } defer ac.Close() httpHandler := server.NewHTTPHandler(ac) http.Handle("/", httpHandler) log.Println("HTTP server listening on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) } API 엔드포인트 Method Path 설명 POST /add 키워드 추가 POST /remove 키워드 삭제 POST /find 텍스트 검색 POST /find-index 위치 정보와 함께 검색 POST /suggest 자동완성 제안 POST /suggest-index 위치 정보와 함께 자동완성 GET /info 컬렉션 정보 POST /flush 컬렉션 삭제 요청/응답 예제 키워드 추가 ...

2026년 3월 17일 · 5 분 · Sung-Kyu Yoo

ACOR v1.3.0: Redis 토폴로지 지원과 에러 핸들링 강화

들어가며 ACOR v1.3.0에서 Redis 관련 두 가지 중요한 개선사항이 추가되었다. 첫째, 다양한 Redis 토폴로지(Sentinel, Cluster, Ring)를 지원하게 되었고, 둘째, Redis 통신 중 발생하는 에러를 명시적으로 처리하도록 API가 개선되었다. Redis 토폴로지 지원 문제 상황 v1.3.0 이전에는 단일 Redis 인스턴스(Addr)만 지원했다. 프로덕션 환경에서는 고가용성을 위해 Redis Sentinel을 사용하거나, 대용량 데이터 처리를 위해 Redis Cluster를 사용하는 경우가 많다. ACOR을 이런 환경에서 사용하려면 별도의 작업이 필요했다. 해결 방법 v1.3.0에서는 AhoCorasickArgs 구조체에 토폴로지별 필드를 추가하여 다양한 Redis 배포 방식을 지원한다: ...

2026년 3월 17일 · 3 분 · Sung-Kyu Yoo

ACOR v1.3.0: 커맨드라인 도구 소개

들어가며 ACOR v1.3.0에서 새로운 커맨드라인 도구 acor가 추가되었다. 이제 Go 코드를 작성하지 않고도 터미널에서 바로 Aho-Corasick 오토마톤을 조작할 수 있다. 이 포스트에서는 CLI의 주요 기능과 사용법을 살펴본다. 설치 바이너리 다운로드 GitHub Releases에서 플랫폼별 바이너리를 다운로드할 수 있다: 1 2 3 4 5 6 7 8 9 # macOS (Apple Silicon) curl -LO https://github.com/skyoo2003/acor/releases/download/v1.3.0/acor_1.3.0_darwin_arm64.tar.gz tar xzf acor_1.3.0_darwin_arm64.tar.gz sudo mv acor /usr/local/bin/ # Linux (x86_64) curl -LO https://github.com/skyoo2003/acor/releases/download/v1.3.0/acor_1.3.0_linux_amd64.tar.gz tar xzf acor_1.3.0_linux_amd64.tar.gz sudo mv acor /usr/local/bin/ 소스에서 빌드 1 2 3 git clone https://github.com/skyoo2003/acor.git cd acor make build 빌드된 바이너리는 bin/acor에 생성된다. ...

2026년 3월 17일 · 3 분 · Sung-Kyu Yoo

ACOR v1.3.0 Index APIs 심층 분석

들어가며 Aho-Corasick 알고리즘은 다중 패턴 문자열 검색을 위한 고전적인 알고리즘이다. 사전에 등록된 여러 키워드를 입력 텍스트에서 동시에 효율적으로 찾을 수 있어, 스팸 필터링, 민감 정보 탐지, 자동완성 등 다양한 영역에서 활용된다. ACOR은 이 Aho-Corasick 알고리즘을 Go로 구현하고 Redis를 백엔드 저장소로 사용하는 라이브러리다. v1.3.0에서는 기존 API를 확장하여 매칭된 키워드의 위치 정보를 제공하는 Index APIs가 추가되었다. 이 포스트에서는 FindIndex와 SuggestIndex API의 설계와 구현을 심층 분석해본다. 기존 API와의 차이점 v1.3.0 이전에는 Find와 Suggest 두 가지 검색 API가 있었다: ...

2026년 3월 16일 · 4 분 · Sung-Kyu Yoo

Ansible Molecule with Kind - 도커를 활용한 쿠버네티스 자동화 테스트 작성

Ansible Molecule with KIND (Kubernetes IN Docker) Ansible Molecule은 Ansible roles를 가상화 기술을 통해 환경을 고립시켜서 환경 구성을 테스트할 수 있게 도와주는 도구. KIND는 Kubernetes 클러스터를 도커 컨테이너로 동작시켜주는 도구. 쿠버네티스 클러스터 위에서 리소스를 배치하고 리소스를 확인하거나 어플리케이션 동작을 검증하는 용도로 사용함. (ex, Helm Chart) 제약사항 Docker Engine 설치 KIND 설치 Python libraries 설치 pip install molecule[docker,lint] molecule-docker!=0.3.4 openshift molecule-docker 0.3.4 버전은 문제가 있어 사용 금지 Ansible collections 설치 ansible-galaxy collection install community.kubernetes community.docker 테스트 시나리오 작성 및 실행 Ansible role 생성 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 $ ansible-galaxy role init myrole - Role myrole was created successfully $ tree myrole myrole ├── README.md ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml $ vi myrole/meta/main.yml --- collections: - community.kubernetes $ vi myrole/tasks/main.yml --- - name: Ensure the K8S Namespace exists. k8s: api_version: v1 kind: Namespace name: "myrole-ns" kubeconfig: "{{ kube_config }}" state: present Molecule default 시나리오 초기화 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ cd myrole $ molecule init scenario --dependency-name galaxy --driver-name delegated --provisioner-name ansible --verifier-name ansible default INFO Initializing new scenario default... INFO Initialized scenario in /path/to/myrole/molecule/default successfully. $ tree molecule molecule └── default ├── INSTALL.rst ├── converge.yml ├── create.yml ├── destroy.yml ├── molecule.yml └── verify.yml 1 directory, 6 files KIND Config 매니페스트 파일 생성 1 2 3 4 5 6 7 8 9 10 11 12 $ mkdir -p molecule/default/manifests $ vi molecule/default/manifests/kindconfig.yaml --- kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking: kubeProxyMode: ipvs nodes: - role: control-plane image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca - role: worker image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca Molecule default 시나리오 설정 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $ vi molecule/default/molecule.yml --- dependency: name: galaxy driver: name: delegated platforms: - name: instance provisioner: name: ansible inventory: host_vars: localhost: kind_name: myk8s kind_config: manifests/kindconfig.yaml kube_config: /tmp/kind/kubeconfig.yaml verifier: name: ansible Molecule default 시나리오 생성 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ vi molecule/default/create.yml --- - name: Create hosts: localhost connection: local gather_facts: false tasks: - name: Create Kubernetes in Docker command: >- kind create cluster --name {{ kind_name }} --config {{ kind_config }} --kubeconfig {{ kube_config }} changed_when: true Molecule default 시나리오 삭제 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 $ vi molecule/default/destory.yml --- - name: Destroy hosts: localhost connection: local gather_facts: false tasks: - name: Delete Kubernetes in Docker command: >- kind delete cluster --name {{ kind_name }} --kubeconfig {{ kube_config }} changed_when: true Molecule default 사나리오 환경 구축 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 $ vi molecule/default/converge.yml --- - name: Converge hosts: localhost connection: local gather_facts: false collections: - community.kubernetes tasks: - include_role: name: "myrole" Molecule default 시나리오 검증 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ vi molecule/default/verify.yml --- - name: Verify hosts: localhost connection: local gather_facts: false collections: - community.kubernetes tasks: - k8s_info: kind: Namespace name: "myrole-ns" kubeconfig: "{{ kube_config }}" register: k8s_info_result - assert: that: not k8s_info_result.failed fail_msg: "K8S Namespace not exists" success_msg: "K8S Namspace exists" Molecule default 시나리오 테스트 1 2 3 4 5 6 7 8 9 10 # Molecule default 시나리오 테스트 수행 $ molecule test # Molecule default 시나리오 환경 구축 (Optional) ## 쿠버네티스 클러스터와 환경 구축까지만 진행한 상태에서 직접 확인해보고 싶을 때 사용 가능 $ molecule converge # Molecule default 시나리오 환경 제거 (Optional) ## 수동으로 쿠버네티스 클러스터와 환경 구축을 진행한 경우 직접 삭제를 해줘야 함. $ molecule destory 주의사항 KIND는 base/node 이미지로 구성 base 이미지는 ubuntu, systemd, containers 등의 쿠버네티스가 동작할 수 있는 기반 프로그램이 설치되는 이미지 node 이미지는 base 이미지를 기준으로 kubernetes 클러스터 동작을 위한 이미지 Ubuntu 버전 등의 기반 패키지의 버전을 실 환경과 동일하게 맞추려면, base/node 이미지를 KIND 문서를 참고해서 직접 만들어야 함.

2022년 5월 26일 · 4 분 · Sung-Kyu Yoo

Ansible Molecule으로 테스트 작성하기

Molecule ansible-community 에서 관리하는 Ansible role용 테스트 프레임워크. Molecule는 여러 인스턴스, 운영 체제 및 배포, 가상화 공급자, 테스트 프레임 워크 및 테스트 시나리오를 사용한 테스트를 지원. 설치하기 Pip 설치 시, 시스템 파이썬의 의존성을 꼬이게할 수 있으므로 가급적 Virtualenv로 가상 환경을 만들거나 Pipenv, Poetry 등의 의존성 관리 도구 사용하는 것을 권장. 1 2 # docker 및 yamllint, ansible-lint 패키지 추가로 설치. (podman, vagrant, azure, hetzer 도 지원) $ pip install molecule[docker,lint] 테스트 작성 /path/to/role/molecule/default 경로에 디렉토리 생성. (default 는 기본 시나리오. 다른 이름으로 시나리오 추가 가능함) /path/to/role/molecule/default/molecule.yml 파일 생성 후 아래 내용 입력. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 --- dependency: name: galaxy options: requirements-file: ../../requirements.yml driver: name: docker platforms: - name: instance image: docker.io/python:3.6-slim-buster pre_build_image: true provisioner: name: ansible verifier: name: ansible lint: | set -e yamllint -c ../../.yamllint . ansible-lint -c ../../.ansible-lint /path/to/role/molecule/default/converge.yml 생성 후 환경 구성 코드 추가 도커 컨테이너를 만들고 난 이후에 Role 수행으로 환경을 구성하기 위한 코드를 삽입. (웹 서버 배포 등) ...

2022년 5월 26일 · 2 분 · Sung-Kyu Yoo

현업에서 사용했던 각종 용어들 정리

현업에서 의사소통이나 업무를 수행할 때, 사용해보거나 우연히 알게된 용어들을 잊어버리지 않고 종종 찾아보기 위해서 기록해보려 한다. MECE 출처: 중복과 누락없는 논리적 분석 MECE Mutually Exclusive Collectively Exhaustive의 약자로 어떤 문제를 해결하기 위한 방안이 겹치지 않으면서 빠짐없이 나누는 것을 의미한다. 중복과 누락 없이라고 할 수 있을 것이다. 사실 이 용어는 경영 관련 용어라고는 알고 있지만, 소프트웨어 엔지니어링에 적용하기에도 손색이 없다고 생각한다. 왜냐하면, 중복 코드를 없애고 단순하지만 필요한 기능을 모두 포함하는 것이 소프트웨어 설계나 개발 원칙에 주로 나오는 내용이기 때문이다. ...

2022년 5월 26일 · 2 분 · Sung-Kyu Yoo

ACOR v1.2.0 릴리즈: 표준 프로젝트 구조와 버그 수정

들어가며 ACOR v1.2.0을 릴리즈했다. 이번 버전은 프로젝트 구조를 Go 표준으로 정리하고 몇 가지 버그를 수정하는 데 집중했다. 표준 프로젝트 구조로 변경 v1.2.0에서는 Go 커뮤니티의 표준 프로젝트 레이아웃을 따르도록 구조를 변경했다 (#2). Go 프로젝트가 성장하면서 파일 구조를 체계적으로 관리할 필요가 있었다. Standard Go Project Layout 가이드라인을 참고하여: pkg/: 외부에서 import 가능한 패키지 코드 internal/: 내부 전용 코드 cmd/: 메인 애플리케이션 이런 구조를 적용함으로써 프로젝트의 의도를 더 명확히 전달할 수 있게 되었다. 지원 Go 버전 변경 Go 버전 지원 정책을 업데이트했다 (#5). ...

2021년 7월 8일 · 2 분 · Sung-Kyu Yoo

ACOR v1.1.0 릴리즈: Go modules와 GitHub Actions로의 전환

들어가며 ACOR v1.1.0을 릴리즈했다. 이번 버전은 새로운 기능 추가보다는 프로젝트의 기반을 현대화하는 데 집중했다. Go 생태계의 변화에 맞춰 의존성 관리와 CI/CD 시스템을 최신 표준으로 전환했다. 왜 Go modules로 전환했는가 ACOR은 처음 Glide를 사용해 의존성을 관리했다. Glide는 Go에 공식 의존성 관리 도구가 없던 시절, 커뮤니티에서 널리 사용되던 도구였다. 하지만 Go 1.11부터 Go modules가 공식으로 도입되면서 상황이 바뀌었다. Glide의 한계는 명확했다: 유지보수 중단: Glide는 더 이상 활발히 개발되지 않는다 버전 관리: 정확한 버전 고정과 의존성 트리 관리가 번거롭다 재현성: 다른 환경에서 동일한 빌드를 보장하기 어렵다 Go modules는 이 문제들을 해결한다. go.mod 파일 하나로 의존성을 관리하고, Semantic Versioning을 기반으로 버전을 제어한다. 무엇보다 Go 도구 체인에 내장되어 있어 별도 설치가 필요 없다. ...

2020년 11월 15일 · 2 분 · Sung-Kyu Yoo

Ansible Callback Plugin 소개

Ansible Plugin 중에서 Callback Plugin 에 관련한 부분만 정리합니다. Callback Plugin 은 Ansible 에서 특정 이벤트 발생 시 데이터를 로깅한다거나 Slack, Mail 등의 외부 채널로 Write 하는 등의 다양한 목적을 달성하기 위해 사용하는 모듈입니다. 참고로 이 내용은 Ansible 2.2.1.0 기준으로 작성되었습니다. 소개 Ansible Callback Plugin 은 Ansible 의 각종 이벤트를 Hooking 해서 해당 시점에 원하는 로직을 수행할 수 있는 플러그인을 말합니다. 이 콜백 플러그인은 Ansible Task, Playbook 등에 대해 “실행 직전”, “실행 종료” 등의 이벤트에 대한 콜백 함수를 정의할 수 있도록 지원합니다. ...

2017년 11월 14일 · 5 분 · Sung-Kyu Yoo