이전 게시물을 통해 엘라스틱 서치와 키바나를 다운받았다.
엘라스틱 서치를 통해 검색기능을 구현하기 위해, 이제 스프링과 엘라스틱 서치를 연결시켜보려한다.
먼저 검색로직은 아래와 같다.
사용자가 제목,내용,작성자명으로 검색을 할 수 있다.
그러면 엘라스틱 서치에는 id(이때 id는 rdb에 저장된 id이다),제목,내용,작성자명만 저장한다.
사용자가 검색한 키워드에 맞게 엘라스틱 서치를 통해 조회해온다.
사용자에게 검색에 맞는 목록을 뿌려주고, 사용자가 상세조회 할 시에는 엘라스틱 서치에서 가져온 id값으로 RDB에서 조회하여
RDB에서 작성시간이라든가, 좋아요 개수라든가 다른 모든 데이터를 포함해 보여주면 된다.
1.yml 설정

spring:
elasticsearch:
uris: http://localhost:9200
username: elastic
password: passme123
*이전 게시물 도커 파일을 보면 비밀번호로 passme123을 설정해놓았는데,
혹시나 비밀번호 설정이 잘되었는지 먼저 localhost:9200 으로 들어가면 로그인창이 바로 뜰것이다.
로그인이 안되어있다면 비밀번호가 잘못 세팅이 되어있다는 것이다.
그러면 아래방식으로 비밀번호를 초기화하자.
-1.아래 명령어로 엘라스틱서치 컨테이너 터미널창으로 접속.
docker exec -it elasticsearch bash
-2. cd bin 으로 bin폴더로 이동.
-3.그 위치에서 elasticesearch-reset-password -u elastic 입력하여 비밀번호 리셋 실행.
-4. 그러면 아래 사진처럼 New value 하고 비밀번호가 자동 생성하는데 그것을 yml의 password 부분에 다시 작성하면 된다.

2.gradle 작성
//jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//엘라스틱 서치
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
기존에 JPA를 사용하고 있었다면 엘라스틱 서치 라이브러리만 입력하면 된다.
3.엘라스틱 서치용 엔티티 클래스 작성
@Document(indexName = "post_index") //ES 인덱스 이름
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class PostDocument {
@Id
private Long id;
private String content;
private String authorId;
}
기존의 JPA를 사용했다면 @Entity 어노테이션을 붙여 RDB용 엔티티 클래스를 만드는 것처럼, 엘라스틱 서치를 JPA로 이용하려면, @Document 어노테이션을 사용하면 된다.
이 클래스에서는 Post의 모든 컬럼(속성)을 작성할 필요가 없다.
우리는 검색용으로 엘라스틱 서치를 사용하는 것이기 때문이다.
나는 내용이나 작성자명으로 검색을 가능하게 할 것이기 때문에 엘라스틱 서치에는 내용이나 작성자만 저장시키면 된다(만약 제목으로도 검색시킬 것이면 당연히 제목도 엘라스틱 서치에 저장시켜야할 것이다)
여기서 말하는 id값은 RDB에 있는 id이다.
사용자가 내용이나 작성자명으로 검색시키면 엘라스틱 서치는 빠르게 조회해 해당 Document(RDB에서는 row 개념)를 가져올 것이다. 그리고 사용자가 상세조회를 하려고 하면 엘라스틱 서치를 통해 빠르게 가지고 온 document에는 id값도 저장되어있으므로
이 id값으로 rdb에서 조회해오면 되는 것이다.
4.엘라스틱 서치에 저장
그래서 사용자가 게시글을 작성하려할 때는 rdb뿐만 아니라 엘라스틱 서치에도 동시에 저장시켜야한다.\
예를 들어, 사용자가 게시글 작성한 데이터를 받는 DTO에다 하나는 RDB용으로 변환시키는 메서드, 하나는 엘라스틱 서치용으로 변환시키는 메서드를 두고 , 서비스 단에서 RDB와 엘라스틱 서치 각각에 저장시키는 것이다.
// 1.게시글 생성
public Long createPost(PostCreateReqDto dto, List<MultipartFile> pictures) {
postRepository.save(dto.toPostEntityFromCreateReqDto());// RDB에 저장
postDocumentRepository.save(dto.toPostEsFromCreateReqDto()); //ES에 저장
}
물론 그럴려면 아래의 엘라스틱 서치 JPA레포지토리를 먼저 만들어놓아야한다.
5. 엘라스틱 서치용 JPA 레포지토리 생성
@Repository
public interface PostDocumentRepository extends ElasticsearchRepository<PostDocument,Long> {
}
6.그리고 게시물 생성 API를 날려 엘라스틱 서치에 데이터를 저장시킨다.
포스트맨 등을 이용해 직접 API를 실행시켜 엘라스틱 서치에 데이터를 저장시킨다.
7.localhost:5601 로 키바나 화면에 접속
좌측 상단 메뉴탭을 누르고 , Discover탭으로 이동한다.

그러면 데이터가 있기에 이렇게 뷰를 만들수 있다는 창이 뜨는 create data view 를 클릭한다.
좌측에는 엘라스틱 서치내의 인덱스(RDB에서 테이블 개념) 가 뜬다.
Name에는 아무렇게나 입력하고 index pattern에 index이음을 입력하여 완료하면

이렇게 정상적으로 데이터가 저장된 것을 확인할 수 있다.

'스프링부트 > ELK' 카테고리의 다른 글
| [ELK] 로그스태시 도커로 다운 받기(+설정 및 연결) (1) | 2025.09.24 |
|---|---|
| [ELK]엘라스틱 서치, 키바나 도커로 다운로드 (4) | 2025.09.18 |