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
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 어노테이션을 사용할 수 있다.
'Spring Series > Document' 카테고리의 다른 글
[SpringBoot] 공식 문서 요약(10) - Actuator Endpoint (0) | 2022.01.15 |
---|---|
[SpringBoot] 공식 문서 요약(9) - RestTemplate, WebClient (0) | 2022.01.08 |
[SpringBoot] 공식 문서 요약(7) - SQL 데이터베이스 (0) | 2021.12.19 |
[SpringBoot] 공식 문서 요약(6) - Security, OAuth2 (0) | 2021.11.27 |
[SpringBoot] 공식 문서 요약(5) - 내장 서블릿 컨테이너 (0) | 2021.11.25 |
댓글