동기(Synchronous)와 비동기(Asynchronous)

Kkd·2024년 12월 5일
0

매일메일 개념정리

목록 보기
18/93

동기(Synchronous)와 비동기(Asynchronous)는 작업 수행 방식과 그에 따른 응답 처리의 차이를 설명하는 개념으로, 프로그래밍과 시스템 설계에서 매우 중요한 개념입니다.


1. 동기(Synchronous)

개념

  • 요청을 보낸 후 작업이 끝날 때까지 기다리는 방식.
  • 요청과 응답이 직렬적으로 처리됩니다.

특징

  • 작업 순서 보장: 요청 작업이 순차적으로 진행되므로 작업의 실행 순서가 보장됩니다.
  • 대기 시간 발생: 현재 요청이 완료될 때까지 다음 작업이 대기 상태에 있습니다.
  • 직관적: 결과를 바로 얻을 수 있어 처리 흐름이 이해하기 쉽습니다.

예시

  • 전화 통화: 상대방이 전화를 받을 때까지 기다려야 대화를 시작할 수 있습니다.
  • 코드 예제 (자바):
public void synchronousMethod() {
    System.out.println("Step 1: Start");
    Thread.sleep(3000); // 3초 동안 대기
    System.out.println("Step 2: Complete");
}

출력:

Step 1: Start
(3초 대기)
Step 2: Complete

장점

  • 실행 순서가 명확하므로 디버깅과 유지보수가 용이합니다.

단점

  • 대기 시간이 길어질 경우 효율이 떨어지고, 시스템 자원을 비효율적으로 사용할 수 있습니다.

2. 비동기(Asynchronous)

개념

  • 요청을 보낸 후 작업이 완료되기를 기다리지 않고 다른 작업을 수행하는 방식.
  • 요청과 응답이 병렬적으로 처리됩니다.

특징

  • 작업 순서 미보장: 작업의 실행 순서는 보장되지 않지만, 완료 시 결과를 처리합니다.
  • 효율적 자원 활용: 다른 작업을 동시에 처리할 수 있어 응답성이 향상됩니다.
  • 복잡한 처리 흐름: 결과를 처리하기 위해 콜백(Callback)이나 이벤트 핸들러를 사용해야 할 수 있습니다.

예시

  • 이메일 전송: 이메일을 보낸 후 상대가 읽을 때까지 기다리지 않고 다른 작업을 계속합니다.
  • 코드 예제 (자바):
public void asynchronousMethod() {
    System.out.println("Step 1: Start");
    new Thread(() -> {
        try {
            Thread.sleep(3000); // 3초 동안 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Step 2: Complete");
    }).start();
    System.out.println("Step 3: Continue other work");
}

출력:

Step 1: Start
Step 3: Continue other work
(3초 후)
Step 2: Complete

장점

  • 대기 시간이 길더라도 다른 작업을 병렬로 처리할 수 있어 응답성과 자원 활용이 뛰어납니다.

단점

  • 작업 순서를 제어하거나 결과를 처리하는 로직이 복잡해질 수 있습니다.
  • 디버깅과 유지보수가 어려울 수 있습니다.

3. 비교

특성동기(Synchronous)비동기(Asynchronous)
작업 처리 방식순차적으로 실행병렬적으로 실행
대기 시간요청 완료까지 대기대기 없이 즉시 다른 작업 실행
효율성낮음높음
구현 복잡성단순복잡
사용 사례데이터베이스 트랜잭션, 파일 읽기UI 이벤트 처리, 네트워크 요청

4. 사용 사례

동기(Synchronous)

  • 트랜잭션 처리: 은행 계좌 이체와 같이 순서와 완결성이 중요한 작업.
  • 단순 작업 흐름: 연속적인 작업 처리에 적합.

비동기(Asynchronous)

  • 네트워크 요청: 웹 서비스 호출, API 요청 처리.
  • I/O 작업: 파일 읽기/쓰기, 대규모 데이터 처리.
  • UI 이벤트 처리: 사용자가 클릭하거나 입력한 내용을 처리.

5. 실제 사용 기술

동기 기술

  • Java의 Thread.sleep
  • Spring Web MVC (블로킹 방식)
  • Python의 time.sleep

비동기 기술

  • Java의 CompletableFuture, ExecutorService
  • Spring WebFlux (비동기 논블로킹 방식)
  • JavaScript의 async/await, Promise

5. 블로킹(Block)

개념

  • 블로킹은 특정 작업(예: 함수 호출)에서 결과가 반환될 때까지 현재 작업이 멈춰서 기다리는 상태를 의미합니다.
  • 실행 중인 스레드가 작업을 완료하거나 응답을 받을 때까지 대기합니다.

특징

  • 자원 점유: 블로킹 상태에서도 스레드가 계속 실행 중이므로 시스템 자원을 점유합니다.
  • 대기 발생: 작업이 완료될 때까지 아무런 작업도 수행하지 못합니다.

예시

  1. 파일 읽기/쓰기:

    FileInputStream fileInputStream = new FileInputStream("file.txt");
    int data = fileInputStream.read(); // 파일에서 데이터 읽기 동안 대기

    파일에서 데이터를 읽는 동안 스레드는 멈추며, 작업이 완료되면 다음 코드로 진행합니다.

  2. HTTP 요청:

    URL url = new URL("https://example.com");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.getInputStream(); // 응답을 받을 때까지 대기

6. 동기와과 블로킹의 차이

특성동기(Synchronous)블로킹(Block)
초점작업 순서: 작업이 순차적으로 진행작업 상태: 스레드가 멈춰 기다림
스레드 상태순차적으로 실행대기 상태에서 자원을 점유
작업 흐름작업이 완료된 후 다음 작업 시작특정 작업이 끝나야 스레드가 깨어남
비교 관계동기 작업이 반드시 블로킹일 필요는 없음블로킹은 동기 작업에서 흔히 발생

7. 비동기와 논블로킹의 차이

특성비동기(Asynchronous)논블로킹(Non-Blocking)
작업 흐름작업 완료를 기다리지 않고 즉시 반환작업 완료를 기다리지 않으며, 결과를 나중에 확인
스레드 상태스레드는 다른 작업을 수행하거나 대기스레드는 대기하지 않고 즉시 다음 작업 수행
주요 특징콜백, Future, Promise 등을 통해 처리이벤트 루프, 논블로킹 I/O 사용

추가 학습 자료

profile
🌱

0개의 댓글