서비스 만들기 CustomerService를 만들었습니다. interface CustomerService { fun getCustomer(id: Int): Mono } CustomerRepository에 아래의 코드를 추가하였습니다. @Repository class CustomerRepository (private val template: ReactiveMongoTemplate) { ... fun findById(id: Int) = template.findById(id) } 그리고 impl 클래스를 만들었습니다. @Component class CustomerServiceImpl(private val customerRepository: CustomerRepository) : CustomerService {..
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 = "", ..
프로젝트 생성하기 https://start.spring.io/#!type=maven-project&language=kotlin&platformVersion=2.3.3.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.imtae&artifactId=chapter5&name=chapter5&description=study&packageName=com.imtae.chapter5&dependencies=data-mongodb-reactive,webflux 위와 같이 프로젝트를 생성해줍니다. 프로젝트 시작하기 프로젝트 폴더 안에 data 폴더를 생성한 후 프로젝트 폴더에서 아래 명령을 입력합니다. mongod -dbpath data 그리고 프로젝트의 application.ym..
몽고DB 설치 https://www.mongodb.com/try/download/community MongoDB Community Download Download the Community version of MongoDB's non-relational database server from MongoDB's download center. www.mongodb.com 본인 OS에 맞는 버전을 다운로드합니다. bin 폴더 아래에 있는 두 개의 프로그램을 원하는 위치에 설치 가능합니다. mongod - 데이터베이스 서버 mongo - 클라이언트 환경 변수 설정 다운로드한 폴더 안에 bin을 환경 변수 설정을 해줍니다. 데이터베이스 생성 프로젝트 폴더에서 data 폴더를 생성합니다. mkdir data 그리고 아..
리액티브 마이크로서비스를 만들 때 어떤 오류도 정상적으로 처리해야 됩니다. 따라서 리액터 프레임워크는 이런 오류를 처리하기 위한 메커니즘을 제공합니다. 핸들러에서 오류 찾기 핸들러를 만들 때 오류가 발생할 수 있으며 이런 오류는 리액티브 게시자 onErrorResume에서 특별한 방법으로 처리 가능합니다. @Component class CustomerHandler(private val customerService: CustomerService) { ... fun create(serverRequest: ServerRequest) = customerService.createCustomer(serverRequest.bodyToMono()).flatMap { created(URI.create("/function..
RouterFunction 사용 클라이언트에서 오는 요청을 Controller로 대신 RouterFunction을 사용해 처리할 수 있습니다. @Component class CustomerRouter { @Bean fun customerRouters(): RouterFunction = router { "/functional".nest { } } } 새 컴포넌트로 생성했기 때문에 빈이 노출되면 컴포넌트 스캔을 통해 새로운 방식의 RouterFunction을 만들고 경로를 정의합니다. 위의 코드 같은 경우에는 /functional 경로의 모든 요청을 처리합니다. 코드를 아래와 같이 수정하였습니다. @Component class CustomerRouter { @Bean fun customerRouters():..
구독자와 게시자 리액티브 프로그래밍의 핵심 구성 요소에는 구독과 게시가 있습니다. 리액티브 프로그래밍은 이벤트가 감지되면 필요한 사용자에게 전송되는 이벤트 모델을 기반으로 합니다. UI에서 버튼을 누르는 것과 같은 이벤트를 수신하고자 할 때 정의하는 것이 구독자입니다. 반대로 이벤트를 생성하는 것이 게시자라고 생각하면 됩니다. 스프링에서는 리액터 프레임워크를 사용해서 리액티브 마이크로서비스를 만듭니다. 컨트롤러는 결과의 게시자가 될 수 있으며, 스프링은 서비스를 사용하는 모든 사용자에게 데이터를 보내기 위해 이벤트를 구독합니다. 이 데이터는 리액티브 스트림 사양에 정의된 대로 리액티브 스트림으로 전송돼 논블로킹의 배압을 제공합니다. Mono 리액터에서는 모노라는 클래스를 통해 하나의 결과를 보내는 게시자..