스프링 MongoDB 라이브러리와 쿼리
스프링에서 제공되는 MongoDB 라이브러리를 사용하면, 단순히 MongoRepository를 상속 받는 인터페이스를 만드는 것만으로도 필요한 쿼리를 모두 만들어준다.
예를 들어 다음과 같은 books 컬렉션을 만들고, Book Document를 이 컬렉션에 저장한다고 해보자.
@Document(collection = "books")
data class Book(
@Id
val id: String? = null,
val bookName: String,
val description: String
)
그러면 해당 역할을 하는 BookRepository는 다음과 같이 만들 수 있다.
interface BookRepository : MongoRepository<Book, String>
BookRepository가 MongoRepository를 상속 받으면, Spring의 MongoDB 라이브러리는 런타임에 BookRepository 인터페이스를 구현하는 구현체를 자동으로 생성하고, 컨테이너에 해당 객체의 인스턴스를 등록한다. 따라서 다음과 같이 언제든지 주입 받을 수 있다.
@Service
class BookService(private val bookReposiory: BookRepository) {
fun get(id: String): Book {
return bookReposiory.findById(id).get()
}
}
하지만, 이렇게 BookRepository의 인스턴스를 만들면, 이 라이브러리가 어떤 쿼리를 만드는지 알 수 없다. 이를 확인하기 위해 다음과 같은 컨트롤러를 만들고 애플리케이션을 실행해보자.
@Controller
class BookController(
private val bookService: BookService
) {
@GetMapping("book/get")
suspend fun getBook(
@RequestParam id: String
): ResponseEntity<Book> {
return ResponseEntity.ok(bookService.get(id))
}
}
이후 임의의 Book Document를 만들어 books 컬렉션에 삽입한다. 모양은 다음과 같다.
이제 다음과 같은 HTTP Request를 실행해보자.
GET http://localhost:8081/book/get?id=661279d6cd52fd66ab26e9bf
그러면 응답은 정상적으로 오지만, 실행되는 쿼리와 관련된 로그도 나오지 않는 것을 확인할 수 있다.
디버깅 옵션 추가해 쿼리 확인하기
실행되는 쿼리를 확인하기 위해서는 다음과 같은 옵션을 application.properties 파일에 추가해야 한다.
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
위 옵션이 적용된 application.properties 파일의 모양은 다음과 같다.
이제 다시 스프링애플리케이션을 실행하고 같은 HTTP 요청을 실행해보자. 그러면 다음과 같은 로그가 생성되는 것을 볼 수 있으며, 어떤 쿼리를 사용했는지 확인할 수 있게 된다.
findOne using query: { "id" : "661279d6cd52fd66ab26e9bf"} fields: Document{{}} for class: class com.kotlinworld.testserver.mongo.Book in collection: books