본문 바로가기
-- 오늘 있었던 개발 일기

동기(Sync)와 비동기(Async)

by code study 2026. 2. 20.

동기와 비동기란?

프로그래밍에서 작업을 처리하는 방식은 크게 두 가지로 나뉩니다. 요청 후 응답이 올 때까지 기다리는 동기(Synchronous) 방식과, 응답을 기다리지 않고 다음 작업을 계속 진행하는 비동기(Asynchronous) 방식입니다.


동기 (Synchronous)

동기 방식은 요청을 보낸 후 응답이 올 때까지 다음 코드를 실행하지 않고 대기합니다.

순서대로 처리되기 때문에 코드의 흐름을 파악하기 쉽지만, 응답이 오기 전까지 다른 작업을 할 수 없는 블로킹(Blocking) 상태가 발생합니다.

요청 → [대기 중...] → 응답 → 다음 작업

예를 들어 카페에서 커피를 주문하고 카운터 앞에서 커피가 나올 때까지 기다리는 것과 같습니다.

// 동기 예시
String result = userService.findUser(id); // 응답 올 때까지 대기
System.out.println(result);              // 응답 온 후 실행

비동기 (Asynchronous)

비동기 방식은 요청을 보낸 후 응답을 기다리지 않고 다른 작업을 계속 진행합니다. 응답이 오면 콜백(Callback)이나 Future를 통해 결과를 처리합니다.

요청 → 다음 작업 진행 → (응답 도착) → 콜백 실행

카페에서 커피를 주문하고 진동벨을 받은 후 자리에서 다른 일을 하다가 벨이 울리면 가져오는 것과 같습니다.

// 비동기 예시
CompletableFuture.supplyAsync(() -> userService.findUser(id))
    .thenAccept(result -> System.out.println(result)); // 응답 오면 실행
// 위 코드가 실행되는 동안 다른 작업 가능

동기 vs 비동기 비교

구분 동기 비동기
실행 방식 응답 올 때까지 대기 응답 기다리지 않고 진행
흐름 순차적 병렬적
장점 코드 흐름 파악 쉬움 성능 효율적
단점 블로킹 발생 코드 복잡도 증가
주요 사용 일반 DB 쿼리, 파일 읽기 AJAX, 이메일 발송, 알림

Spring에서의 비동기 처리

Spring에서는 @Async 어노테이션을 사용해 간단하게 비동기 처리를 구현할 수 있습니다.

@EnableAsync // 메인 클래스 또는 설정 클래스에 추가
@SpringBootApplication
public class Application { ... }

@Service
public class EmailService {

    @Async // 이 메서드는 별도 스레드에서 실행
    public void sendEmail(String to) {
        // 이메일 발송 로직 (시간이 오래 걸려도 메인 흐름 블로킹 없음)
    }
}

회원가입 후 이메일 발송처럼, 응답을 기다릴 필요 없는 작업에 비동기를 적용하면 사용자 응답 속도를 크게 개선할 수 있습니다.


언제 무엇을 써야 할까?

동기는 작업 순서가 중요하거나 다음 작업이 이전 결과에 의존할 때 사용합니다. 예를 들어 결제 처리처럼 순서와 정확성이 중요한 경우가 해당됩니다.

비동기는 시간이 오래 걸리는 작업이면서 결과를 즉시 필요로 하지 않을 때 사용합니다. 이메일 발송, 푸시 알림, 로그 저장 등이 대표적인 예시입니다.


정리

동기와 비동기는 우열의 개념이 아니라 상황에 맞게 선택해야 하는 도구입니다. 코드의 순서와 정확성이 중요하다면 동기, 성능과 응답 속도가 중요하다면 비동기를 선택하는 것이 좋습니다.