1. 동기와 비동기


동기 (Synchronous)

// 동기 방식 호출 예시
String result = httpClient.get("<http://example.com/data>");
process(result); // 응답이 올 때까지 이 코드가 실행되지 않음

위에서 볼 수 있듯 간단하고 직관적인 코드 구조를 만들 수 있다. 다만 요청 처리가 오래 걸릴 경우 성능 저하 가능성이 있다.

비동기 (Asynchronous)

// 비동기 호출 예시 (CompletableFuture 사용)
CompletableFuture.supplyAsync(() -> httpClient.get("<http://example.com/data>"))
    .thenAccept(result -> process(result));

// 다른 작업 수행 가능
doOtherWork();

성능과 자원 활용의 효율이 증가하나 코드가 복잡(콜백 지옥)해지고 디버깅이 어려워질 수 있다.

2. 블로킹과 논블로킹


블로킹 (Blocking)