인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

qpal1zm23님의 프로필 이미지
qpal1zm23

작성한 질문수

Kevin의 알기 쉬운 RxJava 1부

리액티브 스트림즈(Reactive Streams)란?

cold/hot publisher 예제 코드와 관련해 질문 드립니다.

해결된 질문

작성

·

259

·

수정됨

0

안녕하세요! 강의 잘 듣고 있습니다. 본격적인 첫 강의부터 궁금한 점들이 많아 질문 드리게 되었습니다 ㅠ..

 

저는 해당 강의를 듣게 된 사유가 웹플럭스 같이 비동기 적으로 처리하는 것에 관심이 많아서 자연스럽게 기본부터 다지고자 해당 강의를 수강하게 되었는데요.

 

그래서 RxJava 코드가 비동기를 위한 코드라는 인식이 있습니다.

 

그런데 해당 강의 마지막 부분에 cold/hot publisher 예제 코드에서 콘솔에 데이터가 출려되는 형태를 보면 구독자1이 데이터를 모두 소비하고 구독자2가 그 다음으로 데이터를 소비하는, 동기적으로 처리하는 것처럼 보이더라구요.

 

혹시 제 생각처럼 동기적으로 처리되고 있는 것이 맞을까요?

 

그렇다면 사유가 궁금합니다 ㅠ

  1. RxJava는 사실 단순 pub/sub 형태의 인터페이스를 구현한 구현체에 불과해서 RxJava를 이용해 소스코드를 작성하여도 이걸 비동기적으로 처리하기 위해서는 더 아랫단의 도움을 받아야 하는건지

    1. 그렇다면 이 코드를 실행하는 was의 영향을 받는건지

    2. 만약 그냥 java로 실행한다면 비동기적으로 실행할 수 없는 건지

  2. 아니면 RxJava는 동기적 비동기적으로 소스코드를 작성할 수 있는데, 그냥 현재 예제 코드가 동기적으로 코드를 작성한 것인지

  3. 아니면 메인 스레드가 구독자1과 2의 역할을 동시에 하고 있기 때문에 순차처리가 되는것인지

 

또한 비동기에 대한 정의에 대해 여쭤보고 싶습니다.

비동기 처리라는 것을 스레드의 동작 방식을 제어하는 것이라고 이해하면 될까요??

비동기 처리를 구현하기 위해서는 스레드 제어만 하면 되니까 OS단의 도움을 받지 않고 어플리케이션 단에서 구현을 할 수 있다고 이해해도 괜찮을까요??

답변해주시면 감사하겠습니다!

답변 1

1

Kevin님의 프로필 이미지
Kevin
지식공유자

안녕하세요? RxJava 학습하시다가 질문 주셨는데요.

아래에 답변 드리도록 하겠습니다.

 

그런데 해당 강의 마지막 부분에 cold/hot publisher 예제 코드에서 콘솔에 데이터가 출려되는 형태를 보면 구독자1이 데이터를 모두 소비하고 구독자2가 그 다음으로 데이터를 소비하는, 동기적으로 처리하는 것처럼 보이더라구요.

혹시 제 생각처럼 동기적으로 처리되고 있는 것이 맞을까요?

--> 동기적으로 출력되는게 맞습니다. subscribe()에서 콘솔에 출력하는 곳에서 Thread.currentThread().getName() 으로 Thread 이름을 출력해보면 모두다 main 쓰레드에서 실행이 되는 걸 확인하실 수 있을 거에요.

그렇다면 사유가 궁금합니다 ㅠ

--> RxJava나 Reactor 같은 리액티브 프로그래밍 라이브러리는 이벤트 기반의 비동기 프로그래밍 방식의 기술인데요. 비동기 라는 용어는 좁은 의미로는 Java의 동시성 즉, 멀티쓰레딩을 의미하고 넓은 의미로는 동기적으로 순차적으로 실행되지 않는 모든걸로 이해할 수 있습니다.

단순히 Java의 main() 메서드에서 RxJava로 데이터를 통지하고, 데이터를 구독하는것은 main 쓰레드에서만 실행되기 때문에 동기적으로 실행되는 것이구요.

2부에서 스케쥴러를 학습하실텐데요. 스케쥴러를 통해서 비동기적으로 데이터를 통지하거나 데이터를 처리하는 방법에 대해서 학습 하시게 된다는 점 참고해주시면 좋을 것 같습니다.

  1. RxJava는 사실 단순 pub/sub 형태의 인터페이스를 구현한 구현체에 불과해서 RxJava를 이용해 소스코드를 작성하여도 이걸 비동기적으로 처리하기 위해서는 더 아랫단의 도움을 받아야 하는건지

    1. 그렇다면 이 코드를 실행하는 was의 영향을 받는건지

    2. 만약 그냥 java로 실행한다면 비동기적으로 실행할 수 없는 건지

  2. 아니면 RxJava는 동기적 비동기적으로 소스코드를 작성할 수 있는데, 그냥 현재 예제 코드가 동기적으로 코드를 작성한 것인지

  3. 아니면 메인 스레드가 구독자1과 2의 역할을 동시에 하고 있기 때문에 순차처리가 되는것인지
    --> 1, 2, 3번 질문에는 한꺼번에 답변을 드리는게 좋을 것 같아요.


    앞에서도 말씀드렸지만
    비동기 처리라는 것은 일반적으로 Java에서 멀티 쓰레딩 기법 즉, 쓰레드를 여러개 사용해서 처리하는 것을 의미하는데요. Java에서 비동기 멀티 쓰레딩 이외에 NIO(Non-Blocking I/O)라는 기술이 있습니다. Non-Blocking I/O라는 것은 데이터 입출력 시, 쓰레드가 차단이 되지 않기 때문에 하나의 쓰레드에서 동시 다발적으로 발생하는 입출력을 처리할 수 있는데 이 Non-Blocking I/O 역시도 동기적으로 실행되는 것은 아니기 때문에 비동기적이다라는 표현을 많이 사용합니다.
    Non-Blocking I/O는 일반적으로 Non-Blocking I/O를 지원하는 WAS를 사용하구요. 단순히 Java 만으로 Non-Blocking I/O 기능을 사용하려면 Java의 NIO 기술을 사용하셔야 합니다.


    그게 아니라면 멀티쓰레딩 기법을 이용하시면 됩니다.

     

 

또한 비동기에 대한 정의에 대해 여쭤보고 싶습니다.

비동기 처리라는 것을 스레드의 동작 방식을 제어하는 것이라고 이해하면 될까요??

비동기 처리를 구현하기 위해서는 스레드 제어만 하면 되니까 OS단의 도움을 받지 않고 어플리케이션 단에서 구현을 할 수 있다고 이해해도 괜찮을까요??

--> 위에서 설명 드렸다시피 비동기에 대한 정의는 광범위한 의미까지 포함이 되어 있긴한데 Java에서 일반적으로 비동기 처리라고 하면 멀티 쓰레딩이라고 생각하셔도 무방할 것 같아요.

RxJava 2부에서 스케쥴러를 학습하시면 RxJava에서 멀티 쓰레딩을 손쉽게 적용하실 수 있다는 걸 배우게 되실거에요.

강의에서는 RxJava의 기본 개념이나 연산자의 기본 동작에 대한 이해를 돕기 위해서 무조건적으로 스케쥴러를 사용해서 비동기적으로 처리하지는 않는다고 생각해 주시면 감사드리겠습니다.

qpal1zm23님의 프로필 이미지
qpal1zm23
질문자

선생님 답변 정말 감사드립니다! 많은 도움이 되었어요!

생각을 할수록 제가 모르는 부분들이 많이 보이는거 같습니다 ㅠ.ㅠ

혹시 실례가 안된다면 질문 한가지만 더 드려도 괜찮을까요?

 

netty에서도 thread pool을 사용하는 지는 모르겠지만, netty나 tomcat 같은 웹 컨테이너에서 생성한 thread pool과 자바 어플리케이션 안에서 executorService를 사용해 task를 관리할 때 executor가 사용하는 스레드는 별개인가요??

 

아니면은 웹 컨테이너가 생성한 스레드를 쭉 이어서 어플리케이션 단에서도 사용하는 걸까요??

만약 그렇다면 executor가 사용하는 스레드가 톰캣이나 네티의 스레드 풀의 스레드가 된다는 의미로 해석되는데 맞을까요?..

 

검색을 해도 정보가 잘 나오지 않아 질문 드립니다..!

Kevin님의 프로필 이미지
Kevin
지식공유자

netty에서도 thread pool을 사용하는 지는 모르겠지만, netty나 tomcat 같은 웹 컨테이너에서 생성한 thread pool과 자바 어플리케이션 안에서 executorService를 사용해 task를 관리할 때 executor가 사용하는 스레드는 별개인가요??
--> 네, 별개의 쓰레드가 맞습니다. 웹 컨테이너에서 사용되는 쓰레드 풀과 쓰레드는 들어오는 요청을 처리하기 위한 쓰레드이고, 이렇게 들어온 요청을 ExecutorService를 이용해서 별도의 쓰레드로 작업을 처리할 수 있습니다.
 

아니면은 웹 컨테이너가 생성한 스레드를 쭉 이어서 어플리케이션 단에서도 사용하는 걸까요??
--> ExecutorService로 추가 쓰레드를 할당하지 않는다면 웹 컨테이너에서 들어오는 요청을 처리하는 쓰레드가 애플리케이션까지 그대로 사용됩니다.

만약 그렇다면 executor가 사용하는 스레드가 톰캣이나 네티의 스레드 풀의 스레드가 된다는 의미로 해석되는데 맞을까요?..
--> 앞에서 말씀드렸지만 ExecutorService를 사용하지 않는다면 웹 컨테이너에서 할당 받은 쓰레드를 그대로 사용하고, 만약 애플리케이션 단에서 별도의 쓰레드를 할당해서 작업을 처리하고 싶다면 그 때 ExecutorService를 사용해서 쓰레드를 추가로 할당하면 됩니다.

qpal1zm23님의 프로필 이미지
qpal1zm23
질문자

ㅠ.ㅠ 너무 감사합니다.. 최고십니다..!!!

qpal1zm23님의 프로필 이미지
qpal1zm23

작성한 질문수

질문하기