좋은 어플리케이션을 만들기 위해서는 3가지 요소를 고려하여야 한다. Responsiveness, Elasticness, Resilience이다.
RxJava 설정하기
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.1.0</version>
</dependency>
RxJava는 어떻게 동작하는가?
public class DzoneDBDao {
private static DzoneDBDao service = new DzoneDBDao();
public static DzoneDBDao get() {
return service;
}
DZoneDoc[] getAllDocFromDB() {
return produceDocs();
}
private DZoneDoc[] produceDocs() {
DZoneDoc[] array = {
DZoneDoc.create("Java Microservice", "Refcardz"),
DZoneDoc.create("RX Java", "Article"),
DZoneDoc.create("IOT in Action", "Refcardz"),
DZoneDoc.create("Java8 in Action", "Refcardz"),
};
return array;
}
}
위의 함수는 mock database로 사용하기 위한 것이다.
public class DZoneDoc {
private String name;
private String type;
private DZoneDoc() {}
public static DZoneDoc create(String name, String type) {
DZoneDoc doc = new DZoneDoc();
doc.setName(name);
doc.setType(type);
return doc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "DZoneDoc [name=" + name + ", type=" + type + "]";
}
}
import io.reactivex.Observable;
public class DZoneSearchService {
Observable < DZoneDoc > getAllDocs() {
return Observable.fromArray(DzoneDBDao.get().getAllDocFromDB());
}
}
위의 Observable은 RxJava에서 가장 중요한 추상클래스이다. 이제 RxJava의 구성요소들을 하나씩 살펴보자.
RxJava - Observable
Observable < DZoneDoc > getAllDocs() {
return Observable.fromArray(DzoneDBDao.get().getAllDocFromDB());
}
RxJava - Observer
Observer 3가지 액션
- OnNext : 데이터/이벤트가 내보내질 때 호출이 됨.
- OnError : 데이터를 가져오다가 에러가 나는 경우 호출이 됨
- OnCompleted : Observable가 모든 데이터를 보내고 나서 호출이 됨
public class DZoneUI {
private DZoneSearchService dzoneService = new DZoneSearchService();
public void printAllDocs() {
dzoneService.getAllDocs().subscribe(System.out::println); //dzonedocs
}
public static void main(String[] args) {
DZoneUI UI = new DZoneUI();
UI.printAllDocs();
}
}
실제 개발에서는 search service는 REST API로 호출될 것이다. RxJava를 적용한 REST API 개발을 할 때, Spring 5 Reactive Web을 사용하면 된다. ( 이와 관련된 포스팅은 다음에! )
Map 함수 이용하기
public class DZoneUI {
private DZoneSearchService dzoneService = new DZoneSearchService();
public void printAllDocsName() {
dzoneService.getAllDocs().map(doc - > doc.getName()).subscribe(System.out::println); // dzonedocs
}
public static void main(String[] args) {
DZoneUI UI = new DZoneUI();
UI.printAllDocsName();
}
}
RxJava - Dynamic Filtering
import io.reactivex.observables.GroupedObservable;
public class DZoneUI {
private DZoneSearchService dzoneService = new DZoneSearchService();
public void printJavaRefCardz() {
dzoneService.getAllDocs().filter(docs - > "Refcardz".equalsIgnoreCase(docs.getType()))
.filter(doc - > doc.getName().contains("Java"))
.subscribe(System.out::println); // dzonedocs
}
public static void main(String[] args) {
DZoneUI UI = new DZoneUI();
UI.printJavaRefCardz();
}
}
RxJava를 적용하면서 주의해야 할 점
- RxJava는 non-blocking이다. 절대로 응답을 기다리는 toBlocking() 함수를 호출하지 말자
- Filter 순서를 최적화하자. 많이 거를수 있는 Filter를 먼저 사용하자.
'spring' 카테고리의 다른 글
spring boot 에 rabbitmq 적용하기 (0) | 2018.12.04 |
---|---|
(Spring Boot) @Transactional 이란? / @Transactional에 대하여 (1) | 2018.11.28 |
토비의 스프링 5-4장. 메일 서비스 추상화 (0) | 2018.11.09 |
(Spring Boot Bean) 사용자 클래스 Bean 객체 등록 / 설정 간단하게 하기! (0) | 2018.11.06 |