본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

Java 반응형 프로그래밍

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 4. 25.

 

 

요즘 함수형과 반응형 프로그래밍에 대해서 많이들 이야기가 나온다.

MVC 패턴이나 디자인패턴 등 여러 개발방식은 어떠한 행위에 대해서 직접 접근해서 보기좋게 처리하는 것을 의미한다면,

그중 반응형 프로그래밍은 이벤트(행위,동작)가 발생하면 이미 정의된 기능(함수)이 알아서 처리하는 것을 의미한다.

반응형 프로그래밍은 비동기 데이터의 스트림을 프로그래밍 하는 것 이다.  * 네..? 뭔말인지..

어떠한 이벤트에 대해 그것에 대한 데이터 스트림을 만들고 그 스트림을 함수형으로 합성하고 생성하며 필터링 할 수 있는 방법을 의미한다.

그니까..데이터나 이벤트를 함수형 방법을 통해서 좀 더 쉽게 가공하고 처리 할 수 있는 개념이라고 생각하면 될 듯 하다.

 

ReactiveX 홈페이지에 가면 그러한 반응형 기능을 잘 구현한 라이브러리가 있는데 다양한 언어를 제공하므로 언어에 맞추어서 받으면 된다.

 

http://reactivex.io/

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 --");
    }
}

멋지게도 슬립이후에 내용이 잘 실행되었다.

위 코드 처럼 동기방식으로 이벤트가 처리되는 것이 아니라 비동기 방식으로 이벤트가 처리 됨을 알 수 있다.

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글