Blocking/Non-Blocking, Sync/Async 추가 정리본
1. Sync/Async
1.1. Sync
일련의 작업들이 있다고 가정했을 때 먼저 요청한 작업이 완료될 때까지 기다렸다가 다음 명령을 순차적으로 실행하는 것을 의미한다.

- Apps #1 애플리케이션에서 aaa.com 이라는 웹 사이트의 첫 페이지를 요청
- Apps #1에서는 요청한 정보(HTTP 응답 데이터)를 모두 전달 받을 때 까지 대기
- 이전 요청이 완료되면 그 다음 절차를 진행
예시 코드(특정 웹 사이트의 메인 페이지 HTML 페이지 요청 및 응답)

HTML 데이터를 모두 받아오고, response 객체에 응답 저장, 가져온 body 출력
1.2. Async
요청한 작업의 종료를 기다리지 않고 다른 작업을 실행할 수 있는 흐름을 말한다. 요청한 쪽에서는 요청 결과와 무관하게 다음 작업을 진행하는 것이 가능하다. 일련의 Async 작업들은 완료 순서가 보장되지 않는 것이 특징이다.

예시 코드

- HttpClient는 sendAsync()를 이용해 비동기적으로 웹 요청을 하게 되고
- 메인 스레드에서는 This is Next를 출력 (1번의 요청 완료와 무관하게 출력)
- future와 관련된 로직은 비동기 로직에 대한 콜백 코드
- HTTP 응답을 받은 뒤 Body 값만 추출하여 새로운 CompleteableFuture를 생성
- thenAccept()는 전달받은 Body 값을 출력
- join()은 비동기 로직 실행이 완료될 때까지 메인 스레드에서의 대기
(메인 스레드가 대기를 하지 않고 종료를 해버리면 비동기 로직이 완료되기 전 프로세스 자체가 종료될 수 있음)
