동기 : 만약 어떤 함수 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 어노테이션으로 논블로킹 방식으로 전환 가능하다.
비동기로 실행 시 요청을 보낸 직후, 즉시 응답을 받게된다.
비동기 작업은 별도의 쓰레드에서 실행되므로, 요청 순서와 관계없이 완료 순서가 달라질 수 있다.
만약 동시에 여러 개의 요청을 보내면 여러 개의 쓰레드에서 작업이 병렬 실행된다.
'🔥스파르타 TIL (Spring)' 카테고리의 다른 글
JPA Auditing 이란? (1) | 2025.03.07 |
---|---|
IoC 컨테이너 활용: 생성자 주입과 빈 조회 방식 (0) | 2025.03.06 |
Pageable을 알아보자 (0) | 2025.02.25 |
QueryDSL 이란? (0) | 2025.02.25 |
Spring Security + JWT 로그인 구현하기 (0) | 2025.02.25 |