티스토리 뷰

현재 '토이프로젝트 저장소'라는 주제로 개인 프로젝트를 진행하고 있다.

 

게시글에 달린 태그를 기준으로 게시글을 검색할 수 있도록 했는데 이때 자동완성 기능이 있으면 사용자 편의성이 높아질 것이라 생각해서 자동완성 기능을 구현하기로 결정했다.


기존상황

기존의 검색창으 Tagify 라이브러리를 사용하여 아래와 같이 검색할 수 있도록 구성했었다.

위 사진도 언뜻보면 자동완성이 되는 것 같지만 반은 맞고 반은 틀리다.

 

Tagify 라이브러리를 사용하면서 고정된 리스트에서 검색어와 태그의 prefix를 비교하여 동일한 데이터를 보여주도록 한 것이다. 따라서 사용자가 고정된 리스트에 없는 태그를 등록한다면 자동완성 데이터에 업데이트가 되지 않아 제대로된 자동완성이 동작할 수 없다.

 

그래서 이 문제를 해결하고자, 백엔드로부터 prefix가 동일한 완성단어 목록을 동적으로 가져와 보여주고 자동완성 데이터를 백엔드에서 업데이트하는 방식으로 개선하려고 했다.


자동완성 기능 고려사항 및 설계

"RDB를 사용하여 자동완성 기능 만들기" 

RDB를 사용한다면 간단히 like 연산자를 사용하여 테이블에서 prefix가 동일한 태그들을 불러올 수 있다. 

하지만 여러 단점이 존재한다.

  • 성능 문제
    • like 연산자를 사용하여 테이블을 Full-scan 하면 데이터의 크기가 커질수록 검색 시간이 증가한다.
    • 인덱스가 없는 경우 성능이 더욱 저하된다.
  • 커넥션 시간 및 서버 부하
    • 자동완성 기능은 대체로 다른 요청보다 짧은 주기로 요청을 보낸다. 이에 따라 DB와의 커넥션 사용에 있어 오버헤드가 발생할 것이라고 생각했다.
  • 사용자 경험
    • 자동완성은 빠른 응답이 중요한데 테이블 Full-Scan과 대용량 데이터에 따른 느린 응답 시간은 사용자 경험에 부정적인 영향을 미칠 것이라고 판단했다.

위 같은 이유들로 RDB로 자동완성 기능을 구성하는 것은 배제했다.


"캐시를 사용하여 자동완성 기능 만들기" 

두번째로 생각한 방법은 Redis나 Memcached 같은 캐시계층을 사이에 둬서 동작해보기로 했다.

 

자동완성에 대한 데이터를 특정 시간에 작업하여 미리 캐시서버에 올려놓는다면 사용자 경험은 물론이고 성능까지 생각하여 자동완성 기능을 만들 수 있을거라고 생각했다.

 

하지만 캐시같은 경우에도 문제점이 존재했다.

 

[데이터 동기화 시점 문제]

RDB와 캐시 사이의 데이터 동기화를 언제 시행할지의 문제이다.

 

1. 스프링 스케쥴러를 통해 주기적인 동기화

  • 주기적으로 동기화를 처리하므로 실시간 동기화보다는 시스템 부하가 적다.
  • 하지만 일시적으로 데이터 불일치가 발생하여 최신 데이터가 자동완성 기능에 반영되지 않는다.

2. 태그 데이터가 변경도리 때 마다 동기화

  • 데이터 일치성이 매우 높고, 실시간으로 검색어 자동완성 기능에 최신 데이터가 반영된다.
  • 데이터베이스 간의 실시간 동기화로 인해 시스템 부하가 증가할 수 있다.

 

나는 1번의 방법을 택했다.

 

자동완성의 경우 실시간 성이 그렇게 중요하지 않다고 판단했다.

왜냐하면 자동완성에 뜨지 않더라도 사용자가 검색한 단어가 게시글에 태그로 등록되어 있으면 검색이 되기 때문이다.


기능 블록도

위와 같은 순서로 자동완성 기능이 동작하도록 설계하였다.

 

Redis와 Memcached 중 Redis를 선택했는데 Redis가 다양한 자료구조를 지원해주기 때문이다.

 

다음글에서는 Redis의 어떤 자료구조를 사용했고 어떠한 방식으로 자동완성 데이터를 구성했는지 작성하겠다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함