Spring/MongoDB

[Spring] MongoDB 실행 쿼리 확인하는 방법 정리

Dev.Cho 2024. 4. 21. 07:05

스프링 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 컬렉션에 삽입한다. 모양은 다음과 같다.

 

그림1. 임의의 Book Document 추가하기

 

이제 다음과 같은 HTTP Request를 실행해보자.

GET http://localhost:8081/book/get?id=661279d6cd52fd66ab26e9bf

 

그러면 응답은 정상적으로 오지만, 실행되는 쿼리와 관련된 로그도 나오지 않는 것을 확인할 수 있다.

 

그림2. HTTP 요청과 응답

 

디버깅 옵션 추가해 쿼리 확인하기

실행되는 쿼리를 확인하기 위해서는 다음과 같은 옵션을 application.properties 파일에 추가해야 한다.

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

 

위 옵션이 적용된 application.properties 파일의 모양은 다음과 같다.

 

그림3. 쿼리 디버깅 옵션 추가하기

 

이제 다시 스프링애플리케이션을 실행하고 같은 HTTP 요청을 실행해보자. 그러면 다음과 같은 로그가 생성되는 것을 볼 수 있으며, 어떤 쿼리를 사용했는지 확인할 수 있게 된다.

 

findOne using query: { "id" : "661279d6cd52fd66ab26e9bf"} fields: Document{{}} for class: class com.kotlinworld.testserver.mongo.Book in collection: books

 

그림4. 로깅 화면

 

 

반응형