-
[Java] Sync vs AsyncJava 2025. 12. 1. 13:18
1. 핵심 정의: 관점의 차이
Sync와 Async를 구분하는 가장 중요한 기준은 "호출된 함수의 결과(Return Value)를 누가, 언제 처리하는가?"입니다.
1-1. Synchronous (동기)
"작업을 요청한 후, 그 결과가 나올 때까지 계속 확인하거나 기다리는 방식"
- 동작: 호출자(Caller)는 피호출자(Callee)에게 작업을 시키고, 그 결과가 반환될 때까지 다음 로직을 실행하지 않거나, 결과가 왔는지 계속 확인(Polling)합니다.
- 특징: 작업의 순서(Ordering)가 보장됩니다. A가 끝나야 B가 실행됩니다.
1-2. Asynchronous (비동기)
"작업을 요청해두고, 결과는 나중에 통보받는 방식"
- 동작: 호출자(Caller)는 작업을 요청(Request)만 하고, 결과에는 당장 신경을 끄고 다른 일을 수행합니다. 결과 처리는작업이 완료되었다는 신호(Callback, Future, Event)*가 왔을 때 수행합니다.
- 특징: 작업의 순서가 보장되지 않지만, 자원을 효율적으로 쓸 수 있습니다.
2. Java 코드로 보는 차이
Java 개발자에게 익숙한 코드로 비교하면 그 차이가 더 명확해집니다.
A. Synchronous (동기) 코드
우리가 작성하는 일반적인 메소드 호출은 대부분 동기 방식입니다.
public void syncProcess() { System.out.println("1. 작업 시작"); // 이 라인에서 결과(user)가 리턴될 때까지 메인 흐름은 멈춰있거나 기다림 User user = userService.findById(1L); // 위 작업이 끝나야만 실행됨 (순서 보장) System.out.println("2. 결과 처리: " + user.getName()); }B. Asynchronous (비동기) 코드
CompletableFuture나 Spring의 @Async를 사용한 경우입니다.
public void asyncProcess() { System.out.println("1. 작업 시작"); // 1) 요청: "이거 찾아줘"라고 시키고(supplyAsync) // 2) 콜백 등록: "다 찾으면 이렇게 처리해줘"라고 등록(thenAccept) CompletableFuture.supplyAsync(() -> userService.findById(1L)) .thenAccept(user -> System.out.println("3. 비동기 결과 처리: " + user.getName())); // 위 코드가 결과를 찾든 말든 즉시 실행됨 System.out.println("2. 다른 작업 수행"); }- 실행 순서: 1. 작업 시작 -> 2. 다른 작업 수행 -> (나중에) 3. 비동기 결과 처리
3. Blocking/Non-blocking과의 결정적 차이
이 부분이 가장 중요합니다. 면접이나 아키텍처 설계 시 혼동하지 말아야 할 포인트입니다.
구분 Blocking / Non-blocking Sync / Async 기준 제어권 (Control) 결과값의 처리 (Result) 대상 쓰레드(Thread)의 상태 작업의 순서(Order)와 완료 시점 핵심 질문 "호출된 함수가 나를 멈추게(Wait) 하나?" "결과가 나왔는지 내가 확인(Check) 해야 하나?" 4. 요약 및 결론
개발자로서 이 개념을 어떻게 활용해야 할까요?
- Sync: 로직의 순서가 중요하고, 직관적인 코드가 필요할 때 사용합니다. (대부분의 비즈니스 로직)
- Async: 시간이 오래 걸리는 작업(이메일 전송, 대용량 파일 처리)을 백그라운드로 돌리고, 메인 쓰레드는 다른 일을 해야 할 때 사용합니다.
특히 Spring 환경에서는:
- Spring MVC: 기본적으로 Sync + Blocking 모델입니다.
- Spring WebFlux: Async + Non-blocking 모델을 통해 고성능을 냅니다.
다음 포스팅에서는 이 4가지 개념이 조합된 I/O 모델 매트릭스를 통해, 실제 우리가 사용하는 기술들이 어디에 위치하는지 종합적으로 정리해 보겠습니다.
'Java' 카테고리의 다른 글
[Java] Thread란? (0) 2025.12.01 [Java] I/O 모델의 4가지 조합 (0) 2025.12.01 [Java] Blocking/Non-blocking이란? (0) 2025.12.01 [Java] 프로세스(Process)와 스레드(Thread) (1) 2025.11.27 [Java] JVM의 Runtime Data Area (0) 2025.11.19