mongoTemplate 낯선 문법

2023. 4. 27. 01:34Project/memo

MongoTemplate은 Spring Data MongoDB에서 제공하는 MongoDB와의 상호작용을 담당하는 클래스다.

이를 통해MongoDB의 데이터를 생성, 조회, 수정, 삭제하는 CRUD 작업을 포함한 다양한 작업을 수행할 수 있다.

MongoTemplate은 MongoDB의 Java Driver를 기반으로 동작한다.

@Bean
    fun mongoTemplate(mongoClient: MongoClient): MongoTemplate {
        return MongoTemplate(mongoClient, "DBName")
    }

MongodbConfig 클래스에 MongoTemplate을 return해 Bean으로 등록하는 메소드를 작성했다.

override fun find(userId : String, diaryId : String): Diary? {
        val query = Query()
        query.addCriteria(Criteria.where("userId").`is`(userId).and("diaryId").`is`(diaryId))
        return mongoTemplate.findOne(query, Diary::class.java)
    }

db repository의 구현체의 메소드를 작성했다. Query() 클래스의 객체로 query를 만들어야한다. 이는 Spring Data MongoDB에서 제공한다.

query의 문법이 특이해서 기록한다. Criteria라고 Spring Data MongoDB에서 제공하는 클래스를 이용해 query를 완성할 수 있다.

‘is’

is 는 코틀린에서 type check에 사용하는 연산자로 예약어다.

if (x is String)

이런식으로 사용한다.

따라서 예약어와 구분하기 위해 backtick (`)을 이용해서 감싸준다.

Diary::class.java

 fiindOne 메소드는 Query 객체와 검색 대상 collection(MongoDB의 개념)의 클래스 타입을 인자로 받는다. 따라서 반환하려는 데이터의 타입(클래스)을 인자로 받아 반환 시 그 데이터 타입(클래스)의 인스턴스를 반환하게 된다.

 위의 예시에서는 Diary가 코틀린으로 작성된 클래스이기 때문에 ::(멤버 참조 연산자)를 사용해 Diary의 java 클래스를 참조한다. 왜냐하면 java 클래스와 Kotlin 클래스는 다르게 컴파일되기 때문에 서로 완전히 호환되지 않을 수 있기 때문이다. 이번 경우는 MongoDB의 Java Driver을 사용할 때 호환 문제 때문에 java 클래스를 참조하는 처리를 해준다.