티스토리 뷰

728x90
반응형

목차

     

    한동안 WebFlux로 개발을 하면서 제목에 쓰인 것들에 대해 몸으로 배울 수 있었다.

     

    그러나 여전히 막연한 부분이 있고, 비동기와 논블로킹이 헷갈릴 때도 있어서

     

    오랜만에 최대한 간결하게 핵심만 정리하고 넘어가기.

     

    Synchronous execution, Asynchronous 

     

    요약부터 하고 들어가자면, 둘의 차이는 결괏값 리턴 순서가 요청 순서를 지키느냐(동기) 아니냐(비동기) 하는 것이다.

     

    조금 덜 직관적으로 말하자면 둘의 차이는 호출된 요청의 결과를 어느 쪽에서 처리하느냐 하는 데 있다고 볼 수도 있다.

     

    결과는 당연히 호출한 쪽에서 신경 써야 하는 거 아닌가? 싶지만 아니다.

     

    위 그림을 보면 알 수 있듯이, 동기 처리의 경우 B메서드를 호출한 A가 작업 완료 여부를 처리한다.

     

    따라서 여러 작업 실행 시 작업의 완료 순서를 A가 알 수 있다.

     

    또한 이 경우 A는 B의 리턴을 기다리거나 (멀티 스레드의 경우) 기다리지 않을 수 있다.

     

    즉, 작업 완료를 기다리는 것이 필수는 아니지만 일반적이다.

     

    반면 비동기의 경우 메서드 호출 시 콜백을 함께 전달하며, 작업 완료 시 B 메서드가 콜백 함수를 호출

     

    결괏값을 전달하게 된다.

     

    여기서 콜백이란 보통 비동기 메서드가 완료된 뒤에 호출하는 함수를 가리킨다.

     

    위의 예와 같이 완료된 결과만 반환하는 것이 아닌 에러가 발생한 경우 에러를 전달하기도 한다.

     

    이 경우 A는 작업 완료 여부를 신경 쓸 필요가 없으며, 여러 작업 실행 시 완료 순서를 알 수 없다.

     

    그렇다고 무조건 비동기가 좋은 건 아니고, 아래와 같은 비교우위가 있다.

      동기 비동기
    장점 구현 및 디버깅이 쉽다.
    코드의 가독성이 좋다.
    순차적 처리로 예측이 쉽다.
    처리시간과 관계 없이 대기하지 않는다.
    처리능력과 처리량이 향상된다.
    시스템 자원을 효율적으로 사용할 수 있다.
    단점 처리시간에 따라 대기시간이 발생한다.
    이는 처리능력과 처리량 저하를 의미하며
    시스템 자원을 비교적 덜 효율적으로 사용한다.
    구현 및 디버깅이 어렵다.
    코드의 가독성이 좋지 않다.
    결과의 순서를 예측할 수 없다.

     

    Blocking, Non-blocking

     

    여기도 요약부터 하자면 둘의 차이는 호출된 작업의 완료를 기다리느냐(블로킹) 아니냐(논블로킹)하는 것이다.

     

    조금 덜 직관적으로 말하자면 호출된 함수가 제어권을 바로 돌려주느냐 아니냐 하는 것인데, 그림으로 보면 아래와 같다.

     

    위 그림에서 리턴은 결괏값이 아닌 제어권의 리턴을, 제어권은 해당 작업이 이루어지는 스레드의 제어권을 가리킨다.

     

    블로킹 방식의 경우 호출된 메서드 B가 작업이 완료될 때까지 제어권을 반납하지 않아

     

    메서드를 호출한 A함수가 메서드 종료 시까지 대기하게 된다.

     

    당연히 대기하는 동안엔 다른 작업을 할 수 없으며, 사용자 입장에서는 프로그램이 멈춘 것처럼 보일 수 있다는 단점이 있다.

     

    반면 논블로킹은 B가 호출된 뒤에 거의 즉시 제어권을 리턴한다.

     

    따라서 A는 다른 작업을 추가로 실행할 수 있으며, 이는 시스템 자원을 효율적으로 사용할 수 있게 한다.

     

    블로킹, 논블로킹의 장단점은 대부분 동기, 비동기의 장단점과 겹치기 때문에 따로 정리는 하지 않겠다.

     

    이렇게 보면 동기 처리와 블로킹 방식이 어떤 차이가 있는지 감이 안 올 수 있다. 나도 안 온다.

     

    둘은 관련된 개념이고, 같이 쓰일 수도 쓰이지 않을 수도 있지만, 가장 큰 차이점은 아래와 같다.

     

    • 동기처리는 호출한 메서드가 반환을 기다리며 대기하는 것이 필수는 아니다.
    • 블로킹의 경우 호출한 메서드 반환을 기다리며 대기하는 것이 필수이다.

    이는 둘의 관점이 조금 다르기 때문인데, 최대한 설명해 보자면 역시 아래와 같다.

     

    • 동기처리는 호출한 함수 입장에서 대기하거나 하지 않는 것을 가리킨다.
    • 블로킹은 호출된 함수 입장에서 스레드 제어권을 바로 반환하거나 하지 않는 것을 가리킨다.

     

    마지막으로 WebFlux와 같은 비동기, 논블로킹 프로그래밍은 이름대로 두 방법을 섞어서 사용한다.

     

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/09   »
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    글 보관함