비동기와 동기 ... 아주 중요하다. 메모리에 관련한 컨트롤이 필요할때는 비동기와 동기의 적절한 사용법이 성능상 큰 이점을 주기 때문이다. 그럼 동기와 비동기란 무엇일까??
동기와 비동기
의미부터 먼저 알아야한다.
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
💡 실행 흐름
- Single.just("Hello RxJava")는 Single<String>을 반환
- blockingGet()이 호출되면 데이터가 나올 때까지 스레드가 멈춤
- 결과 "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
);
💡 실행 흐름
- Single.just("Hello RxJava")는 Single<String>을 반환
- subscribe()를 호출하면 비동기적으로 onSuccess()가 실행됨
- 결과 "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 에 대해 알아보았다.
잘 알고 실제로 사용할때 유용하고 어떤 영향을 주는지 생각하면서 사용하도록 하자 !!

'개발 > Java' 카테고리의 다른 글
Java_ 지역변수 , 인스턴스 변수 차이 (0) | 2024.09.12 |
---|---|
Java & Swift _ runOnUiThread , view.post , handler, DispatchQueue.... 의 차이 (0) | 2024.09.12 |
Java_ Lazy Singleton (0) | 2024.08.25 |
AOS - Rxjava3 , Single , Disposable (0) | 2024.06.23 |
AOS_ HashMap 과 TreeMap 의 차이 (0) | 2024.03.04 |