spring 에서 mongodb 를 사용하려고 하는데 두개의 dependency 정보가 있었다.
이중 어떤 것을 사용하는것이 좋은지에 대해 찾아 보았다.
spring-boot-starter-data-mongodb
- 동기 방식
- 호출 시 요청이 완료될 때까지 코드 실행이 멈춘다.
- 전통적인 블로킹 방식
- 각 요청에 대해 독립적인 쓰레드가 할당되므로, 다수의 데이터 요청이 있을 때 많은 시스템 리소스를 사용한다.
- 간단한 API 호출에 유리
- 데이터베이스 호출이 적거나 동기 방식으로 데이터를 처리해도 성능에 영향이 없는 경우에 적합하다.
- MongoTemplate
- MongoTemplate과 MongoRepository를 사용하여 데이터를 CRUD 할 수 있다.
import org.springframework.data.mongodb.core.MongoTemplate;
public class MyService {
private final MongoTemplate mongoTemplate;
public MyService(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
public List<MyData> getAllData() {
return mongoTemplate.findAll(MyData.class);
}
}
@Repository
public interface AggregatedResultRepository extends MongoRepository<AggregatedResult, String> {
}
// mongodb
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
spring-boot-starter-data-mongodb-reactive
- 반응형(리액티브) 방식
- 요청과 응답 모두 비동기로 처리하여 리소스 소비를 줄이고 응답성을 높다.
- 논블로킹 방식
- 쓰레드가 요청 완료를 기다리지 않고 다른 작업을 처리할 수 있어 고성능, 대규모 애플리케이션에서 유리하다.
- 고성능 및 리소스 효율적인 앱에 적합
- 특히 I/O가 많은 상황(예: 외부 API 호출, 데이터베이스 요청 등)에서 성능이 중요한 경우 사용하면 좋다.
- ReactiveMongoTemplate 사용
- 반응형 ReactiveMongoTemplate과 ReactiveMongoRepository를 사용해 처리한다.
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import reactor.core.publisher.Flux;
public class MyReactiveService {
private final ReactiveMongoTemplate reactiveMongoTemplate;
public MyReactiveService(ReactiveMongoTemplate reactiveMongoTemplate) {
this.reactiveMongoTemplate = reactiveMongoTemplate;
}
public Flux<MyData> getAllData() {
return reactiveMongoTemplate.findAll(MyData.class);
}
}
@Repository
public interface AggregatedResultRepository extends ReactiveMongoRepository<AggregatedResult, String> {
}
// mongodb
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
차이점
spring-boot-starter-data-mongodb | spring-boot-starter-data-mongodb-reactive | |
I/O 방식 | 블로킹 (동기) | 비블로킹 (비동기) |
반환 타입 | 일반 객체 (List, Optional 등) | 반응형 스트림 (Mono, Flux) |
적용 모델 | MVC | WebFlux 기반 |
스레드 관리 | 요청 하나당 하나의 스레드 | 요청당 스레드 차지 없음 |
적합한 상황 | 낮은 트래픽 간단한 CRUD |
높은 트래픽 실시간 데이터 처리 비동기 환경 |
spring-boot-starter-data-mongodb와 spring-boot-starter-data-mongodb-reactive의 차이점은 데이터 처리 방식에 있다.
spring-boot-starter-data-mongodb와 spring-boot-starter-data-mongodb-reactive를 같이 사용하면 충돌이 발생할 수 있다.
이 둘은 서로 다른 리포지토리 유형을 사용하므로 같이 사용하는 것은 피하는 것이 좋다.
각 의존성은 MongoTemplate와 ReactiveMongoTemplate을 제공하는데, 두 템플릿이 모두 포함되면 Spring이 어느 하나를 선택할 때 혼란을 겪을 수 있다.
작은 프로젝트나 간단한 CRUD는pring-boot-starter-data-mongodb 를
고성능과 높은 확장성을 요구하는 상황에서는 spring-boot-starter-data-mongodb-reactive를 사용하는 것이 좋은 것 같다.
반응형
'백엔드 > Spring' 카테고리의 다른 글
[Spring] ReactiveMongoTemplate vs ReactiveMongoRepository (0) | 2024.11.07 |
---|---|
[Spring] MongoDB 조회 - Stream, Aggregation 비교 (0) | 2024.11.04 |
[Spring] AES 암호화를 CBC 모드로 구현하기 (0) | 2024.07.30 |
[Spring] 스프링 AOP 포인트컷 (0) | 2024.05.21 |
[Spring] Spring AOP 구현 예제 (0) | 2024.05.17 |