동기(Synchronous)

  • 정의: 작업이 시작과 끝을 맞춰 순차적으로 실행되는 방식.
  • 특징:
    • 호출 프로세스는 하부 작업이 완료될 때까지 실행을 멈춤.
    • 작업 순서와 흐름이 예측 가능.
  • 장점:
    • 코드의 가독성이 좋고, 이해하기 쉬움.
    • 데이터 일관성을 유지하기 쉬움.
  • 단점:
    • 하부 작업이 오래 걸릴 경우 전체 프로세스가 지연됨.
  • 예시 코드:
     
Console.WriteLine("Start");
DoWork(); // 하부 작업이 완료될 때까지 기다림.
Console.WriteLine("End");

비동기(Asynchronous)

  • 정의: 작업의 완료 여부와 상관없이 다른 작업을 진행할 수 있는 방식.
  • 특징:
    • 호출 프로세스는 하부 작업의 실행 여부와 관계없이 실행을 계속함.
    • 작업 순서가 보장되지 않을 수 있음.
  • 장점:
    • 작업 병렬 처리가 가능하며 시스템 자원을 효율적으로 사용.
    • 긴 작업으로 인한 블로킹을 방지.
  • 단점:
    • 디버깅과 코드 작성이 복잡.
    • 데이터 동기화 문제가 발생할 가능성.
  • 예시 코드 (Async/Await):
     
Console.WriteLine("Start");
await DoWorkAsync(); // 하부 작업 완료를 기다리는 동안 다른 작업 가능.
Console.WriteLine("End");

 

비동기 프로그래밍의 주요 특징

  1. 작업 병렬 처리
    • 비동기 방식은 메인 스레드가 블로킹되지 않고, 추가적인 작업을 별도 스레드에서 처리하므로 사용자 인터페이스(UI)가 멈추지 않고 원활히 작동합니다.
    • 예를 들어, 파일 다운로드와 같은 네트워크 작업을 비동기 방식으로 처리하면, 사용자는 작업이 끝날 때까지 기다리지 않고 프로그램의 다른 기능을 사용할 수 있습니다.
  2. 비용 절감 및 성능 최적화
    • 비동기 방식은 리소스를 효율적으로 관리하며, 특히 많은 IO 작업을 처리하는 시스템에서 CPU 유휴 시간을 줄여줍니다.

비동기 호출과 상태 관리

비동기 호출의 핵심은 콜백작업 상태 관리입니다. 작업 완료 후 호출되는 콜백 함수Promise 객체를 활용하여 호출 흐름을 관리합니다. 아래는 다양한 비동기 처리 방식과 상태 관리 예제입니다.

1) 콜백(callback)

  • 비동기 작업이 완료되면, 등록된 콜백 함수가 실행됩니다.
  • 콜백 지옥(Callback Hell)을 방지하기 위해 코드 구조를 단순화하는 추가 도구들이 활용됩니다.
void PerformTaskWithCallback(Action callback)
{
    // 비동기 작업 수행
    Console.WriteLine("작업을 시작합니다...");
    Task.Delay(2000).Wait(); // 2초 지연
    callback();
}

// 사용 예시
PerformTaskWithCallback(() =>
{
    Console.WriteLine("비동기 작업 완료!");
});

2) Promise 및 Task 객체

  • 비동기 작업의 성공 및 실패를 다룰 수 있는 더 체계적인 방법입니다.
  • .NET의 Task와 JavaScript의 Promise는 대표적인 구현 예입니다.
Task<string> PerformTaskAsync()
{
    return Task.Run(() =>
    {
        Task.Delay(2000).Wait(); // 2초 지연
        return "작업 완료!";
    });
}

// 사용 예시
async Task RunAsyncTask()
{
    var result = await PerformTaskAsync();
    Console.WriteLine(result); // 출력: 작업 완료!
}

Async/Await의 등장과 활용

Async/Await 키워드는 비동기 프로그래밍의 복잡성을 줄이고 코드의 가독성을 높이는 데 중요한 역할을 합니다.

  1. 가독성 향상
    • 복잡한 콜백 체인을 단순화하여 순차적 논리처럼 작성할 수 있습니다.
  2. 동기 코드처럼 작성 가능
    • 비동기 작업이 마치 동기적으로 실행되는 것처럼 보이도록 작성할 수 있습니다.
 
async Task<string> FetchDataFromServerAsync()
{
    Console.WriteLine("데이터를 가져오는 중...");
    await Task.Delay(3000); // 3초 지연
    return "서버 응답 데이터";
}

async Task MainAsync()
{
    var data = await FetchDataFromServerAsync();
    Console.WriteLine(data); // 출력: 서버 응답 데이터
}

주요 차이점

 

특징동기(Synchronous)비동기(Asynchronous)

실행 순서 순차적 비순차적 (병렬 가능)
흐름 제어 작업 완료 후 다음 작업 실행 작업 중에도 다른 작업 실행 가능
응답성 느림 빠름
복잡성 낮음 높음
자원 사용 효율성 비효율적 효율적

활용 사례

  1. 동기:
    • 데이터베이스 트랜잭션 처리.
    • 사용자 입력 대기와 같은 경우.
  2. 비동기:
    • 네트워크 요청 처리.
    • 파일 다운로드 및 업로드.
    • GUI 응답성 유지.

+ Recent posts