ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Sync vs Async
    Java 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. 요약 및 결론

    개발자로서 이 개념을 어떻게 활용해야 할까요?

    1. Sync: 로직의 순서가 중요하고, 직관적인 코드가 필요할 때 사용합니다. (대부분의 비즈니스 로직)
    2. 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
Designed by MSJ.