안녕하세요 스프링 데이터 JPA 강의를 듣다 질문이 생겨 문의드립니다.
토이프로젝트로 JPA를 사용하여 Mysql 전문검색(Full Text Search)를 해보는 중입니다.
public interface JpaMenuReviewRepository extends JpaRepository<MenuReview, Long> {
@Query(value = "SELECT * FROM menu_review WHERE MATCH (comments) AGAINST (:keyword IN NATURAL LANGUAGE MODE)", nativeQuery = true)
List<MenuReview> findMenuReviewByCommentsContainingOnFullTextSearchWithQuery(@Param("keyword") String keyword);
}
JPA에서는 Full Text Search를 지원하지 않아서 nativeQuery로 다음과 같이 쿼리문을 작성하였습니다.
그런데 전문검색을 위해서 Table의 컬럼에 Full index를 추가해야 전문검색 쿼리가 작동한다고 알고 있는데요,
JPA의 해당 특징은 "JPA의 DDL 자동 생성 기능" 또는 "JPA의 스키마 자동 생성 기능"으로 알고 있습니다.
이 기능은 JPA가 애플리케이션의 Entity 클래스를 분석하고, 이를 바탕으로 데이터베이스 스키마를 자동으로 생성하거나 업데이트하는 역할을 하여 @Entity
, @Table
, @Column
등의 애노테이션을 사용하여 엔티티 클래스를 정의하면, JPA는 이 정보를 바탕으로 필요한 테이블과 컬럼을 데이터베이스에 생성하는데요,
이럴 경우에는 제가 "ALTER TABLE tbl_query ADD FULLTEXT INDEX FullText
(`comments` ASC)" 해당 ddl문을 넣을 수 없어서 곤란한 상황입니다. JPA, Mysql에서는 Full Text Search를 사용할 수 없는 건가요? 차선책으로 Elastic Search, Postgre, Mongo를 구상중인데 차선책으로 우회해야할지 고민입니다.
추가로 실무에서는 전문검색 기능을 위해 어떤 방법을 쓰시는지, 관련해서 문의드리고 싶습니다.
강의내용과 동떨어져 있는 질문이라 죄송합니다.
안녕하세요. 하윤님
JPA를 사용하더라도 개발, 운영 데이터베이스의 DDL은 직접 데이터베이스에 생성하는 것이 좋습니다.
로컬 PC의 경우에는 추가적인 ALTER 명령어를 다음과 같이 사용할 수 있습니다. 다음 내용을 기반으로 검색해보시면 도움이 되실거에요.
hibernate init sql script
spring init sql script
실무에서는 용도마다 다릅니다. 아주 간단한 경우에는 db가 제공하는 full text search를 사용하고, 복잡한 경우에는 Elastic Search를 많이 사용합니다.
감사합니다.
답글