티스토리 뷰

반응형

Reative Repository를 만들어서 MongoDB 컬렉션에 데이터를 추가하거나 수정하겠습니다.

 

 

Data Class 생성

 

아래는 기본 data class의 구조입니다.

data class Customer(
        val id: Int = 0,
        val name: String = "",
        val telephone: Telephone? = null
)

data class Telephone(
        val countryCode: String = "",
        val telephoneNumber: String = ""
)

 

MongoDB에서 사용하려면 아래와 같이 수정해야 합니다.

 

@Document("Customers")
data class Customer(
        val id: Int = 0,
        val name: String = "",
        val telephone: Telephone? = null
)

data class Telephone(
        val countryCode: String = "",
        val telephoneNumber: String = ""
)

 

 

Repository 생성

Repository 인터페이스를 생성하였습니다.

interface CustomerRepository : ReactiveCrudRepository<Customer, Int>

Customer를 사용하여 데이터를 저장하고 고객을 조회하기 위해서는 id가 필요하기 때문에 id의 자료형인 Int를 지정하였습니다.

 

 

DatabaseInitializer를 아래와 같이 수정하였습니다.

@Component
class DatabaseInitializer(private val customerRepository: CustomerRepository) {

    companion object {
        val initialCustomers = listOf(
                Customer(1, "ImLeaf"),
                Customer(2, "Leaf"),
                Customer(3, "ImTae", Telephone("+82", "12341234"))
        )
    }

    @PostConstruct
    fun initCustomers() {

        customerRepository.saveAll(initialCustomers).subscribe{
            println("기본 Customers 생성 완료")
        }
    }
}

 

그리고 실행을 하면 아래와 같이 DB에 데이터가 들어간 것을 확인할 수 있습니다.

 

 

 

Reative Mongo Template 사용

데이터베이스에 CRUD 작업을 하기 위해서 ReactiveCrudRepository를 사용했지만 Mono나 Flux 같은 Reactive 타입으로 작업을 해야 되기 때문에 ReactiveMongoTemplate를 사용해야 합니다.

 

CustomerRepository에 @Repository 어노테이션을 추가합니다.

Repository 어노테이션을 추가한 클래스는 생성자에서 reactive 작업을 수행하는데 사용할 수 있는 ReactiveMongoTemplate 객체를 수신할 수 있습니다.

 

DatabaseInitializer 클래스를 삭제하고 아래와 같이 CustomerRepository를 수정합니다.

@Repository
class CustomerRepository (private val template: ReactiveMongoTemplate) {

    companion object {
        val initialCustomers = listOf(
                Customer(1, "ImLeaf"),
                Customer(2, "Leaf"),
                Customer(3, "ImTae", Telephone("+82", "12341234"))
        )
    }

    @PostConstruct
    fun initialRepository() = initialCustomers.map(Customer::toMono).map(this::create).map(Mono<Customer>::subscribe)

    fun create(customer: Mono<Customer>) = template.save(customer)
}

 

반응형
댓글