본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Document

[SpringBoot] 공식 문서 요약(8) - NoSQL 기술

by 김코더 김주역 2021. 12. 30.
반응형

SpringBoot Document Review 8

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/

 

 

 

NoSQL 기술

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-nosql.html

 

 

- Spring Boot는 NoSQL 기술인 Redis, MongoDB, Neo4j, Elasticsearch, Solr Cassandra, Couchbase, 그리고 LDAP에 대한 자동 설정을 제공한다.

1. Redis

- Redis는 캐시이자, 메시지 중개자이자, 풍부한 기능을 가진 key-value store이다.

- Spring Boot는 Lettuce와 Jedis 클라이언트 라이브러리에 대한 기본적인 자동 설정을 지원해주고, 이들을 기반으로 추상화를 해준다.

- "spring-boot-starter-data-redis" 라는 starter를 추가하여 사용할 수 있다. 이 starter은 기본적으로 Lettuce를 사용하며, 전통적인 반응형 애플리케이션들을 처리한다.

- 반응형 애플리케이션을 위해 "spring-boot-starter-data-redis-reactive" 라는 starter을 사용할 수도 있다.

 

Redis에 연결하기

- 우리는 자동 설정된 RedisConnectionFactory, StringRedisTemplate, 혹은 RedisTemplate 인스턴스를 Spring Bean으로 주입 받아 사용할 수 있다. 이들은 자동으로 Bean으로 등록되며, 기본적으로 "localhost:6379"에 연결을 시도한다.

@Component
public class MyBean {
	private StringRedisTemplate template;

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

- LettuceClientConfigurationBuilderCustomizer 인터페이스를 구현한 bean을 등록하여 커스터마이징이 가능하다. Jedis를 사용한다면 JedisClientConfigurationBuilderCustomizer 인터페이스를 이용하면 된다.

- 자동 설정된 타입에 @Bean을 추가한다면, 기본(자동 설정)값이 적용되지 않는다.

- 기본적으로 commons-pool2이 classpath에 있다면, 커넥션 풀(connection pool) factory를 사용하게 된다.

- 참고) RedisTemplate 사용 예시 : https://spring.io/projects/spring-data-redis#inject-redis-template

 

Spring Data Redis

Spring Data Redis, part of the larger Spring Data family, provides easy configuration and access to Redis from Spring applications. It offers both low-level and high-level abstractions for interacting with the store, freeing the user from infrastructural c

spring.io

 

 

 

2. MongoDB

- MongoDB는 전통적인 테이블 기반의 데이터가 아닌, JSON과 닮은 스키마를 사용하는 오픈소스 NoSQL 데이터베이스이다.

- Spring Boot는 spring-boot-starter-data-mongodb 스타터와 spring-boot-starter-data-mongodb-reactive 스타터를 제공한다.

 

1) MongoDB에 연결하기

- 자동 설정된 org.springframework.data.mongodb.MongoDbFactory를 주입 받아서 MongoDB에 접속할 수 있다. 기본적으로, 이 인스턴스는 "mongodb://localhost/test"로의 접속을 시도한다.

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();
		db.createCollection("users");
		db.getCollection("users").insertOne(
			new Document()
				.append("username","Kim Joo Yeok")
				.append("age", 25)
		);
	}
}

- Spring Data Mongo를 사용하지 않는다면 org.springframework.data.mongodb.MongoDbFactory 대신 com.mongodb.MongoClient Bean을 주입 받을 수도 있다. 그리고, 기본 설정을 적용하지 않고 직접 모든 제어를 해야 할 경우에는 별도의 MongoDbFactory 또는 MongoClient Bean을 정의하면 된다.

- spring.data.mongodb.uri 속성을 이용하면 MongoDB의 URL을 임의로 변경할 수 있고, 추가 설정까지 가능하다.

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test

- Mongo 2.x를 사용한다면, host와 port 옵션을 따로 지정할 수 있다. 단, Mongo 3.0 Java Driver을 사용하는 경우에는 이 속성을 사용할 수 없다.

spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017 # 기본값

- reactive driver을 사용중이라면, SSL을 사용하기 위해 Netty가 요구된다. 만약 Netty가 사용 가능한 상태이고 factory가 아직 커스터마이징되지 않았다면, factory는 자동 설정된다. 

 

 

2) MongoTemplate

- Spring Data MongoDB에서는 MongoTemplate 클래스를 제공하는데, 이는 Spring의 JdbcTemplate과 비슷한 디자인을 가진다.

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;
	}
    
	public void example() {
		Users user = new Users();
		user.setUsername("Kim Joo Yeok");
		user.setAge(25);
		mongoTemplate.insert(user);
	}
}

 

 

3) Spring Data MongoDB Repositories

- JPA Repository와 동일하게, 쿼리는 메소드명을 기반으로 구성된다. 단, Object는 JPA @Entity 대신 @Document를 사용하면 된다.

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

public interface CityRepository extends Repository<City, Long> {
    Page<City> findAll(Pageable pageable);
    City findByNameAndStateAllIgnoringCase(String name, String state);
}

- Scanning 위치는 @EntityScan 어노테이션을 사용하여 커스터마이징할 수 있다.

 

 

4) Embedded Mongo

- Spring Boot 애플리케이션 내에서 내장 Mongo를 사용하기 위해 de.flapdoodle.embed의  de.flapdoodle.embed.mongo라는 dependency를 추가하면 된다.

- spring.data.mongodb.port 속성을 이용하여 Mongo의 포트를 설정할 수 있는데, 포트를 랜덤으로 지정하려면 0으로 설정하면 된다. 기본적으로 내장 Mongo는 27017을 제외한 랜덤 포트를 사용한다.

- MongoAutoConfiguration에 의하여 생성되는 MongoClient는 포트가 랜덤으로 지정된다.

- SLF4J가 classpath에 있다면, Mongo의 출력은 자동으로 org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo라는 logger 속성과 연결된다.

org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo = debug

- Mongo 인스턴스의 설정을 직접 제어하기 위해 별도로 IMongoConfig와 IRuntimeConfig Bean들을 정의할 수 있다.

 

 

 

3. Neo4j

- Neo4j는 오픈 소스 NoSQL 그래프 데이터베이스이다.

- 많은 노드들이 연결되어 있는 구조이기 때문에 관계형 데이터를 다루기에 적합하다.

- Spring Boot는 spring-boot-starter-data-neo4j 스타터를 제공한다.

 

1) Neo4j 데이터베이스에 연결하기

- Neo4j 서버에 연결하기 위해, 자동 설정된 org.neo4j.ogm.session.Session 클래스를 주입받을 수 있다. 기본적으로, 이 인스턴스는 Bolt 프로토콜을 이용하여 localhost:7687으로 연결을 시도한다.

@Component
public class MyBean {

	private final Session session;

	@Autowired
	public MyBean(Session session) {
		this.session = session;
	}

	// ...
}

- 다음과 같이 spring.data.neo4j.* 속성을 사용하여 uri, username, password를 지정할 수 있다.

spring.data.neo4j.uri=bolt://my-server:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=secret

- 자동 설정 없이 Session의 생성을 모두 제어하고 싶다면, org.neo4j.ogm.config.Configuration 또는 org.neo4j.ogm.session.SessionFactory Bean을 추가한다.

 

 

2) Embedded Mode 사용하기

- org.neo4j의 neo4j-ogm-embedded-driver dependency를 추가하면, Spring Boot는 자동으로 프로세스 내에 Neo4j의 내장 인스턴스를 구성한다. 이 인스턴스는 애플리케이션이 종료되면 영속성이 유지되지 않는다.

※ dependency 추가가 안된다면 버전까지 명시해야 한다. (<version>${neo4j-ogm.version)<version>)

- 만약 classpath에 여러 드라이버들이 있다면, 내장 드라이버가 우선시 된다(Neo4j 테스트의 경우에도 해당). 그리고, spring.data.neo4j.embedded.enabled 속성을 false로 두면 내장 드라이버를 비활성화할 수 있다.

- 내장 모드에 대한 영속성을 활성화 하려면, 아래 예시와 같이 uri을 데이터베이스 file로 설정한다. 

spring.data.neo4j.uri=file://var/tmp/graph.d

 

 

3) Neo4jSession

- 웹 애플리케이션을 실행하면 기본적으로 요청의 전체 처리를 위해 Session을 쓰레드에 바인딩하는데(Open Session in View 패턴), 이러한 동작을 원하지 않는다면 다음과 같이 설정할 수 있다.

spring.data.neo4j.open-in-view=false

 

 

 

4) Spring Data Neo4j Repositories

- Neo4j는 Spring Data JPA와 공통 인프라 구조를 가진다.

- Entity 클래스에는 JPA의 @Entity 대신에 Neo4j OGM의 @NodeEntity를 사용할 수 있다.

import java.util.Optional;
import org.springframework.data.neo4j.repository.*;

public interface CityRepository extends Neo4jRepository<City, Long> {
	Optional<City> findOneByNameAndState(String name, String state);
}

- Repository, Entity의 Scanning 위치를 커스터마이징하기 위해, @Configuraion Bean에서 각각 @EnableNeo4jRepositories, @EntityScan 어노테이션을 사용할 수 있다.

 

 

 

 

 

반응형

댓글