오늘도 평화
로운 어느 날, 평화롭게 File-Service
를 리팩토링 하던 저에게 아주 놀라운 일이 생겨버렸습니다.
저희 서비스
의 검색을 개선하라는 업무가 내려온 것인데요.. NoSQL
에 아직 익숙치도 않은 제게는 너무 큰일이였지만 이건! 분명 나에게도 좋은 기회야! 라고 주먹
을 불끈 말아쥐며 이렇게 주니어
한 명이 갈리는 눈물의 투쟁기가 시작됩니다.
현재 검색은 여러가지 애로사항
이 있습니다.
10000
과 10,000
을 다른 데이터로 취급한다.3초 이상
이 경과해야 데이터를 볼 수 있다.이모지
로 검색이 되지 않는다.한영키
가 눌린채로 잘못 검색하면 검색이 되지 않는다 -> 쿠팡
을 znvkd
으로 검색생성일 순
으로 정렬
된다.제가 느끼는 애로사항
이 꽤나 많았기에 이 문제를 어떻게 개선하는 것이 좋을지 많이 고민하며 하루 하루
를 지내왔습니다.
위에서 문제
를 정의했고, 이제 이 문제
를 어떻게 풀어나갈지 정하기만 하면 될 것 같았는데.. 저는 이제서야 알아버리고 말았습니다. 문제를 어떻게 풀어낼지 정의하지 못하고 방향성
을 잃는다면 문제를 이해하지 못했다는 것을요 🫤
기존 시스템을 어디서부터 어떻게 개선
할지 전혀 의사 결정
이 되지 않고 아무것도 할 수 없었습니다.
마치 저에게는 이 검색 개편
이 풀기도 어려운 불가사의한 수학 문제
로까지 느껴지기 시작했어요.
그렇게 수많은 삽질
중 첫 삽질이 시작됩니다.
팀내에서도 검색
에 대해 대략적인 개선안
이 나왔습니다.
어떤 개선안일까요? 바로 바로! Solr -> ES(Elastic Search)
로 검색 엔진을 변경하자는 것입니다.
팀에서는 Solr
를 사용하여 검색
을 구축했었고, 초기에 구축했을 당시에는 굉장히 빨랐다고 합니다.
하지만 현재 수십억건의 데이터가 적재되면서 샤드
를 재배치
하려면 서비스의 다운타임을 가져야 하는데 데이터 양이 많아서 엄두를 못내고 있는 상황이여서 ES
로의 변경
을 생각하고 있었습니다.
현재 인덱싱하는 여러 Worker 모듈
들이 데이터의 종류에 따라서 조건문
을 통해 데이터
를 재조립하고 또 다시 Queue
에 넣는 작업을 하고 있는데, 이 부분이 너무 비효율적
이라고 생각하여 개선
해보고자 했습니다.
많은 모듈
의 협력이 있다 === 수정을 가하면 변경 포인트
가 많다.
따라서 아키텍처
를 그리면서 초기 모델을 만들고, 인덱싱 모듈
과 워커
등을 설계하며 팀의 리뷰를 받았습니다.
팀에서는 해당 아키텍처
에 대해 좋다는 의사를 표시하며 이제 검색 스키마
를 설계해달라는 요청을 했습니다.
여기서부터 이제 저는 개미지옥
에 빠지게 됩니다.
일단 저는 MongoDB
나 Elastic Search
등에 대한 이해가 아직 부족한 상황이였습니다.
또 Solr
의 코드를 분석하면서 Analysis
라는 개념을 처음 알게되고 검색에 필요한 여러가지 지식을 익혀가는 중이였습니다.
제가 설계
한 검색 시스템
이 팀의 리뷰에서 통과되면 정식 피처
가 될 것이고, 이것을 구현하여 라이브
에 배포
를 나가려면 수십억건의 데이터 또한 배치와 워커를 통해 열심히 넣어줘야 합니다.
즉, 인덱스 설계
나 초기 검증
이 잘못되면 한 번 정착된 검색 시스템은 바꾸기가 정말로 어렵다는 이야기입니다.
검색 스키마
를 설계하면서 이런 저런 고민을 하다가, 첫 번째로 들었던 생각은 ES(Elastic Search)
에 대한 기반지식이 전무하다는 점이였습니다. RDB
도 쿼리
도 날려보고 직접 설계를 해봐야 전체적인 구조가 보입니다.
백문이 불여일타
라고 하는 이 개발 세상에서 ES
로 쿼리 한 번 날려보지 않은 제가 우리 서비스
의 새로운 5년을 책임질 시스템을 그냥 눈으로 설계
하려고 있었던 것입니다.
그렇게 필드
를 넣었다 뺐다가 이런 반복 작업
들 속에서 제 업무 일지에는 스키마 설계
에 대한 내용만 수북히 남게 되었고 4번
의 리뷰
를 받았음에도 작업
의 진척도는 없었습니다.
여기서 팀장
님은 아주 뜻깊은 이야기를 제게 해주시게 되었는데요.
이 한 마디로 인해서 2주
만에 어떻게 검색을 만들고 실제적인 구현 방안
은 뭐가 있는지 잡히기 시작했습니다.
우리
검색
의문제
는 무엇인지,
우리검색
에서개선
하고자 하는 목표는 무엇이며 그 문제를 어떻게 해결할 것인지정의
가 안되있는거 같아요.
정말 뼈
를 때리는 한마디였습니다.
어떤 문제
가 있는지 나열
만 하고 대략적인 아키텍처
만 그렸을 뿐이지 이것은 해결방법에 불과하고 업무를 진행함에 있어서 우선순위
도 정하지 못했고, 가장 중요한 Goal(목표)
이 없었기에 업무가 지지부진 했던 것입니다.
기존에 스키마
리뷰를 받을때, ES 학습
으로 인해서 너무 시간을 소비해서 마치 스키마 설계 하나만 가지고 시간을 오래 끄는 것 처럼 보여질까봐 많은 염려
를 했었습니다.
그래서 오히려 기초 지식을 쌓는데 너무 시간
을 쓰지 않게 되었고, 그로 인해 스키마
의 타입 정의
나 필드 구성 부분에서 부적절한 매핑
을 만들어 내기도 했습니다.
여기서 이제 알게되었습니다. 드릴
을 이용해서 벽을 뚫으려고 하는데, 나는 드릴
을 쓸 줄 모르는 사람이구나!
저는 스키마 설계
에 매진하지 않고 ES
를 전반적으로 학습하며 다양한 기능
을 익히고 실습하는데 3일의 시간을 썼습니다. 점심 시간 빼고 일 6시간
이상 ES 공부
만 한 것입니다.
출퇴근길
에도 검색 엔진
이나 엘라스틱 서치
한국 사용자 그룹에 올라온 여러 글을 탐독하며 많은 지식을 쌓고 또 그것을 이용해 어떻게 검색을 개선시킬지 많은 고민
을 했습니다.
그렇게 지식
이 쌓이니 보이는 것도 생기고 조금씩 문제
를 해결할 수 있을 것 같았습니다.
제가 가꾸어가는 프로덕트는 "협업툴"
입니다.
협업툴
에서 채팅방
과 게시판
등 여러 데이터를 기반하여 "내가 접근 권한이 있는" 팀과 게시판 또는 채팅방에 대해서만 검색이 가능하며, 접근이 불가능
한 데이터
는 나오지 않아야 합니다.
여러 가지 좋은 기능
들이 많았습니다.
예를 들면 자동완성 기능
이나 오타를 Suggestion-API
를 사용하여 추천 검색어를 만들어주는 기능 등은 정말 괜찮아 보이는 기능
이고 좋아보였습니다.
저는 여기서 제가 포기한 자동완성 기능
에 대해 논해보고자 합니다.
어떤 포털사이트
를 사용하던 자동완성 기능은 대부분 지원
합니다.
바로 이게 핵심입니다. 여기서 중요한 키워드는 "포털 사이트"
는 대부분 이 기능을 지원한다는 것입니다.
저는 자동완성 기능
이 우리 서비스에 좋지 못한 사용자 경험을 줄거라고 생각하여 과감히 제외
했습니다.
자동 완성 기능
은 채팅을 치는 순간에도 끊임없이 API
를 호출
하며 빠른 응답을 보여줘야 합니다.
하지만, 저희 서비스 특성상 접근할 수 없는 비밀 채팅방
이나 게시판의 데이터는 볼 수 없어야 하므로 검색 API 호출시마다 접근이 가능한 채팅방 리스트
를 전부 조회합니다.
그렇다는 건 자동 완성 기능
을 지원하면 기존 데이터베이스
에도 상당한 부하를 줄 수 있고, 느린 자동 완성 기능으로 인해 오히려 사용자 경험
이 저하
될 수 있는 것입니다.
자동 완성
정도인데 그냥 접근 가능하지 않은 데이터 상관 없이 키워드
로 보여주면 안될까? 이런 생각도 했는데요.
이건 정말 큰일 날 생각
이기 때문에 절대 절대 하면 안되겠다고 5분
만에 생각을 바꿨습니다.
예를 들어서 "김부장님 대머리"
라는 채팅
이 있다고 해보겠습니다.
김부장님이 "김부각"
을 검색하려고 검색창에서 김ㅂ를 치자마자 "김부장님 대머리"
가 연관 검색어로 사용된다면, 김부장
님은 누군가가 자신을 대머리
라고 뒷담화 한것을 알게 될 것입니다.
서희 서비스는 다양한 팀
들이 사용하고 있고, 팀마다 도메인
이 다르며 특정 키워드
가 자주 검색된다는 특징도 보이지 않는 곳이 많습니다.
따라서 검색어 자동 완성 기능을 데이터 베이스
를 늘리면서까지 만들어서 출시했을때 사용자의 사용도가 높지 않고 만족도가 크지 않을것이라는 판단
에서 제거
하게 되었습니다.
저희는 AWS 서비스
를 사용하는데 AWS
는 비용이 드는 서비스이고 수많은 호출과 데이터 증가는 비용을 유발하기 때문입니다. 따라서 사용자 경험
을 생각하며 적절한 Trade-Off
가 필요했던 이유도 있습니다.
오늘은 검색 서비스
를 개편하는 장기 프로젝트를 맡으면서 고민하고 이 문제
를 풀어나간 이야기를 나눠봤습니다.
일부러 첫 글은 기술적인 내용
을 제외하고 제가 업무를 하면서 어떤 의사결정을 내렸는지에 대한 근거와 그 이유
와 고민
을 먼저 나눠보았습니다.
다음 게시글부터는 본격적으로 검색 개선
을 위해 투쟁한 한 귀여운 경력(?)
을 가진 주니어 개발자의 투쟁기를 끝까지 이어서 봐주시면 감사하겠습니다.
아주 아주 Chill Chill
맞지만 하루에 Chill
시간 동안 미Chill
듯이 달린 일대기를 기대해주세요!
아! 그리고 모두 Chill
한 하루 되세요
Ch Chill
Ch Chill
Ch Chill
Ch Chill
Ch Chill
Ch Chill
Ch Chill
Ch Chill
츠칠이네