오랜만에 글을 남긴다. 개인적으로 하는 플젝이 있어서 거기에 당분간 집중해야 할 듯 해서 글을 자주 못남길거 같다. 물론 자주 글을 쓰면 좋지만..

오늘은 Spring boot에서 기본적으로 지원해주는 nosql이 어떤것들이 있는지 살펴보도록 하자.
Spring boot는 꽤 많은 nosql을 기본적으로 지원해주고 있다. 유명한 nosql들은 거의 다 지원해주니 만약 자신이 원하는 nosql이 없다면 만들어서 Spring boot에 기여해도 괜찮은 방법이라고 생각한다.

Redis

redis 경우에는 java 진영에서 redis 클라이언트로 유명한 jedis를 사용한다. maven 디펜더시만 받는 다면 몇몇가지의 빈이 자동으로 등록된다.

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

위와 같이 spring-boot-starter-data-redis를 디펜더시 받는다면 spring-data-redis와 jedis가 함께 디펜더시 받아진다. 그러면 RedisConnectionFactory, StringRedisTemplate, 기본적인 RedisTemplate 이 자동으로 빈으로 구성된다.

@Component
public class MyRedis {

  private final StringRedisTemplate stringRedisTemplate;

  public MyRedis(StringRedisTemplate stringRedisTemplate) {
    this.stringRedisTemplate = stringRedisTemplate;
  }
}

그럼 위와 같이 아무 설정 하지 않고 사용할 수 있다. 만약 redis의 정보들을 변경하고 싶다면 프로퍼티에서 변경하면 된다.

spring.redis.*  

spring.redis로 시작하는 프로퍼티들이 있으니 문서를 참고하면 되겠다. 기본적인 host와 port는 localhost와 redis기본 포트인 6379로 설정되어 있다. 만약 spring data repositories 처럼 사용하고 싶다면 기존의 spring data 처럼 사용해도 된다.

public interface AccountRepository extends CrudRepository<Account, String> {

  Account findByName(String name);
}

만약 classpath에 commons-pool2가 존재한다면 Pool Connection factory 가 생성된다. 또한 위와 같이 Query methods도 사용가능하다.

MongoDB

redis 경우에는 key value store이지만 (물론 이것만은 아니지만) mongo경우에는 전통적인 nosql document 데이터베이스이다. 이것 또한 디펜더시 하나로 몇몇가지의 빈을 자동설정을 해준다.

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

MongoDbFactory를 이용해서 직접적으로 mongodb와 연결 할 수 있다. 기본적으로 아무 설정 하지 않았을 경우에 host와 port는 mongodb://localhost/test 와 mongo의 기본 포트인 27017를 사용한다.

@Component
public class MyMongo {

  private final MongoDbFactory mongoDbFactory;

  public MyMongo(MongoDbFactory mongoDbFactory) {
    this.mongoDbFactory = mongoDbFactory;
  }

  public void findByname() {
    DB db = this.mongoDbFactory.getDb();
    //
  }
}

Mongo 2.x와 Mongo 3.x 드라이버의 설정 방법이 조금 다르다. 만약 2.x를 사용한다면 application.properties에 host와 port를 각각 작성해야 하지만 3.x의 경우에는 uri만 작성해주면 된다.

2.x

spring.data.mongodb.host=test
spring.data.mongodb.port=27017

3.x

spring.data.mongodb.uri=mongodb://localhost:12345,localhost:23456/test

또한 위와 같이 리플리케이션도 설정가능하다.

redis와 마찬가지로 쉽게 사용할 수 있도록 MongoTemplate을 지원한다.

@Component
public class MyMongo {

  private final MongoTemplate mongoTemplate;

  public MyMongo(MongoTemplate mongoTemplate) {
    this.mongoTemplate = mongoTemplate;
  }
}

mongodb 또한 repositories를 지원한다.

public interface AccountRepository extends MongoRepository<Account, String>{

  Account findByname(String name);
}

몽고 또한 JPA와 동일하게 메서드 이름 기반의 쿼리를 지원한다.

Neo4j

Neo4j는 그래프 데이터 베이스이다. 이것 또한 Spring boot는 디펜더시만으로 몇몇가지의 빈을 구성해준다.

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

위와 같이 디펜더시를 받는다면 Neo4jSession, Neo4jTemplate 두 클래스가 빈으로 등록 된다.(구현체만..)

@Component
public class MyNeo4j {
  private final Neo4jTemplate neo4jTemplate;

  public MyNeo4j(Neo4jTemplate neo4jTemplate) {
    this.neo4jTemplate = neo4jTemplate;

  }
}

위와 같이 별다른 설정 없이도 Neo4jTemplate을 사용할 수 있다. 하지만 이 클래스는 현재 Deprecated 되어있다. 그래서 spring에서는 Neo4jSession(org.neo4j.ogm.session.Session) 을 권장하고 있다.

@Component
public class MyNeo4j {
  private final Session session;

  public MyNeo4j(Session session) {
    this.session = session;
  }

  public Collection<Account> findAccount() {
    return this.session.loadAll(Account.class);
  }
}

Neo4j 또한 repositories를 사용할 수 있다. GraphRepository 혹은 Neo4jRepository 인터페이스를 사용하면 된다.

public interface AccountRepository extends GraphRepository<Account> {

  Account findByName(String name);
}

이것 역시 이름 기반의 쿼리를 지원한다.
만약 설정 정보를 변경하고 싶다면 application.properties에 spring.data.neo4j. 로 시작하는 프로퍼티의 값을 변경시켜주면 된다.

spring.data.neo4j.*

Gemfire

Gemfire는 redis와 비슷한 memcached기능을 갖고 있는 데이터 스토어이다. 캐시 용도로도 사용할 수 도 있다. 하지만 이것은 현재 자동 설정은 없다. 하지만 간단하게 디펜더시 받을 수있는 starter는 존재한다.

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

그리고 자동설정이 없으므로 @EnableGemfireRepositories 어노테이션을 작성해줘야 한다.

//@.. 
@EnableGemfireRepositories
public class GemFireApplication {
 // config
}

오늘은 spring boot의 spring data nosql 첫번째 시간이였다. 다음시간에는 Solr, Elasticsearch, Cassandra, Couchbase를 살펴보고 그 다음시간에는 간단하게 예제를 만들어 보는 시간을 갖도록 하자!.