두 글자 이상을 입력 받아 데이터를 검색하는 기능을 만들면서 쓴 글.

데이터를 검색 하는 방법

데이터를 검색 하는 방법은 여러가지가 있다.

첫째, string을 한글자씩 맞춰보며 일치하는 데이터를 리턴하는 방법이 있다. 예를들면 javascript의 include 메서드가 이렇게 검색을 한다. 둘째, 정규식을 이용해 일치하는 데이터를 리턴한다. 보통 SQL 에서는 LIKE 문을 이용해 구현한다. 셋째, 인덱스를 활용한다. 인덱스를 이용한 검색은 미리 문장을 형태소 단위로 쪼갠다. DB는 형태소 단위로 쪼개진 데이터들을 탐색한 후, 일치하는 데이터를 리턴한다.

세 가지 방법 모두 장, 단점이 있다. 첫번째와 두번째 방법은 쉽게 구현할 수 있으나 검색할 데이터의 양이 많아지면 많아질 수록 검색 속도가 느려진다. 세번째 방법은 데이터의 수와 상관 없이 일정하게 빠른 속도로 검색을 할 수 있지만, 형태소 단위로 쪼개진 데이터들을 저장할 공간이 필요하므로 첫번째와 두번째 방법보다 더 많은 저장공간이 필요하다.

어떤 방법을 선택할 것인지

정규식을 활용한 검색을 할 것이다.

이번에 만들 기능은 1년에 약 400개 정도의 새로운 데이터가 추가되는 테이블에서 컬럼 하나에 대해 검색하는 것이다. 컴퓨터의 연산은 매우 빠르다. 적은수의 데이터는 첫번째와 두번째 방법으로도 충분히 빠른 검색이 가능하다. 실제로 4,000여개의 데이터가 있는 테이블을 대상으로 검색을 시행했을 때, 108 ms 로 실제 사용 시 불편함을 느끼지 않을 정도로 빨랐다. 검색 기능이 도입 될 테이블이 약 4,000개의 데이터가 되려면 넉넉하게 계산해도 5년정도걸릴 것 같다. 그래서 현재는 정규식을 이용한 검색을 도입하고 추후 서비스가 더 커지게 되어 데이터가 급수적으로 늘어날 경우, 새로운 방식의 검색 방법을 도입하는 것이 좋겠다.

구현 방법

아래와 같은 sql like문을 활용할 예정이다. 다중 조건의 경우 AND 처리를 하려고한다.

--A를 포함하는 문자 찾기--
SELECT 컬럼명 FROM 테이블 WHERE 컬럼명 LIKE '%A%'
SELECT Customer.name, Book.bookname
FROM Customer, Orders, Book
WHERE Customer.Custid = Orders.Custid AND Orders.bookid = Book.bookid
      AND Book.saleprice = 20000;

SELECT * (이게되나...)
FROM Assessment_member_v1, Exam
WHERE Exam.id = Assessment_v1_member.exam_id AND 
Exam.title LIKE '%A%' AND Assessment_v1_member.status = 'completed'

Ref

https://www.mongodb.com/basics/full-text-search

https://coding-factory.tistory.com/114

http://bigdata.dongguk.ac.kr/lectures/DB/_book/여러-테이블의-결합을-통한-검색-join-검색.html