요즘 함수형과 반응형 프로그래밍에 대해서 많이들 이야기가 나온다.
MVC 패턴이나 디자인패턴 등 여러 개발방식은 어떠한 행위에 대해서 직접 접근해서 보기좋게 처리하는 것을 의미한다면,
그중 반응형 프로그래밍은 이벤트(행위,동작)가 발생하면 이미 정의된 기능(함수)이 알아서 처리하는 것을 의미한다.
반응형 프로그래밍은 비동기 데이터의 스트림을 프로그래밍 하는 것 이다. * 네..? 뭔말인지..
어떠한 이벤트에 대해 그것에 대한 데이터 스트림을 만들고 그 스트림을 함수형으로 합성하고 생성하며 필터링 할 수 있는 방법을 의미한다.
그니까..데이터나 이벤트를 함수형 방법을 통해서 좀 더 쉽게 가공하고 처리 할 수 있는 개념이라고 생각하면 될 듯 하다.
ReactiveX 홈페이지에 가면 그러한 반응형 기능을 잘 구현한 라이브러리가 있는데 다양한 언어를 제공하므로 언어에 맞추어서 받으면 된다.
maven을 기준으로 xml은 아래와 같다.
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.2.0</version>
</dependency>
ReactiveX에서 제공하는 RX로 시작하는 라이브러리는 상당히 많은 언어를 지원한다.
자바스크립트, 닷넷, 스위프트, 자바 등등..
그중 자바를 예를들어 사용해 보았다.
import io.reactivex.disposables.Disposable;
import io.reactivex.subjects.PublishSubject;
public class App {
private static PublishSubject<String> myObservable = null;
public static void main( String[] args ){
myObservable = PublishSubject.create(); //관측할 영역(대상) 생성
final Disposable s1 = myObservable.subscribe(result -> { //관측자 생성
System.out.println("Im s1 : "+result); //콜백 데이터에 대한 행위
});
//행위 발생
myObservable.onNext("event 1");
myObservable.onNext("event 2");
s1.dispose(); //관측자 제거
}
}
코드 자체가 어렵지 않아서 이해하는데 쉽다.
만들어놓은 관측자는 해당 내용이 dispose메소드를 만나기 전 까지 계속해서 이벤트를 감시하며, 이벤트가 발생하면 인터페이스로 정의 된 내용을 처리한다.
아래 예제는 dispose메소드를 실행한 관측자, 실행하지 않는 관측자의 예제이다.
import io.reactivex.disposables.Disposable;
import io.reactivex.subjects.PublishSubject;
public class App {
private static PublishSubject<String> myObservable = null;
public static void main( String[] args ){
myObservable = PublishSubject.create();
final Disposable s1 = myObservable.subscribe(result -> {
System.out.println("Im s1 : "+result);
});
//map을 통한 데이터 가공
final Disposable s2 = myObservable.map((arg)-> arg+" + add value~ ").subscribe(result -> {
System.out.println("Im s2(with map) : "+result);
});
myObservable.onNext("event 1");
myObservable.onNext("event 2");
s1.dispose();
myObservable.onNext("event 3"); //s1만 종료되었으므로 s2는 해당 행위 출력
}
}
자바스크립트처럼 map을 이용하여 데이터를 가공할 수 가 있다.
아래예제는 filter를 이용한 걸러내기 방법이며 쓰레드를 활용하여 메인 쓰레드가 종료되어도 해당 이벤트가 처리되는지 확인해본 코드이다.
import io.reactivex.disposables.Disposable;
import io.reactivex.subjects.PublishSubject;
public class App {
private static PublishSubject<String> myObservable = null;
public static void main( String[] args ){
myObservable = PublishSubject.create();
final Disposable s1 = myObservable.subscribe(result -> {
System.out.println("Im s1 : "+result);
});
final Disposable s2 = myObservable.map((arg)-> arg+" <- add ").subscribe(result -> {
System.out.println("Im s3(with map) : "+result);
});
//filter를 통한 행위 걸러내기(true만 넘어온다)
final Disposable s3 = myObservable.filter((arg)-> arg.equalsIgnoreCase("event with thread") ? true : false).subscribe(result -> {
System.out.println("Im s2(with filter) : "+result);
});
myObservable.onNext("event 1");
myObservable.onNext("event 2");
s1.dispose();
s2.dispose();
new Thread(()->{ //비동기 방식 처리를 볼 수 있는 구간
try {
Thread.sleep(3000); //3초 쉬고 아래 이벤트를 끝까지 출력해 마무리 한다.
myObservable.onNext("event with thread");
} catch (Exception e) {
}
}).start();
System.out.println("-- main thread end --");
}
}
멋지게도 슬립이후에 내용이 잘 실행되었다.
위 코드 처럼 동기방식으로 이벤트가 처리되는 것이 아니라 비동기 방식으로 이벤트가 처리 됨을 알 수 있다.
'Java(자바)' 카테고리의 다른 글
파일종류, Dos파일 / Unix파일 (0) | 2019.04.25 |
---|---|
자바 기본 인코딩 (with 파일 입출력) (0) | 2019.04.25 |
자바 함수형 프로그래밍 2 (0) | 2019.04.25 |
Java Exception 기록하기 (0) | 2019.04.25 |
Java로 프로그램(exe, sh같은) 실행 (0) | 2019.04.25 |
댓글