🔥스파르타 TIL (Spring)

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

승승장규 2025. 3. 5. 10:57

동기 : 만약 어떤 함수 X가 동기로 함수 Y를 호출하면, X는 Y의 작업이 완료될 때까지 기다려야하는 순차적인 진행이다.

비동기 : 함수 X가 비동기로 함수 Y를 호출하면, X는 Y의 작업을 신경쓰지 않고 따로 동작하는 병렬적인 진행이다.

 

Spring에서는 기본적으로 동기적으로 처리되지만, 비동기가 필요한 경우에는 @Async 어노테이션을 사용하여 구현할 수 있다.

 

동기 ▼

@GetMapping("/task")
public String syncTask() throws InterruptedException {
    System.out.println("동기 작업 시작");
    Thread.sleep(3000); // 3초 동안 대기
    System.out.println("동기 작업 완료");
    return "동기 작업 완료";
}

결과 ▼

▶ 동기 작업 시작
(3초 후)
▶ 동기 작업 완료

 

블로킹 함수를 사용해서 현재 요청을 처리하는 쓰레드가 3초 동안 대기한다. 쓰레드가 대기하는 동안에는 다른 요청을 동시에 처리할 수 없다.

 

비동기 ▼

// 비동기 사용을 위한 설정
@Configuration
@EnableAsync
public class AsyncConfig {
}

// Service
@Async
public void asyncTask() throws InterruptedException {
    System.out.println("비동기 작업 시작");
    Thread.sleep(3000); // 3초 대기
    System.out.println("비동기 작업 완료");
}

// Controller 
@GetMapping("/task")
public String asyncTask() {
    System.out.println("비동기 작업 요청 수신");
    asyncService.asyncTask(); // 비동기 실행
    return "비동기 작업 시작";
}

 

결과 ▼

▶ 비동기 작업 요청 수신
▶ 비동기 작업 시작
(3초 후)
▶ 비동기 작업 완료

 

@Async 어노테이션으로 논블로킹 방식으로 전환 가능하다.

비동기로 실행 시 요청을 보낸 직후, 즉시 응답을 받게된다.

비동기 작업은 별도의 쓰레드에서 실행되므로, 요청 순서와 관계없이 완료 순서가 달라질 수 있다.

만약 동시에 여러 개의 요청을 보내면 여러 개의 쓰레드에서 작업이 병렬 실행된다.