저고데

[ElasticSearch]1. 스프링부트와 엘라스틱 서치 연동하기 본문

ElasticSearch

[ElasticSearch]1. 스프링부트와 엘라스틱 서치 연동하기

진철 2024. 1. 27. 18:14
728x90
반응형

본격적으로 스프링부트에 엘라스틱 서치를 연동하는 시간을 가져보자.

바로 게시글을 작성하려 했느나 너무 많은 문제점이 있었다.

그것은 바로 다른 블로그의 내용들이 하나도 되지 않는다는 점 ... 버전 차이 때문에 ...

그래서 정말 많이 삭제하고 설치하는 과정을 반복한 끝에 드디어 문제를 해결하였다.

도커를 이용해 이미지를 직접 다운 받는 것도 있지만 필자는 직접 다운을 받았고 아직은 키바나와의 연동은 하지 않았다.

엘라스틱 서치 다운 및 실행

https://www.elastic.co/kr/downloads/elasticsearch

 

Download Elasticsearch

Download Elasticsearch or the complete Elastic Stack (formerly ELK stack) for free and start searching and analyzing in minutes with Elastic....

www.elastic.co

위의 사이트로 접속하여 본인의 운영체제에 알맞는 버전을 다운하자.

필자는 m1 맥북 에어를 사용중이기 때문에 macOS aarch64를 다운하였다.

cd Downloads/elasticsearch-8.12.0
./bin/elasticsearch

다운로드 후, 해당 커맨드로 엘라스틱 서치를 실행해준다.

그런데 !! 여기서 첫번째 문제점을 발견하였다.

엘라스틱 서치는 기본적으로 9200번 포트를 사용한다.

분명 실행을 했음에도 불구하고 ... 연결이 안되더라.

다른 블로그에서는 실행이 잘 되던데 왜 내 것만 이럴까 머리를 굴리고 있던 도중 ..

해당 문제는 바로 Authorization 보안 문제임을 알아냈다.

엘라스틱 서치의 버전 8부터는 보안 문제를 신경쓰기 때문에 위와 같이 id, password를 입력해야 접속이 가능하다고 한다. (기본 아이디는 elastic이며, 비밀번호는 다운로드 시 로그 창에 알려준다.)

근데 이게 너무너무 귀찮아서 보안을 해제할 방법을 찾아본 결과 !

ingest.geoip.downloader.enabled: false
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
xpack.security.http.ssl.enabled: false

elasticsearch내의 config 내의 elasticsearch.yml 파일에 다음과 같은 코드를 입력하여 보안 설정 없이 접속할 수 있다는 것을 확인하였다.

짠 ! 문제 없이 출력이 잘 되는 것을 확인할 수 있다.

 

스프링 부트와 엘라스틱 서치를 연동해보자

가장 어려운 부분이었다.

엘라스틱 서치 역시 DB의 일종이기 때문에 MySQL과 연결했을 때처럼 application.properties에 host 및 admin의 정보를 입력해야 되는 것 아닌가? 생각했다.

그리고 무엇보다 블로그마다 방법들이 다 다르고 중요한건 내가 했을 때, 모두 적용되지 않는 방법들이었다.

가장 큰 이유는 아마 버전이 달라서이지 않나라는 생각이 든다.

spring.elasticsearch.uris=localhost:9200

우선 application.properties에 다음과 같이 작성해준다.

IntelliJ에서 자동으로 엘라스틱 서치 연동에 관한 설정을 제공하는 부분이다.

@Document(indexName = "user")
public class User {

    @Id
    private String id;

    private String name;

    private Integer age;
}

그리고 사용자 정보를 엘라스틱 서치에 저장할 것이기 때문에 다음과 같이 User 도메인 코드를 작성한다.

기존의 JPA와 다른 점은 @Document 어노테이션을 사용한다는 점이다.

그리고 @Entity와 같이 사용하게 될 경우, 충돌할 가능성이 있어서 프로젝트에 도입할 때는 따로 새로운 도메인을 만들 예정이다.

여기서 indexName은 JPA에서의 테이블명이라고 보면 된다.

@Repository
public interface UserRepository extends ElasticsearchRepository<User, String> {
}

그리고 스프링부트에서 엘라스틱 서치 레포지토리 역시 제공하기 때문에 이를 기반으로 인터페이스를 작성해주었다.

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void saveUser(User user) {
        userRepository.save(user);
    }

    public void deleteUser(User user) {
        userRepository.delete(user);
    }

    public Iterable<User> getAllUsers() {
        return userRepository.findAll();
    }

    public User getUserById(String id) {
        return userRepository.findById(id).orElse(null);
    }
}

레포지토리를 기반으로 서비스 코드 역시 작성해주었다.

안에 내장되어있는 메소드는 JPA 코드와 유사하기 때문에 편의성이 높다는 장점을 느꼈다.

User user = new User();
user.setId("1");
user.setName("John Doe");
user.setAge(20);
userService.saveUser(user);

그러면 마지막으로 임의의 데이터를 저장하고 불러와보자!

"localhost:9200/인덱스명" 형태로 현재 저장된 인덱스에 대한 정보를 불러온다.

포스트맨에서 보이듯이 "user"라는 인덱스가 잘 불러와지는 것을 확인할 수 있다.

그리고 "localhost:9200/인덱스명/_search"를 통해서 현재 인덱스에 저장된 데이터들을 모두 불러올 수 있다.

이전에 테스트로 저장한 "John Doe"의 데이터가 잘 저장된 것을 확인할 수 있다.

그리고 현재 로컬 호스트에서 작동되는 엘라스틱 서치의 경우에는 elasticsearch 폴더 내의 data 폴더 안에 저장되기 때문에 사용을 종료하고 재시작해도 계속 저장된다.

 

오늘은 이렇게 엘라스틱 서치를 다운하고 스프링부트에 연동시키는 작업을 해보았다.

버전에 따라 사용법이 너무 다양해서 어려움을 많이 겪었던 것 같다. (그래서 도커가 각광받는 것인가?)

다음 시간에는 40000개의 데이터를 각각 엘라스틱 서치와 MySQL에 저장하였을 때, 속도 차이가 얼마나 나는지에 대해서 알아보도록 하겠다.

728x90
반응형