Synchronous는 "동시에 일어나는"이라는 의미로, 동기식 처리 모델은 직렬적으로 작업(task)을 수행한다. 즉, 하나의 작업이 실행되는 동안, 뒤의 다른 작업들은 그대로 멈춘 채 자신의 차례가 오기까지를 기다린다.
서버에서 데이터를 가져와서 화면에 표시하는 작업을 수행할 때, 서버에 데이터를 요청하고 데이터가 응답될 때까지 이후 작업(task)들은 블로킹(blocking, 작업 중단)된다.
예시1
: 커피 주문
가장 위 그림의 (a)처럼 커피 주문을 받고 나올 때까지 다음 손님은 주문을 기다려야한다.
예시2
: 새우버거 주문
손님이 새우버거를 먹기 위해 패스트푸드점에 방문하는 상황을 떠올려보자.
동기 방식 java
예시 코드
package Sync_Async;
public class sync {
public static void main(String[] args) {
method1();
method2();
method3();
}
public static void method1() {
System.out.println("This is method1");
}
public static void method2() {
System.out.println("This is method2");
}
public static void method3() {
System.out.println("This is method3");
}
}
Asynchronous는 "동시에 일어나지 않는"이라는 의미로, 비동기식 처리 모델은 병렬적으로 작업(task)을 수행한다. 즉, 작업이 종료되지 않은 상태라 하더라도 대기하지 않고 다음 작업을 실행한다.
서버에서 데이터를 가져와서 화면에 표시하는 작업을 수행할 때, 서버에 데이터를 요청한 후에 서버로부터 데이터가 응답될 때까지 대기하지 않고(Non-Blocking) 즉시 다음 작업을 수행한다. 이후, 서버로부터 데이터가 응답되면 이벤트가 발생하고, 이벤트 핸들러가 데이터를 가지고 수행할 작업을 계속 수행한다.
Java
에서는 대표적으로 Multi Thread의 동작이 비동기식 처리로 동작한다.JavaScript
대부분의 DOM 이벤트와 Timer 함수(setTimeout, setInterval), Ajax 요청은 비동기식 처리 모델로 동작한다.예시1
: 커피 주문
가장 위 그림의 (b)처럼 점원 한 명이 커피 주문을 받고 다른 점원이 커피를 건네줄 수 있다.
예시2
: 업무 지시
패스트푸드점에 점장이 방문하여 점원1에게 청소, 점원2에게 설거지를 해달라고 업무를 지시하고 점장은 구석에서 식사를 한다고 하자. 점원들의 작업은 비동기식으로 처리된다.
1. 점장은 점원1에게 청소 요청을 보낸 후, 응답을 받지 않은 상태에서 점원2에게 설거지 요청을 보낸다.
2. 점장이 식사를 하는 동안 점원들은 각각 청소와 설거지를 한다.
동기 방식 java
예시 코드
package Sync_Async;
public class async {
public static void main(String[] args) {
Thread t = new Thread(()->{
method1();
});
Thread t2 = new Thread(()->{
method2();
});
Thread t3 = new Thread(()->{
method3();
});
t.start();
t2.start();
t3.start();
}
public static void method1() {
System.out.println("This is method1");
}
public static void method2() {
System.out.println("This is method2");
}
public static void method3() {
System.out.println("This is method3");
}
}
이는 자바의 Thread 스케줄러에 의해 제어되어 항상 method1, method3, method2 순서가 아니라 계속 바뀌게 된다.
구분 | 동기 | 비동기 |
---|---|---|
스레드 | 싱글 스레드(Single Thread) | 멀티 스레드(Multi Thread) |
장점 | 작업의 순서가 보장되어 있어 설계가 단순하고, 안전하다. | 요청을 처리할 수 있는 작업단위가 여러 개이기 때문에, 하나의 작업이 끝나기를 기다리지 않아도 다음 실행을 할 수 있다. |
단점 | 응답이 돌아오기까지 다음 동작으로 넘어가지 못하기 때문에, 자원을 효율적으로 사용하지 못한다. | 싱글 스레드와 비교하면 설계가 복잡하다. 또한, 비동기식으로 보낸 요청의 결과가 다음 실행에 영향을 미치는 경우에는 코드가 개발자의 의도와 다르게 동작할 수 있다. |
참고
알잘딱깔센 JavaScript 비동기 프로그래밍 - 비동기 너 내 동기가 돼라
Web Club:티스토리
[Java]동기와 비동기 방식(Asynchronous processing model)