본문 바로가기

3. 기술 공부/Java (Spring, Spring Boot)

[Java Servlet] 1. Sync? Async?, Blocking? Non-Blocking?

Connected Posts

2021.07.16 - [3. 기술 공부/Java (Spring, Spring Boot)] - [Java Servlet] 1. Sync? Async?, Blocking? Non-Blocking?

2021.07.16 - [3. 기술 공부/Java (Spring, Spring Boot)] - [Java Servlet] 2. Servlet과 Servlet Container

2021.07.16 - [3. 기술 공부/Java (Spring, Spring Boot)] - [Java Servlet] 3. Servlet 3.0, 3.1 그리고 Spring MVC

Goal

[Java Servlet] 시리즈 포스트에서는 Java Servlet에 대한 간단한 개념과, Java Servlet 역사에 큰 breakpoint가 있었던 Servlet 3.0(Async Servlet), 3.1(Non-blocking I/O)에 대해 정리해보려고 한다. 이번 포스팅에서는 breakpoint를 이해하기 위해 기초가 될 개념인 Sync, Async, Blocking, Non-Blocking에 대해 알아보도록 하겠다.

 

1. Synchronous? Asynchronous?

본격적으로 Servlet에 대해 이야기하기에 앞서, 대부분이 아는 내용이겠지만 간단히 싱크와 어싱크, 블록과 논블록에 대한 개념을 한번 짚고 넘어가려고 한다.  두가지를 이해하지 못하면 뒤에 얘기들을 모두 이해할 수 없기 때문에 굉장히 기초지만 내용을 넣어보았다.

  • Sync는 위의 Synchronous 그림의 경우처럼 2개의 스레드 작업이 싱크를 맞추어 진행되는 것을 이야기 한다.
    Client thread가 server thread에게 작업 요청을 했을 완료될 때까지 기다려 결과값을 직접 받게 되고 받고난 후에서야 다음 일을 하게 된다.
  • Async 반대로 Client thread 작업을 요청하지만, 완료를 기다리지 않고 본인이 다른 일을 처리한다. 작업 요청에 대한 결과값을 직접적으로 받지 않고, 호출된 함수의 콜백 함수를 통해 작업 완료 여부를 확인하여 결과값을 받아 연관된 작업을 계속 진행한다.

 

1. Blocking? Non-Blocking?

blocking non-blocking 주로 IO 읽기, 쓰기에서 사용되는 개념이다.

  • blocking 방식의 경우 요청한 작업을 마칠 때까지 계속 대기한다. Thread 관점으로 본다면, 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용하거나 대기하게 된다.
  • non-blocking 방식 경우 요청한 작업을 즉시 마칠 없다면 즉시 return한다. Thread 관점으로 본다면, 하나의 Thread 여러 개의 IO 처리가 가능하게 된다.

 

둘이 유사하여 처음에 봤을 때 헷갈릴 수 있지만, 각자의 관심사가 다르기 때문에 별도의 용어로 불리우는 것으로 생각하면 간단하다.

Sync/async "호출되는 함수의 작업완료여부를 누가 신경쓰느냐?" 관심사이다. 호출되는 함수에게 콜백을 전달하여 콜백이 완료 여부를 관리하게 되면 어싱크인 것이다.

blocking/non-blocking 호출되는 "함수가 바로 리턴을 하느냐, 아니면 스레드를 잡고 있느냐" 관심사이다. 호출된 함수가 바로 리턴해서 호출한 함수에게 제어권을 넘겨주고 호출한 함수가 다른 일을 있는 기회를 주면 논블로킹인 것이다.

 

이 두 개념에 대해 알고 있어야 왜 기존의 Sync/Blocking 방식이었던 기술들이 Async/Non-blocking으로 변모하며 스레드 자원을 최대로 활용할 수 있게 개선되었는지 이해할 수 있을 것이다. 위에 두개의 방식의 차이점에서 알 수 있듯이 Async/Non-blocking 방식일 때에는 스레드가 유휴상태로 점유되는 일이 없이 자유롭게 여러가지 작업을 동시에 할 수 있기 때문에 자연스럽게 스레드 자원을 최대로 활용할 수 있게 되는 것이다.

 

다음 포스팅에서는 자바 서블릿과 서블릿 컨테이너에 대해 살펴볼 것이다.