백엔드/Spring

[Spring] ReactiveMongoTemplate vs ReactiveMongoRepository

작은소행성 2024. 11. 7. 22:09

ReactiveMongoTemplate과 ReactiveMongoRepository는 반응형 MongoDB 작업을 수행하는 두 가지 주요 방식이다.

 

ReactiveMongoRepository를 사용해야 하는 경우

ReactiveMongoRepository는 주로 기본적인 CRUD 작업을 간편하게 처리할 때 유용하다.

단순한 조회, 저장, 삭제 등의 작업이 자주 필요할 때는 repository가 더 직관적이고, 필요한 메서드들이 미리 정의되어 있어 코드가 간결해진다.

 

  • 단순한 CRUD 작업: 기본적인 조회(findById, findAll), 저장(save), 삭제(deleteById) 등의 작업
  • 메서드 이름을 통한 쿼리 정의: findByName, findByStatus 등 메서드 이름만으로 간단한 조건 기반 조회 수행
  • 반응형 스트림 기반 리턴: 대부분의 메서드가 Mono나 Flux로 결과를 반환하므로, 필요한 경우 직접적인 반응형 처리 가능

기본적인 데이터 저장과 조회 작업은 repository에서 쉽게 수행할 수 있다.

@Service
public class MyService {
    private final ResultRepository repository;

    @Autowired
    public MyService(ResultRepository repository) {
        this.repository = repository;
    }

    public Mono<Result> saveResult(Result result) {
        return repository.save(result);
    }

    public Flux<Result> getAllResults() {
        return repository.findAll();
    }
}

 

 

ReactiveMongoTemplate를 사용해야 하는 경우

ReactiveMongoTemplate은 더 복잡한 쿼리 작업을 수행하거나 커스텀 집계 쿼리가 필요할 때 적합하다.

특정 필드의 집계나 여러 조건을 결합한 복잡한 쿼리를 실행할 때 ReactiveMongoTemplate의 유연성을 활용할 수 있다.

  • 복잡한 집계(Aggregation) 작업: 여러 단계의 집계를 수행하거나, 특정 필드 기준으로 그룹화 등의 복잡한 쿼리를 구성할 때 
  • 다중 컬렉션 간의 조인: MongoDB에서 컬렉션 간의 조인이나 데이터 조작이 필요한 경우 
  • 조건에 따른 동적 쿼리 구성: 조건이 동적으로 결정되거나 여러 필터가 결합된 조회가 필요할 때

특정 필드에 대한 집계 작업을 수행할 경우 아래와 같이 작업하면 된다. 

public Flux<ResultSummary> getResultSummary() {
    Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.group("fieldName").count().as("total")
    );
    return mongoTemplate.aggregate(aggregation, "resultCollection", ResultSummary.class);
}

 

 

결론

  • 단순한 CRUD기본적인 조회는 ReactiveMongoRepository가 더 편리
  • 복잡한 쿼리커스텀 집계 작업에는 ReactiveMongoTemplate을 사용

두 가지를 함께 사용하면 기본 작업은 repository로 처리하고,

복잡한 쿼리는 mongoTemplate로 처리하는게 유연한 데이터 접근이 가능하다.

반응형