01 소개 02 경력 03 작업 04 블로그 05 이력서 PDF
← 작업 목록
실무 2026.07 — 진행중 · Full Stack Architect · 그린필드 설계 · 기반 구축

커머스 검색엔진 내재화 · Diquest→OpenSearch 이관

라이선스 만료를 앞둔 상용 검색엔진(Diquest/DIVER5)을 OpenSearch 기반 자체 검색 플랫폼으로 이관·내재화. 인프라·아키텍처·데이터 모델·코드 컨벤션까지 4-tier 풀스택을 그린필드로 단독 설계·구축해, 후속 개발자가 바로 기능 개발에 착수할 수 있는 기반을 닦았습니다.

커머스 검색엔진 내재화 · Diquest→OpenSearch 이관 스크린샷
분류
실무
기간
2026.07 — 진행중
역할
Full Stack Architect · 그린필드 설계 · 기반 구축
핵심 지표
4-tier · 상품 95만건
Java 21Spring Boot 4.1OpenSearchOraclePostgreSQLVue 3PrimeVueTypeScriptDocker
// 01
문제
the problem

커머스 검색을 상용 IR 엔진 Diquest/DIVER5(TCP 소켓 방식)에 의존하고 있었다. 라이선스 만료가 다가오며 갱신 비용 부담이 컸고, 엔진 내부를 들여다볼 수 없어 랭킹·형태소·사전을 우리 의도대로 손볼 여지가 막혀 있었다. 특정 벤더에 검색 품질 전체가 묶여 있는 기술 의존 구조 자체가 리스크였다.


// 02
접근
the approach

OpenSearch(+nori 한글 형태소) 위에 검색 플랫폼을 자체 구축했다. Oracle 상품소스를 커서 스트리밍으로 읽어 blue-green alias로 무중단 교체하는 색인 파이프라인, cross_fields+판매량 부스팅으로 Diquest 랭킹을 재현한 검색, 초성·한영변환 폴백을 갖춘 자동완성, 복합어/유의어·바로가기 사전, 검색로그 KPI까지 도메인을 직접 설계했다. admin-server를 BFF choke point로 두고 JWT·RBAC·감사로그를 태우고, 운영 콘솔(Vue3/PrimeVue)까지 백엔드 4모듈 + 프론트를 관통하는 골격을 그린필드로 세워, 팀이 이어받아 개발할 수 있는 토대를 마련했다.


// 03
결과
the result

통합검색(패싯·가격·카테5단계·상품코드)·자동완성·사전·검색로그·인기검색어·RBAC·감사로그를 OpenSearch 위에 재현하며 상용 엔진 기능을 대체했다. 랭킹·형태소·사전을 코드로 직접 통제할 수 있게 되어, 전시 카테 nested 정합·바로가기 리다이렉트·색인 실행이력 같은 개선을 벤더 일정이 아니라 우리 손으로 이어가고 있다.


// 04
배운 것
takeaways

상용 솔루션 내재화의 진짜 이득은 절감액보다 '제어권과 역량'이었다. 엔진 내부가 열리자 랭킹 가중치·형태소 사전·색인 전략을 실측하며 우리 데이터에 맞게 튜닝할 수 있었고, 검색이라는 핵심 도메인 지식이 조직 안에 쌓였다.

배경

NS홈쇼핑 커머스 검색을 상용 IR 엔진 Diquest/DIVER5(TCP 소켓 기반)에 맡기고 있었습니다. 라이선스 만료가 다가오며 갱신 비용이 부담이었고, 무엇보다 검색 품질(랭킹·형태소·사전) 전체가 벤더에 묶여 개선을 우리 손으로 끌고 갈 수 없었습니다. 비용을 줄이는 동시에 검색 도메인의 주도권을 가져오기 위해, OpenSearch 기반 자체 검색 플랫폼으로 이관했습니다.

해결하려는 문제 — 왜 내재화인가

  • 라이선스 만료 / 비용 절감 — 만료를 앞둔 상용 엔진 갱신 비용을 오픈소스(OpenSearch) 자체 구축으로 대체.
  • 기술 의존도 낮추기 — 검색 품질이 특정 벤더에 묶인 구조를 걷어내고, 랭킹·형태소·사전을 코드로 직접 통제.
  • 기술 역량 강화 — 색인 전략·형태소 분석·랭킹 튜닝을 실측하며 검색 도메인 지식을 조직 내부에 축적.

구조 설계

레거시 TCP 소켓 엔진을 REST 4-tier로 재편하고, admin-server를 BFF choke point로 두어 인증·인가·감사를 한 지점에 모았습니다.

브라우저 → admin-ui(Vue3) → admin-server(JWT·RBAC·감사·BFF)
                               ├→ search-service   검색/자동완성/검색로그
                               └→ batch-server     색인 스케줄러/사전/스냅샷
        OpenSearch(goods·suggest·search-log) · Oracle(상품소스) · PostgreSQL(메타DB)
  • 무중단 색인 — Oracle 커서 스트리밍(상수 메모리) → blue-green alias 원자 교체. 전체/증분(차집합 삭제)·동적 cron·jobKey 배타 락·협조적 취소.
  • 랭킹 재현multi_match cross_fields(and) + name.ngram 부분매칭 + function_score 판매량 부스팅으로 Diquest ADDWEIGHT를 재현, 필드 가중치는 레거시 스코어를 그대로 매핑.
  • 한글 검색 — nori 형태소 + 복합어(user_dictionary)/유의어(synonym_graph) 사전, 0건 폴백(한영변환·초성확장).
  • 소유 원칙 인프라 — 메타DB는 Postgres 단일 DB + 스키마 분리, **Flyway(migrator≠app 계정)**로 앱의 DDL 권한 제거. Spring Boot 4.1·Jackson3.

풀스택 범위 (그린필드 단독 구축)

백엔드 4모듈 + 프론트의 골격을 그린필드로 단독 설계·구축해, 이후 합류할 개발자가 기능 단위로 확장할 수 있는 기반을 마련했습니다.

  • 색인/배치 — Oracle→OpenSearch 파이프라인, 카테고리 5단계 병합, 스케줄러, 자동완성·인기검색어 스냅샷.
  • 검색 — 쿼리 빌더·패싯(카테 트리·브랜드·p95 가격)·검색로그 KPI·상세 진단.
  • 인증/운영 — JWT(ES256)·RBAC(resource:action)·BFF 프록시·감사 인터셉터(민감값 마스킹).
  • 프론트 — Vue3+PrimeVue4 운영 콘솔(대시보드·색인관리·스케줄·실행이력·사전·검색테스트·검색로그분석·권한·사용자).
  • 품질/DevOps — TDD(JUnit5/Vitest)·Spotless·ESLint/Prettier/Stylelint·pre-commit 훅·서비스별 Docker·OpenAPI 문서.

주요 기술 결정

결정선택근거
검색엔진OpenSearch + noriES 라이선스 회피·한글 형태소
색인 교체blue-green alias무중단·즉시 롤백
Oracle 접근JdbcTemplate 커서 스트리밍대량 상수 메모리, MyBatis/JPA 미채택
메타DBPostgres 1DB+스키마분리실행주체 소유 원칙
마이그레이션Flyway(migrator≠app)앱 CREATE 권한 제거
판매량 랭킹function_score log1p sumDiquest ADDWEIGHT 재현

결과

상용 엔진의 핵심 기능(통합검색·자동완성·사전·검색로그·인기검색어)을 OpenSearch 위에 대체하며 라이선스 의존을 걷어냈습니다. 엔진 내부가 열리자 전시 카테 nested 정합·키워드 바로가기·색인 실행이력 같은 개선을 벤더 일정이 아니라 우리 손으로 이어가고 있고, 검색 도메인 역량이 조직 안에 쌓였습니다.