본문 바로가기
개발/Java

Java_ Rxjava blockingGet , subscribe ...

by JunsC 2024. 8. 25.
728x90

비동기와 동기 ... 아주 중요하다. 메모리에 관련한 컨트롤이 필요할때는 비동기와 동기의 적절한 사용법이 성능상 큰 이점을 주기 때문이다. 그럼 동기와 비동기란 무엇일까??

 

동기와 비동기

의미부터 먼저 알아야한다. 

1. 동기(Synchronous)

요청을 보낸 후 결과가 반환될 때까지 기다리는 방식

  • 하나의 작업이 끝나야 다음 작업이 실행됨 (순차적 실행)
  • 실행 순서가 보장됨
  • 응답이 올 때까지 대기 상태가 됨 (Blocking)

예제 (동기 코드 - Java)

System.out.println("작업 1 시작");
Thread.sleep(2000);  // 2초 동안 대기 (Blocking)
System.out.println("작업 1 완료");
System.out.println("작업 2 시작");

 

💡 위 코드는 Thread.sleep(2000); 때문에 2초 동안 대기한 후 다음 코드가 실행됨.

장점

  • 실행 순서가 보장되어 코드가 이해하기 쉬움
  • 디버깅이 용이함

단점

  • 대기 시간이 발생하여 프로그램이 멈춘 것처럼 보일 수 있음
  • 처리 속도가 느림 (CPU가 비효율적으로 사용될 가능성 있음)

 

2. 비동기(Asynchronous)

요청을 보낸 후 결과를 기다리지 않고 다른 작업을 수행하는 방식

  • 요청을 보내고 즉시 다음 작업을 실행할 수 있음
  • 실행 순서가 보장되지 않음
  • 응답이 오면 별도의 콜백(Callback)이나 이벤트로 처리됨 (Non-blocking)

예제 (비동기 코드 - Java)

System.out.println("작업 1 시작");

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(2000); // 2초 후 실행
            System.out.println("작업 1 완료");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

System.out.println("작업 2 시작");

 

💡 위 코드는 Thread.sleep(2000);을 사용했지만 별도의 Thread에서 실행되므로 작업 2 시작이 먼저 출력됨.

장점

  • 여러 작업을 동시에 실행할 수 있어 성능이 향상됨
  • UI가 멈추지 않고 부드럽게 동작함 (특히 모바일 앱 개발에서 중요)

단점

  • 실행 순서가 예측하기 어려움 (비동기 처리 로직이 복잡해질 가능성 있음)
  • 디버깅이 어려울 수 있음

그럼 동기와 비동기에 대한 차이를 알게 되었다.  정말로 직관적으로 쉽게 설명해보자면, 

동기 - 직렬 / 비동기 - 병렬

*동기는 한번의 호출로 인한 완료를 할때까지 나머지 일들은 모두 뒤로 제쳐두기

*비동기 한번의 일을 하기는 하는데 완료될때까지 다른일을 뒤로 제쳐두는게 아니라 동시에 조금씩 같이 해놓기

 

💡 정리하자면!
동기는 순차적 실행을 보장하지만 속도가 느리고 대기 시간이 발생할 수 있음.
비동기는 대기 없이 여러 작업을 동시에 처리할 수 있지만 코드가 복잡해질 가능성이 있음.

🚀 그래서 네트워크 요청 같은 곳에서는 비동기를, 데이터 일관성이 중요한 작업에서는 동기를 사용하는 게 일반적!

 

그럼  rxjava를 사용하기 위해선 이 기본개념은 반드시 알아야한다.

 

 

 

BlockingGet / Subscribe

 

 

1. blockingGet() (동기)

데이터를 반환할 때까지 현재 스레드를 블로킹하는 방식

특징

  • 호출한 스레드는 데이터를 받을 때까지 대기(Blocking)
  • 반환값을 직접 받을 수 있음
  • 주로 테스트용이나 간단한 데이터 요청에 사용됨

예제

Single<String> single = Single.just("Hello RxJava");

// blockingGet()을 사용하면 데이터가 나올 때까지 기다림
String result = single.blockingGet();

System.out.println(result); // 출력: Hello RxJava

 

💡 실행 흐름

  1. Single.just("Hello RxJava")는 Single<String>을 반환
  2. blockingGet()이 호출되면 데이터가 나올 때까지 스레드가 멈춤
  3. 결과 "Hello RxJava"를 반환

 

 

2. subscribe() (비동기)

콜백을 통해 데이터를 처리하는 방식 (비동기적 실행)

특징

  • 데이터를 처리하는 동안 현재 스레드는 계속 실행됨 (Non-Blocking)
  • 데이터를 받으면 콜백 함수(onNext(), onError(), onComplete())를 호출
  • 주로 네트워크 요청, UI 업데이트 등 비동기 작업에서 사용

예제

Single<String> single = Single.just("Hello RxJava");

// subscribe()을 사용하면 비동기적으로 데이터 처리
single.subscribe(
    result -> System.out.println("결과: " + result),  // onSuccess
    error -> System.out.println("에러 발생: " + error)  // onError
);

 

💡 실행 흐름

  1. Single.just("Hello RxJava")는 Single<String>을 반환
  2. subscribe()를 호출하면 비동기적으로 onSuccess()가 실행됨
  3. 결과 "Hello RxJava"가 출력됨

 

3. blockingGet() vs subscribe() 비교

실행 방식 동기(Blocking) 비동기(Non-blocking)
결과 반환 직접 반환 콜백 함수에서 처리
현재 스레드 대기 (Block) 계속 실행됨
사용 예시 테스트 코드, 단순한 데이터 조회 네트워크 요청, UI 이벤트 처리

 

4. 언제 사용해야 할까?

blockingGet()을 사용할 때

  • 작은 데이터 처리 (예: 로컬 캐시 조회)
  • 테스트 코드에서 결과를 즉시 확인할 때

subscribe()을 사용할 때

  • 네트워크 요청 (API 호출)
  • UI 업데이트 (안드로이드, iOS 개발)
  • 대용량 데이터 처리 (비동기 스트림)

5. 실생활 비유

  • blockingGet() (동기 실행)
    ATM에서 돈을 인출할 때, 앞 사람이 끝날 때까지 기다려야 함
  • subscribe() (비동기 실행)
    음식 배달을 주문하고 기다리는 동안 다른 일을 할 수 있음

 

💡 결론:
blockingGet()은 간단한 데이터 처리를 위해 사용할 수 있지만, 네트워크 요청이나 UI 처리를 할 때는 subscribe()을 사용하는 것이 일반적이다! 🚀

 

 

이렇게 Rxjava 의 BlockingGet / Subscribe 에 대해 알아보았다. 

잘 알고 실제로 사용할때 유용하고 어떤 영향을 주는지 생각하면서 사용하도록 하자 !!

 

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."