[Spring] MongoDB 실행 쿼리 확인하는 방법 정리
스프링 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