Spring Boot 3 + Kotlin + MongoDB: 다양한 Repository 인터페이스 완전 정복
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로 확장하세요. 초보자도 쉽게 적용할 수 있습니다!