오늘은 저번시간에 이어서 Spring boot에서 지원해주는 Spring data nosql을 알아보자. 저번시간에 Redis, MongoDB, Neo4j, Gemfire 대해서 알아 봤으니 오늘은 Solr, Elasticsearch, Cassandra, Couchbase에 대해서 알아보도록 하자.

Solr

아파치 오픈소스인 Solr는 검색 엔진이다. 엘라스틱 서치와 비교가 많이 되는 대상이며 코어 검색 엔진으로는 엘라스티 서치와 동일하게 아파치 루씬을 이용해서 만들어 졌다. 아무래도 Solr 보다는 Elasticsearch가 더 많이 사용되고 있는 듯 하다.

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
  </dependency>
</dependencies>

위와 같이 spring-boot-starter-data-solr 를 디펜더시를 받으면 몇몇가지의 빈들이 자동으로 등록된다. 조금 이상한게 다른 nosql들은 *Template 클래스들을 모두 자동으로 등록 시켜주는데 solr같은 경우에는 SolrTemplate을 자동으로 빈으로 등록시켜주지 않는다. (필자가 못찾는건지)
그래서 만약 SolrTemplate을 사용하려면 몇가지 빈으로 등록시켜 줘야 한다.

@Bean
public SolrClient solrClient(SolrProperties solrProperties) {
  return new HttpSolrClient(solrProperties.getHost());
}

@Bean
public SolrTemplate solrTemplate() {
  return new SolrTemplate(solrClient(null));
}

단순하게 설정했으므로 만약 clustering을 한다면 좀 더 설정이 들어가야 될 듯하다.

@Component
public class PersonTemplate {

  private final SolrTemplate solrTemplate;

  public PersonTemplate(SolrTemplate solrTemplate) {
    this.solrTemplate = solrTemplate;
  }

}

위와 같이 수동으로 등록한 SolrTemplate을 사용하면 된다. 몇가지 solr 관련 properties도 지원하므로 아래와 같이 spring.data.solr. 시작하는 프로퍼티들을 설정해주면 된다.

spring.data.solr.*

만약 spring data repositories 처럼 사용하고 싶다면 이 역시 기존의 spring data 처럼 사용해도 된다.

public interface PersonRepository extends SolrCrudRepository<Person, String> {

}

이 것은 별다른 설정없이도 가능하다.

Elasticsearch

Elasticsearch도 Solr와 마찬가지로 검색엔진 스토어 이다. 이 역시 코어 검색 엔진으로는 아파치 루씬을 사용하고 있다. 이 역시 별다른 설정없이 디펜더시만 받으면 몇몇가지의 빈들을 자동으로 등록시켜준다.

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  </dependency>
</dependencies>

위와 같이 spring-boot-starter-data-elasticsearch만 디펜더시 받으면 된다. 그럼 ElasticsearchTemplate을 빈을 자동으로 등록시켜준다.

@Component
public class PersonTemplate {
  private final ElasticsearchTemplate elasticsearchTemplate;

  public PersonTemplate(ElasticsearchTemplate elasticsearchTemplate) {
    this.elasticsearchTemplate = elasticsearchTemplate;
  }
}

아무 설정 없이도 ElasticsearchTemplate을 사용할 수 있다. 이 역시 몇가지의 프로퍼티를 지원한다. spring.data.elasticsearch로 시작하는 프로퍼티를 사용하여 간단하게 설정정보를 변경할 수 있다.

spring.data.elasticsearch.*

또한 만약 만약 spring data repositories 처럼 사용하고 싶다면 위와 동일하게 ElasticsearchRepository 사용할 수 있다. 이 역시 별다른 설정없이 사용하면 된다.

public interface PersonRepository extends ElasticsearchRepository<Person, String> {

}

이 역시 메서드 이름 기반의 쿼리를 지원한다.

Cassandra

카산드라는 페이스북에서 만든 분산 데이타 베이스로 아파치 오픈소스이다. 이 역시 nosql의 한 종류이며 대용량 트랜잭션에 대해 고성능 처리가 가능하도록 설계된 데이터 스토어이다. 이 역시 Spring boot에서는 디펜더시만으로 몇몇가지의 빈을 자동설정 해준다.

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
  </dependency>
</dependencies>

위와 같이 spring-boot-starter-data-cassandra를 디펜더시 받으면 이 역시 CassandraTemplate도 자동으로 빈으로 등록시켜준다.

@Component
public class PersonTemplate {

  private final CassandraTemplate cassandraTemplate;

  public PersonTemplate(CassandraTemplate cassandraTemplate) {
    this.cassandraTemplate = cassandraTemplate;
  }
}

이 역시 적당한 설정의 프로퍼티들을 지원해주고 있다. spring.data.cassandra 로 시작하는 프로퍼티 키값을 사용하여 설정 정보를 변경할 수 있다.

spring.data.cassandra.*

이 또한 레포지토리로 사용할 수 있다. TypedIdCassandraRepository, CassandraRepository도 가능하지만 여기서는 사용하지 않았다. 왜냐하면 더 자세히 알아보지 않았기 때문이다..

public interface PersonRepository extends CrudRepository<Person, Long> {
}

자세한 내용은 문서를 참고하면 되겠다.

couchbase

Couchbase 또한 nosql의 한 종류이다. 상당한 성능을 갖고 있지만 우리나라에서는 그렇게 많이 쓰지는 않는 듯 하다. 이 것 또한 Spring boot에서는 간단하게 사용할 수 있다. 일단 아래와 같이 디펜더시를 받으면 몇몇 가지의 빈들을 자동설정 해준다.

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-couchbase</artifactId>
  </dependency>
</dependencies>

그러면 다들 알겠지만 CouchbaseTemplate이 자동으로 빈으로 등록되어 아무설정없이 사용해도 된다.

@Component
public class PersonTemplate {

  private final CouchbaseTemplate couchbaseTemplate;

  public PersonTemplate(CouchbaseTemplate couchbaseTemplate) {
    this.couchbaseTemplate = couchbaseTemplate;
  }
}

또한 다양한 설정 정보를 지원하기 위해 프로퍼티에 설정정보를 변경할 수 있다. spring.couchbase를 이용해서 설정 정보를 변경하면 된다.

spring.couchbase.*

카우치베이스 역시 spring data repositories처럼 사용가능하다.

@ViewIndexed(designDoc = "person")
public interface PersonRepository extends CouchbaseRepository<Person, String> {
}

위와 같이 CouchbaseRepository 이용해서 spring data repositories처럼 사용하며 된다.

여기서 설명한 모든 spring data repositories는 이름기반의 메서드를 지원하니 적당한 쿼리들은 이름 기반의 메서드를 작성해서 사용하면 좋을 듯 싶다.

오늘도 이렇게 Spring boot에서 지원해주는 spring data nosql에 대해서 알아봤다. 이제 어떤 nosql이 있고 어떤 자동설정이 있는지 살펴봤으니 다음시간에는 간단하게 예제를 살펴보도록 하자. 물론 아주 간단한 예제들이다..