# 29. NoSQL 기술 사용 by sh

**Spring Data는 MongoDB, Neo4J, Elasticsearch, Solr, Redis, Gemfire, Couchbase 및 Cassandra를 포함한 다양한 NoSQL 기술에 액세스하는 데 도움이되는 추가 프로젝트를 제공합니다. Spring Boot는 Redis, MongoDB, Elasticsearch, Solr 및 Gemfire에 대한 자동 구성을 제공합니다.** 다른 프로젝트를 사용할 수는 있지만 직접 구성해야합니다. projects.spring.io/spring-data에서 해당 참조 문서를 참조하십시오.

{% hint style="info" %}
NoSQL No SQL? Not Only SQL? Non-Relational Operational Database SQL?

* Not Only SQL. 단순히 기존 관계형 DBMS가 갖고 있는 특성뿐만 아니라 다른 특성들을 부가적으로 지원한다는 것을 의미.
  * 기존의 관계형 데이터베이스보다 더 융통성 있는 데이터 모델을 사용하고 데이터의 저장 및 검색을 위한 특화된 메커니즘을 제공한다.&#x20;
    * 그 중 하나! 이를 통해 NoSQL 데이터베이스는 단순 검색 및 추가 작업에 있어서 매우 최적화된 키 값 저장 기법을 사용하여 응답속도나 처리 효율 등에 있어서 매우 뛰어난 성능을 나타낸다.
      {% endhint %}

### 29.1 Redis

**Redis는 캐시, 메시지 브로커 및 풍부한 기능의 키 - 값 저장소입니다.** Spring Boot는 Jedis 클라이언트 라이브러리의 기본 자동 구성과 Spring Data Redis가 제공하는 추상화를 제공합니다. 의존성을 편리한 방식으로 수집하기위한 **`spring-boot-starter-redis`** 'starter POM'이 있습니다.&#x20;

{% hint style="info" %}
Redis&#x20;

* Remote Dictionary Server. 대용량 처리 관련 기술.&#x20;
* 메모리 위에서 동작하는 키/값 저장 기술.&#x20;
  {% endhint %}

#### 29.1.1 Redis 연결

**다른 Spring Bean처럼 자동 구성된 `RedisConnectionFactory`, `StringRedisTemplate` 또는 vanilla `RedisTemplate` 인스턴스를 삽입 할 수 있습니다.** 기본적으로 인스턴스는 `localhost:6379`를 사용하여 Redis 서버에 연결을 시도합니다 :&#x20;

```java
@Component
public class MyBean {

    private StringRedisTemplate template;

    @Autowired
    public MyBean(StringRedisTemplate template) {
        this.template = template;
    }

    // ...

}
```

자동으로 구성된 유형 중 `@Bean`을 추가하면 기본값을 대체합니다 (`RedisTemplate`의 경우 예외는 해당 유형이 아닌 'redisTemplate'bean 이름을 기반으로합니다). `commons-pool2`가 클래스 경로에 있으면 기본적으로 풀링 된 연결 팩토리가 생성됩니다.&#x20;

### 29.2 MongoDB

**MongoDB는 전통적인 테이블 기반 관계형 데이터 대신 JSON 형 스키마를 사용하는 오픈 소스 NoSQL 문서 데이터베이스입니다.** Spring Boot는 **`spring-boot-starter-data-mongodb`** 'Starter POM'을 포함하여 MongoDB와 함께 작업 할 때 몇 가지 편의를 제공합니다.&#x20;

#### 29.2.1 MongoDB 데이터베이스 연결

**자동화 된 `org.springframework.data.mongodb.MongoDbFactory`를 삽입하여 Mongo 데이터베이스에 액세스 할 수 있습니다.** 기본적으로 인스턴스는 `mongodb://localhost/test` URL을 사용하여 MongoDB 서버에 연결을 시도합니다.&#x20;

```java
import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;

@Component
public class MyBean {

    private final MongoDbFactory mongo;

    @Autowired
    public MyBean(MongoDbFactory mongo) {
        this.mongo = mongo;
    }

    // ...

    public void example() {
        DB db = mongo.getDb();
        // ...
    }

}
```

**`spring.data.mongodb.uri`속성을 설정하여 `url`을 변경하거나 호스트 / 포트를 지정할 수 있습니다.** 예를 들어, `application.properties`에 다음을 선언 할 수 있습니다.

```
spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017
```

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/images/tip.png) |
| ----------------------------------------------------------------------------------------------------- |
| spring.data.mongodb.port가 지정되지 않은 경우 기본값 27017이 사용됩니다. 위의 샘플에서 이 줄을 삭제하면됩니다.                          |

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/images/tip.png) |
| ----------------------------------------------------------------------------------------------------- |
| Spring Data Mongo를 사용하지 않는다면 MongoDbFactory를 사용하는 대신 com.mongodb.Mongo beans를 주입 할 수 있습니다.            |

또한 MongoDB 연결 설정을 완벽하게 제어하려면 자신의 MongoDbFactory 또는 Mongo bean을 선언 할 수 있습니다.

#### 29.2.2 MongoTemplate

**Spring Data Mongo는** [**`MongoTemplate`**](https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/MongoTemplate.html) **클래스를 제공한다.**&#xC774; 클래스는 Spring JdbcTemplate과 디자인 면에서 매우 유사하다. `JdbcTemplate`와 마찬가지로 Spring Boot는 간단하게 삽입 할 수 있도록 bean을 자동으로 구성합니다.&#x20;

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final MongoTemplate mongoTemplate;

    @Autowired
    public MyBean(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    // ...

}
```

자세한 내용은 MongoOperations Javadoc을 참조하십시오.

#### 29.2.3 Spring Data MongoDB 리포지토리들

**Spring Data는 MongoDB에 대한 저장소 지원을 포함합니다. 앞에서 설명한 JPA 저장소와 마찬가지로 기본적으로 메소드 이름을 기반으로 쿼리가 자동으로 생성됩니다.**

**실제로 Spring Data JPA와 Spring Data MongoDB는 동일한 공통 인프라를 공유합니다.** 따라서 이전에 JPA 예제를 사용할 수 있었고 City가 JPA @Entity가 아닌 Mongo 데이터 클래스라고 가정하면 같은 방식으로 작동합니다.

```java
package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*;

public interface CityRepository extends Repository<City, Long> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndCountryAllIgnoringCase(String name, String country);

}
```

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/images/tip.png)                                 |
| ------------------------------------------------------------------------------------------------------------------------------------- |
| 풍부한 객체 매핑 기술을 포함하여 Spring 데이터 MongoDB에 대한 자세한 내용은 [reference documentation](https://projects.spring.io/spring-data-mongodb/)를 참조하십시오. |

### 29.3 Gemfire

**Spring Data Gemfire는 Pivotal Gemfire 데이터 관리 플랫폼에 액세스하기위한 편리한 Spring 친화적 도구를 제공합니다.** 의존성을 편리한 방식으로 수집하기위한 **spring-boot-starter-data-gemfire** 'starter POM'이 있습니다. 현재 Gemfire에 대한 auto = config 지원은 없지만 하나의 주석으로 Spring Data Repository를 활성화 할 수 있습니다.

### 29.4 Solr

**Apache Solr는 검색 엔진입니다. Spring Boot는 solr 클라이언트 라이브러리의 기본 자동 구성과 Spring Data Solr가 제공하는 추상화를 제공합니다.** 의존성을 편리한 방식으로 수집하기 위한 **spring-boot-starter-data-solr** 'Starter POM'이 있습니다.

{% hint style="info" %}
NoSQL 기술 중 하나. NoSQL의 특징과 같이 특정한 문제 해결에 최적화 됨&#x20;

확장가능(Scalable)하고 바로 사용가능(Ready to deplay)하며 대용량(High volume) 검색에 최적화된 프로그램. 자연어 검색(Text-centric)을 지원하며 검색 후 결과는 연관성(Relevance)별로 출력된다.

* &#x20;Scalable(확장가능) - Solr는 인덱싱과 쿼리처리를 (클러스터로 묶여진 다수의 서버)에 분배함으로써 확장할 수 있다.&#x20;
* Ready to deploy(바로 사용가능) - Solr는 오픈소스이며 쉽게 설치하고 설정할 수 있다. 예제 코드도 제공된다.&#x20;
* Optimized for search(검색에 최적화됨) - Solr는 빠릅니다. 복잡한 쿼리도 1초 미만의 속도로 처리할 수 있습니다. 보통 10ms (0.1초) 정도면 결과를 출력합니다.&#x20;
* Large volumes of documents(대용량의 문서처리) - Solr는 수백만의 문서를 처리할 수 있도록 설계되었습니다.&#x20;
* Text-centric(일상언어 사용) - Solr는 일상언어를 다룰 수 있게 최적화 되었습니다. 이메일이나 블로그, 트위터, 웹페이지등 다양한 내용을 다룰 수 있습니다.&#x20;
* Results sorted by relevance(적합도에 의해 정렬) - Solr의 처리결과는 사용자의 질의(User's query)에 대해 연관도에 대해서 정렬되며 각 결과에 연관정보 수치를 표시해 줍니다.
  {% endhint %}

#### 29.4.1 Solr 연결

**다른 Spring Bean과 마찬가지로 자동 구성된 SolrServer 인스턴스를 삽입 할 수 있습니다.** 기본적으로 인스턴스는 localhost:8983/solr을 사용하여 서버에 연결을 시도합니다.

```java
@Component
public class MyBean {

    private SolrServer solr;

    @Autowired
    public MyBean(SolrServer solr) {
        this.solr = solr;
    }

    // ...

}
```

SolrServer 유형의 @Bean을 추가하면 기본값으로 바뀝니다.

#### 29.4.2 Spring Data Solr 리포지토리들

**Spring 데이터에는 Apache Solr에 대한 저장소 지원이 포함됩니다. 앞에서 설명한 JPA 저장소와 마찬가지로 기본적으로 메소드 이름을 기반으로 쿼리가 자동으로 생성됩니다.**

**사실, Spring Data JPA와 Spring Data Solr은 동일한 공통 인프라를 공유합니다.** 따라서 JPA 예제를 이전 버전에서 가져 와서 City가 JPA @Entity가 아닌 @SolrDocument 클래스라고 가정하면 같은 방식으로 작동합니다.

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/images/tip.png)         |
| ------------------------------------------------------------------------------------------------------------- |
| Spring Data Solr에 대한 자세한 내용은 [reference documentation](https://projects.spring.io/spring-data-solr/)를 참조하십시오. |

### 29.5 Elasticsearch

**Elastic Search는 오픈 소스, 분산, 실시간 검색 및 분석 엔진입니다.** Spring Boot는 Spring Data Elasticsearch에서 제공하는 Elasticsearch의 기본 자동 구성과 추상화를 제공합니다. 의존성을 편리한 방식으로 수집하기위한 **spring-boot-starter-data-elasticsearch** 'Starter POM'이 있습니다.

#### 29.5.1 Elasticsearch 연결

**다른 Spring Bean처럼 자동 구성된 ElasticsearchTemplate 또는 Elasticsearch Client 인스턴스를 삽입 할 수 있습니다.** 기본적으로 인스턴스는 로컬 인 메모리 서버 (Elasticsearch 용어로 NodeClient)에 연결을 시도하지만 spring.data.elasticsearch.clusterNodes를 쉼표로 구분하여 '호스트 : 포트'목록을 설정하여 원격 서버 (예 : TransportClient)로 전환 할 수 있습니다.

```java
@Component
public class MyBean {

    private ElasticsearchTemplate template;

    @Autowired
    public MyBean(ElasticsearchTemplate template) {
        this.template = template;
    }

    // ...

}
```

lasticsearchTemplate 유형의 @Bean을 추가하면 기본값을 대체합니다.

#### 29.5.2 Spring Data Elasticsearch 리포지토리들

**Spring 데이터는 Elasticsearch에 대한 저장소 지원을 포함합니다. 앞에서 설명한 JPA 저장소와 마찬가지로 기본적으로 메소드 이름을 기반으로 쿼리가 자동으로 생성됩니다.**

**실제로 Spring Data JPA와 Spring Data Elasticsearch는 동일한 공통 인프라를 공유합니다.** 따라서 이전에 JPA 예제를 사용할 수 있었고 City가 JPA @Entity가 아닌 Elasticsearch @Document 클래스라고 가정하면 같은 방식으로 작동합니다.

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/images/tip.png)                            |
| -------------------------------------------------------------------------------------------------------------------------------- |
| Spring Data Elasticsearch에 대한 자세한 내용은 [reference documentation](https://docs.spring.io/spring-data/elasticsearch/docs/)를 참조하십시오. |
