Showing posts with label mysql. Show all posts
Showing posts with label mysql. Show all posts

Thursday, September 7, 2023

Spring bootとMySQLを使用した全文検索機能の実装

SpringbootとMySQLを使用した全文検索機能の実装

この文書では、SpringbootとMySQLを使用して基本的な全文検索機能を実装する方法を紹介します。

1. MySQL Full-Text 対応テーブルの作成

MySQLで全文検索を使用するには、該当するテーブルにFULLTEXTインデックスを作成する必要があります。以下の例のように必要なカラムにFULLTEXTインデックスを作成します。

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT (title, content)
) ENGINE=InnoDB;

2. Spring BootプロジェクトでMySQLに接続

Spring BootからMySQLに接続するには、pom.xmlにMySQL Connector/Jの依存関係を追加する必要があります:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

次に、application.propertiesファイルに次のようにMySQLの接続情報を設定します:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3. Articleエンティティとリポジトリの作成

ArticleエンティティとArticleRepositoryを作成して、データベースとの接続を確立します:

import javax.persistence.*;

@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    // 省略:ゲッター、セッター、コンストラクタ
}
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}

4. 全文検索のためのカスタムクエリの作成

ArticleRepositoryにカスタムクエリを作成して、MySQLの全文検索機能を活用できるようにします:

import org.springframework.data.jpa.repository.Query;

@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
    @Query(value = "SELECT * FROM articles WHERE MATCH (title, content) AGAINST (?1)", nativeQuery = true)
    List<Article> fullTextSearch(String keyword);
}

これで、fullTextSearchメソッドを使用してタイトルとコンテンツにキーワードを含むすべての記事を検索できます。

5. 検索機能を使用するREST APIの実装

検索機能を使用するREST APIを実装するには、Spring Webの依存関係も追加する必要があります:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

次に、検索コントローラを作成します:

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    // 依存性注入
    public ArticleController(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

    @GetMapping("/search")
    public List<Article> search(@RequestParam String keyword) {
        return articleRepository.fullTextSearch(keyword);
    }
}

これにより、/api/articles/search?keyword=検索語エンドポイントを介して検索機能を使用できます。

必要に応じて、全文検索機能をカスタマイズまたは拡張できます。この文書ではSpringとMySQLを使用して基本的な全文検索機能を実装する方法を紹介しました。必要な検索機能を適用するために、このガイドを参照してください。

Tuesday, May 30, 2023

Springboot와 MySQL을 사용하여 Full-Text 검색 기능 구현하기

Springboot와 MySQL을 사용하여 Full-Text 검색 기능 구현하기

이 문서에서는 Spring과 MySQL을 사용하여 기본 Full-Text 검색 기능을 구현하는 방법을 소개합니다.

1. MySQL Full-Text 지원 테이블 생성

MySQL에서 Full-Text 검색을 사용하려면 해당 테이블에 FULLTEXT 인덱스를 만들어야 합니다. 아래 예시와 같이 필요한 열에 FULLTEXT 인덱스를 생성합니다:

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT (title, content)
) ENGINE=InnoDB;

2. Spring Boot 프로젝트에 MySQL 연결

Spring Boot에서 MySQL에 연결하려면 pom.xml에 MySQL Connector/J 의존성을 추가해야 합니다:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

그리고, application.properties 파일에 다음과 같이 MySQL 연결 정보를 설정합니다:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3. Article Entity 및 Repository 생성

Article Entity 및 ArticleRepository를 생성하여 데이터베이스와 연결을 설정합니다:

@Entity
public class Article {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    // 생략: Getters, Setters, and Constructors
}
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}

4. Full-Text 검색을 위한 Custom Query 생성

ArticleRepository에 Custom Query를 생성하여 MySQL의 Full-Text 검색 기능을 활용할 수 있도록 합니다:

@Query(value = "SELECT * FROM articles WHERE MATCH (title, content) AGAINST (?1)", nativeQuery = true)
List<Article> fullTextSearch(String keyword);

이제 fullTextSearch 메소드를 사용하여 제목과 내용에 일치하는 키워드를 포함하는 모든 기사를 검색할 수 있습니다.

5. 검색 기능을 사용하는 REST API 구현

검색 기능을 사용하는 REST API를 구현하려면 Spring Web 의존성도 추가해야 합니다:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

이제 검색 컨트롤러를 생성할 수 있습니다:

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    // 의존성 주입 
    public ArticleController(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

   @GetMapping("/search")
   public List<Article> search(@RequestParam String keyword) {
       return articleRepository.fullTextSearch(keyword);
   }
}
 

이렇게 하면 /api/articles/search?keyword=검색어 엔드포인트를 통해 검색 기능을 사용할 수 있습니다.

필요에 따라 Full-Text 검색 기능을 커스터마이징하거나 확장할 수 있습니다. 이 문서는 Springboot와 MySQL을 사용하여 기본 Full-Text 검색 기능을 구현하는 방법을 소개하였습니다. 원하는대로 검색 기능을 적용하기 위해 이 가이드를 참조하세요.

Implementing Full-Text Search Functionality Using Spring and MySQL

Implementing Full-Text Search Functionality Using Spring and MySQL

This document introduces how to implement basic full-text search functionality using Spring and MySQL.

1. Create MySQL Full-Text Supported Table

To use full-text search in MySQL, you need to create a FULLTEXT index on the relevant table. Create the FULLTEXT index on the required columns as shown in the example below:

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT (title, content)
) ENGINE=InnoDB;

2. Connect MySQL to a Spring Boot Project

To connect MySQL to a Spring Boot application, you need to add the MySQL Connector/J dependency to your pom.xml:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

Then, configure the MySQL connection information in the application.properties file as follows:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3. Create Article Entity and Repository

Create the Article entity and ArticleRepository to establish a connection with the database:

@Entity
public class Article {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    // Omitted: Getters, Setters, and Constructors
}
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}

4. Create Custom Query for Full-Text Search

Create a custom query in the ArticleRepository to leverage MySQL's full-text search functionality:

@Query(value = "SELECT * FROM articles WHERE MATCH (title, content) AGAINST (?1)", nativeQuery = true)
List<Article> fullTextSearch(String keyword);

Now you can use the fullTextSearch method to search for all articles containing keywords in the title and content.

5. Implement REST API for Using the Search Functionality

To implement a REST API that uses the search functionality, you also need to add the Spring Web dependency:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

You can now create a search controller:

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    // Dependency injection 
    public ArticleController(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

   @GetMapping("/search")
   public List<Article> search(@RequestParam String keyword) {
       return articleRepository.fullTextSearch(keyword);
   }
}
 

This allows you to use the search functionality through the /api/articles/search?keyword=search_term endpoint..

You can customize or extend your full-text search functionality as needed. This document introduced how to implement basic full-text search functionality using Spring and MySQL. Please refer to this guide to apply the search functionality as desired.

SpringとMySQLを用いた全文検索機能の実装

SpringとMySQLを使用した全文検索機能の実装

この文書では、SpringとMySQLを使用して基本的な全文検索機能を実装する方法を紹介します。

1. MySQL全文検索対応テーブルの作成

MySQLで全文検索を使用するには、該当するテーブルにFULLTEXTインデックスを作成する必要があります。以下の例のように必要な列にFULLTEXTインデックインデックスを作成します。

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT (title, content)
) ENGINE=InnoDB;

2. MySQLをSpring Bootプロジェクトに接続

MySQLをSpring Bootアプリケーションに接続するには、pom.xmlにMySQL Connector/Jの依存関係を追加する必要があります。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

次に、application.propertiesファイルに以下のようにMySQLの接続情報を設定します。

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3. Articleエンティティとリポジトリの作成

データベースとの接続を確立するために、ArticleエンティティとArticleRepositoryを作成します。

@Entity
public class Article {
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String title;
  private String content;

  // 省略:Getter、Setter、およびコンストラクタ
}
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}

4. 全文検索用のカスタムクエリの作成

ArticleRepositoryにカスタムクエリを作成して、MySQLの全文検索機能を活用します。

@Query(value = "SELECT * FROM articles WHERE MATCH (title, content) AGAINST (?1)", nativeQuery = true)
List<Article> fullTextSearch(String keyword);

これで、fullTextSearchメソッドを使用してタイトルとコンテンツにキーワードが含まれるすべての記事を検索できます。

5. 検索機能を使用するためのREST APIの実装

検索機能を使用するREST APIを実装するには、Spring Webの依存関係も追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

これで、検索コントローラーを作成できます。

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    // 依存性注入(Dependency Injection)
    public ArticleController(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

    @GetMapping("/search")
    public List<Article> search(@RequestParam String keyword) {
        return articleRepository.fullTextSearch(keyword);
    }
}

これにより、/api/articles/search?keyword=検索キーワードエンドポイントを介して検索機能を使用できます。

必要に応じて、全文検索機能をカスタマイズまたは拡張できます。この文書では、SpringとMySQLを使用して基本的な全文検索機能を実装する方法を紹介しました。必要な全文検索能力を適用するためにこのガイドラインを参照してください。

Monday, February 8, 2021

AWS EC2에서 Out of Memory 문제 해결 방법

AWS EC2 인스턴스에서의 메모리 문제 해결 방법

AWS의 EC2 인스턴스를 사용하면서 Spring Boot와 MySQL로 서비스를 배포하다가 서버 다운 문제에 직면하셨나요? 이 글에서는 그런 문제를 어떻게 해결했는지 공유드리겠습니다.

문제 상황

매일 한 번씩 서버가 다운되었습니다. 처음에는 로그 관리를 하지 않아 원인을 알 수 없었습니다.

AWS 콘솔에서의 문제 확인

AWS 콘솔의 EC2 항목에서 Monitor and Troubleshoot 기능을 이용하여 확인해 보니, 익숙한 메시지를 발견했습니다. OOM(Out of Memory)와 관련된 문제였습니다. 프리티어에서 제공하는 메모리가 1GB밖에 없어서 발생하는 것으로, 스왑 메모리 설정이 필요함을 알게 되었습니다.

aws console EC2
aws console EC2

문제 해결 방법

먼저 관리자 계정으로 로그인합니다.(EC2 관리자 계정 비밀번호를 설정하지 않았다면, 최초 설정 후 로그인이 가능합니다.) 그 후 아래 명령어들을 실행하여 스왑 메모리를 설정합니다:

root# dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048
root# sudo mkswap /mnt/swapfile
root# swapon /mnt/swapfile

free 명령어로 스왑 메모리가 설정되었는지 확인할 수 있습니다.

결과 확인

제대로 설정되었다면, 서버가 정상으로 구동되는 것을 확인할 수 있습니다. 이전에 비슷한 문제를 경험하셨다면, 같은 원인 때문이 아닐까 추정됩니다.

참고:

https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/

Tuesday, November 6, 2018

AWS에 spring과 mysql 환경 구축시 서버가 자꾸 느려지거나 꺼질 경우

AWS 프리티어 사용 시 서버 성능 저하 문제와 DB 연결 관리

AWS 프리티어를 사용하여 개발 서버를 운영하다가 어느 순간부터 서버의 응답 속도가 느려져서 재부팅을 해야하는 상황이 발생한 경험에 대해 이야기해보겠습니다.

문제 상황

처음에는 AWS 프리티어의 특성상 성능이 떨어지거나, 사용량 제한을 초과해서 그런 것으로 생각했습니다. 하지만, 데이터베이스를 RDS로 옮긴 후에는 서버가 다운되거나 응답 속도가 느려지는 현상이 확연하게 줄었습니다.

원인 분석

원인을 추측해보면, 데이터베이스 연결(DB connection)을 열고 닫는 코드가 없어서 발생한 문제 같습니다. 이로 인해 데이터베이스 연결 자원이 과도하게 소모되었고, 이로 인해 서버 성능 저하 현상이 발생한 것으로 보입니다.

DB Connection 관리 중요성

데이터베이스 연결은 한정된 자원입니다. 따라서 필요할 때만 열고, 작업 완료 후에는 반드시 닫아주는 것은 매우 중요합니다. 이를 통해 자원의 효율적인 활용과 함께 시스템의 안정성을 유지할 수 있습니다.

조언

AWS에서 개발서버를 운영하면서 갑자기 서버 응답 속도가 느려진다면 DB connection 관리 상태를 확인하는 것도 하나의 해결 방안일 수 있습니다.

Monday, August 20, 2018

MySQL에서 이모티콘 설정, utf8mb4 적용해도 동작하지 않을때

MySQL에서 이모티콘 설정: utf8mb4 적용이 제대로 안될 때 해결방법

MySQL 5.5.3 이상의 버전을 사용하고 있다면, 이모티콘 처리를 위해 charset을 utf8에서 utf8mb4로 변경하는 것만으로도 충분합니다. 하지만 경우에 따라서는 컬럼, 테이블, 또는 DB의 캐릭터셋을 utf8mb4로 변경해도 문제가 해결되지 않는 경우가 있습니다.

저와 같은 상황에 직면하신다면 my.cnf 파일의 값을 변경해야 합니다. 일반적으로 이 파일은 /etc/mysql/my.cnf 위치에 있지만, 설정에 따라 다른 위치에 있을 수도 있습니다.

my.cnf 파일을 에디터로 열어 "utf8"이라고 되어있는 모든 부분을 "utf8mb4"로 변경한 후 MySQL 서비스를 재시작(service mysql restart)하시면 됩니다. 그러면 이모티콘이 정상적으로 동작하는 것을 확인할 수 있습니다.