본문 바로가기
Web Frontend

동기와 비동기 쉽게 이해하기

by 코라채 2025. 1. 6.
728x90

동기와 비동기란?

소프트웨어 개발에서는 "동기(Synchronous)"와 "비동기(Asynchronous)"라는 개념이 자주 등장합니다. 어떤 경우에 동기를 사용하고 비동기를 사용하는지에 대해 간단한 개념 설명을 통해 알아보겠습니다.


동기와 비동기의 개념

동기(Synchronous)

동기란 작업이 순차적으로 진행되는 방식을 말합니다. 하나의 작업이 끝나야만 다음 작업이 시작됩니다.

  • 특징: 작업이 서로 "맞물려" 진행됩니다. 이전 작업이 완료될 때까지 대기해야 하므로 실행 순서가 보장됩니다.

비동기(Asynchronous)

비동기란 작업이 병렬적으로 진행되는 방식을 말합니다. 하나의 작업이 완료될 때까지 기다리지 않고, 동시에 다른 작업을 진행할 수 있습니다.

  • 특징: 대기 시간이 없으며, 결과가 준비되면 알림을 받거나 콜백을 통해 처리합니다. 완료되는 시점을 파악하기 어렵습니다.

동기와 비동기의 일상적인 예제

동기의 예: 줄 서서 계산하기

동기 방식은 마트에서 계산대를 예로 들 수 있습니다. 손님이 계산을 마칠 때까지 뒤에 있는 손님은 기다려야 합니다.

  • 순서
    1. 첫 번째 손님이 계산을 마칩니다.
    2. 두 번째 손님이 계산을 시작합니다.
    3. 세 번째 손님은 그 뒤에 계산합니다.

비동기의 예: 음식점에서 주문하기

비동기 방식은 음식점에서 음식을 주문하고 기다리는 상황과 비슷합니다. 음식을 주문한 뒤 음식을 받을 때까지 다른 손님이 주문하거나 직원이 다른 일을 처리할 수 있습니다.

  • 순서
    1. 고객이 음식을 주문합니다.
    2. 요리사가 음식을 준비하는 동안, 고객은 대기하거나 다른 일을 할 수 있습니다.
    3. 음식이 준비되면 직원이 음식을 가져다 줍니다.

프로그래밍에서의 동기와 비동기

동기 프로그래밍

동기 방식에서는 코드가 위에서 아래로 순차적으로 실행됩니다. 특정 작업이 끝날 때까지 다음 작업은 대기합니다. 이때 대기하는 상태를 blocking이라고 합니다.

# 동기 코드 예제
print("첫 번째 작업 시작")
time.sleep(2)  # 2초 동안 대기
print("두 번째 작업 시작")
  • 출력:
    첫 번째 작업 시작
    (2초 대기)
    두 번째 작업 시작

비동기 프로그래밍

비동기 방식에서는 작업이 병렬적으로 실행되며, 시간이 오래 걸리는 작업은 백그라운드에서 처리됩니다. 이때 작업이 끝날 때까지 대기하는 않는 것은 Non-bloking이라고 합니다.

# 비동기 코드 예제
async function firstTask() {
    console.log("첫 번째 작업 시작");
    await new Promise(resolve => setTimeout(resolve, 2000));  // 2초 대기
    console.log("첫 번째 작업 완료");
}

async function secondTask() {
    console.log("두 번째 작업 시작");
}

async function runTasks() {
    await Promise.all([firstTask(), secondTask()]);
}

runTasks();
  • 출력:
    첫 번째 작업 시작
    두 번째 작업 시작
    (2초 후)
    첫 번째 작업 완료

동기와 비동기의 장단점

동기의 장단점

  • 장점
    • 코드 흐름이 직관적이고 이해하기 쉽습니다.
    • 디버깅이 간단합니다.
  • 단점
    • 작업이 완료될 때까지 대기해야 하므로 성능이 저하될 수 있습니다.

비동기의 장단점

  • 장점
    • 작업을 병렬로 처리하므로 성능이 향상됩니다.
    • 대기 시간이 줄어들어 사용자 경험이 개선됩니다.
  • 단점
    • 코드 흐름이 복잡해질 수 있습니다.
    • 디버깅이 어려울 수 있습니다.
  동기 비동기
장점 업무가 단순함 자원을 효율적으로 사용
단점 자원을 비효율적으로 사용 업무가 복잡해질 수 있음

상황에 따라 선택하기

  • 순차적으로 실행되어야하는 경우와 아닌 경우를 잘 구별하여 코드를 작성해야합니다. 결과에 다음 행동이 달라지는 경우에는 동기로 코드를 작성해야하지만 아닌 경우에는 비동기로 작성하는 편이 UI(사용자 경험)측면에서 좋습니다. 동기는 결과를 기다리는 것, 비동기는 결과를 기다리지 않는 것이라고 생각하면 조금 더 쉽게 이해할 수 있을 것입니다.

추가로 공부하면 좋은 개념

  1. 멀티스레드(Multithreading):
    • 여러 작업을 동시에 실행하기 위해 CPU의 스레드를 활용하는 방식.
  2. 이벤트 루프(Event Loop):
    • 비동기 프로그래밍에서 작업을 관리하고 실행하는 메커니즘.
  3. 콜백 함수(Callback Function):
    • 특정 작업이 완료되었을 때 호출되는 함수.
  4. Promise와 async/await (JavaScript):
    • 비동기 작업을 처리하기 위한 JavaScript 문법.
  5. 병렬 처리(Parallel Processing):
    • 여러 CPU 코어를 활용해 작업을 병렬로 처리하는 방법.

마무리

동기와 비동기는 개발에서 필수적으로 이해해야 할 중요한 개념입니다. 동기는 간단하고 직관적이지만, 성능 최적화가 필요할 때는 비동기 방식을 활용하는 것이 유리합니다.

728x90