Spring Boot 3와 Kotlin, MongoDB 환경에서 MongoRepository 외에도 사용할 수 있는 다양한 Repository 인터페이스와 클래스의 구조, 특징, 실전 활용법을 초보자도 이해할 수 있도록 쉽게 설명합니다. 각 Repository의 장단점, 선택 기준, 실전 예제, Custom Repository 구현법까지 모두 다룹니다.


Spring Data MongoDB의 Repository 계층 구조

Spring Data MongoDB에서 Repository 계층은 다음과 같이 구성됩니다.

  • Repository : 최상위 마커 인터페이스 (직접 사용 X)
  • CrudRepository : CRUD(생성/조회/수정/삭제) 기능 제공
  • PagingAndSortingRepository : 페이징/정렬 기능 추가
  • MongoRepository : MongoDB 특화 기능 추가
  • ReactiveMongoRepository : 리액티브 프로그래밍 지원
  • Custom Repository : 사용자 정의 쿼리/로직 구현

각 Repository 인터페이스별 특징 및 사용법

1. Repository
  • 모든 Repository의 최상위 인터페이스로, 마커 역할만 하며 직접 사용하지 않습니다.
2. CrudRepository
  • 기본적인 CRUD 연산을 제공합니다.
  • 대표 메소드: save, findById, findAll, delete
  • 예시:
    interface SimpleBookRepository : CrudRepository<Book, String>
    
3. PagingAndSortingRepository
  • CrudRepository 기능 + 페이징/정렬 기능 추가
  • 대표 메소드: findAll(Pageable), findAll(Sort)
  • 예시:
    interface PagingBookRepository : PagingAndSortingRepository<Book, String>
    
4. MongoRepository
  • MongoDB 특화 메소드(insert, findAllById 등) 추가
  • 대부분의 MongoDB 프로젝트에서 가장 많이 사용
  • 예시:
    interface BookRepository : MongoRepository<Book, String>
    
5. ReactiveMongoRepository
  • WebFlux 기반 리액티브 환경에서 비동기 데이터 처리를 지원
  • 대표 메소드: findAll(): Flux<T>, findById(id): Mono<T>, save(entity): Mono<T>
  • 예시:
    interface ReactiveBookRepository : ReactiveMongoRepository<Book, String>
    
6. Custom Repository (사용자 정의)
  • 복잡한 쿼리, 집계, 트랜잭션 등 고급 로직이 필요할 때 사용
  • 인터페이스와 구현 클래스를 따로 정의하고, 기존 Repository에 결합
  • 예시:
interface BookCustomRepository {
    fun findBooksByCustomLogic(param: String): List<Book>
}

class BookCustomRepositoryImpl(
    private val mongoTemplate: MongoTemplate
) : BookCustomRepository {
    override fun findBooksByCustomLogic(param: String): List<Book> {
        val query = Query(Criteria.where("customField").`is`(param))
        return mongoTemplate.find(query, Book::class.java)
    }
}

interface BookRepository : MongoRepository<Book, String>, BookCustomRepository

Repository 선택 가이드

  • 단순 CRUD만 필요하다면 CrudRepository로 충분합니다.
  • 페이징/정렬이 필요하다면 PagingAndSortingRepository를 사용하세요.
  • MongoDB 특화 기능이 필요하다면 MongoRepository가 가장 적합합니다.
  • 비동기/리액티브 환경이라면 ReactiveMongoRepository를 선택하세요.
  • 복잡한 쿼리/로직이 필요하다면 Custom Repository를 결합하여 사용하세요.

실전 예제: Book 도메인 기준

import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.Document
import org.springframework.data.mongodb.repository.MongoRepository
import org.springframework.data.repository.CrudRepository
import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.data.mongodb.repository.ReactiveMongoRepository
import org.springframework.data.mongodb.core.MongoTemplate
import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query

@Document(collection = "books")
data class Book(
    @Id val id: String? = null,
    val title: String,
    val author: String,
    val publishedYear: Int
)

// 1. CrudRepository
interface SimpleBookRepository : CrudRepository<Book, String>

// 2. PagingAndSortingRepository
interface PagingBookRepository : PagingAndSortingRepository<Book, String>

// 3. MongoRepository
interface BookRepository : MongoRepository<Book, String>

// 4. ReactiveMongoRepository
interface ReactiveBookRepository : ReactiveMongoRepository<Book, String>

// 5. Custom Repository
interface BookCustomRepository {
    fun findBooksByCustomLogic(param: String): List<Book>
}

class BookCustomRepositoryImpl(
    private val mongoTemplate: MongoTemplate
) : BookCustomRepository {
    override fun findBooksByCustomLogic(param: String): List<Book> {
        val query = Query(Criteria.where("author").`is`(param))
        return mongoTemplate.find(query, Book::class.java)
    }
}

interface BookRepositoryWithCustom : MongoRepository<Book, String>, BookCustomRepository

각 Repository의 장단점 비교

Repository 인터페이스 주요 특징 장점 단점
CrudRepository 기본 CRUD 제공 단순, 빠른 개발 페이징/정렬 미지원
PagingAndSortingRepository 페이징/정렬 지원 대량 데이터 처리에 유리 MongoDB 특화 기능 부족
MongoRepository MongoDB 특화 다양한 메소드, 실무 적합 리액티브 미지원
ReactiveMongoRepository 리액티브 지원 비동기 처리, 고성능 WebFlux 환경 필요
Custom Repository 사용자 정의 복잡한 로직 가능 직접 구현 필요

참고할 만한 공식 문서 및 레퍼런스

다양한 Repository를 상황에 맞게 선택하고, 필요시 Custom Repository로 확장하세요. 초보자도 쉽게 적용할 수 있습니다!