본문 바로가기
백엔드/Spring

[Spring] mongodb, mongodb-reactive Dependency 차이

by 작은소행성 2024. 10. 31.

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를 사용하는 것이 좋은 것 같다.

반응형