본문 바로가기
[Java]

[Java] 동기, 비동기 방식 (Asynchronous processing model)

by SAMSUNG Metaverse-Cloud 2022. 12. 8.
728x90

 

 

동기, 비동기 방식은 업무를 보다보면 정말 많이 듣게 될 것이다. 구글에 동기와 비동기를 검색해본 결과 가장 많이 비유를 드는것은 아래의 은행 업무, 혹은 카페에서 음료를 주문하는 예시가 있다.

 

위 그림처럼 동기식 처리는 은행 업무를 한 줄로 서 순서대로 업무를 진행하는 것과 같고, 비동기식은 여러 업무 창에서 일을 분업해서 진행하는 것과 같다고 볼 수 있다.

그럼 정확하게 업무 처리에 대해 확인해보자.

동기식 처리 (Synchronous)
동기식 처리 모델 (Synchronous processing model)은 직렬적으로 테스크를 수행한다. 즉, 테스크는 순차적으로 실행되며 어떤 작업이 수행중이면 다음 작업은 대기하게 된다.

아래는 동기식으로 동작하는 코드이다. 

package Synchro_Asynchro;

public class Synchro {
	public static void main(String[] args) {
		
		method1();
		method2();
		method3();
		
	}
	
	public static void method1() {
		System.out.println("method1");
	}
	public static void method2() {
		System.out.println("method2");
	}
	public static void method3() {
		System.out.println("method3");
	}
	
}

위 코드의 실행 결과는 아래와 같다.

프로그램을 몇번을 다시 시작해도 위의 순서는 변하지 않는다.
자바의 특성으로 위에서 아래로 내려오면서 코드가 main문 (Main Thread)에서 작성한 순서대로 메서드를 실행하게 된다.

 

비동기식 처리(Asynchronous)

비동기식 처리 모델 (Asynchronous processing model 또는 Non-Blocking processing model)은 병렬적으로 테스크를 수행한다. 즉, 테스크가 종료되지 않은 상태라 하더라고 대기하지 않고 다음 테스크를 실행한다.

예를 들어 서버에서 데이터를 가져와서 화면에 표시하는 테스크를 수행할때, 서버에 데이터를 요청한 이후 서버로부터 데이터가 응답될 때까지 대기하지 않고(Non-Blocking) 즉시 다음 테스크를 수행한다.

이후 서버로부터 데이터가 응답되면 이벤트가 발생하고 이벤트 핸들러가 데이터를 가지고 수행할 테스크를 계속해 수행한다.

자바에서는 대표적으로 Multi Thread의 동작이 비동기식으로 작동한다.

package Synchro_Asynchro;

public class Asynchro {
	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("method1");
	}
	public static void method2() {
		System.out.println("method2");
	}
	public static void method3() {
		System.out.println("method3");
	}
}

위의 코드는 각 메서드를 각각의 Thread 객체에 담아 Start 메서드 (Thread 실행 메서드)를 통해 각각의 메서드를 수행하게 된다.

동기식 처리의 경우 위의 코드에서
method1
method2
method3
의 순서로 결과가 나타날 것 같지만 실제로 수행되는 결과를 보면 다음과 같다.

예상과 달리 method3이 method2 보다 먼저 출력된 것을 알 수 있다.
또한 이것은 항상 이런 순서가 아닌 실행 할 때마다 순서가 계속 바뀌게 된다. 이는 자바의 Thread 스케쥴러에 의해 제어된다.
이 처럼 자바의 Multi Thread 처리는 비동기식으로 처리되며, 처리 순서는 보장이 안되는것을 알수 있다.

비동기식의 장단점.

장점 : 요청에 따른 결과가 반환되는 시간 동안 다른 작업을 수행 할수 있다.
단점 : 동기식보다 설계가 복잡하고 논중적이다.

그럼 서버에서는 어떻게 장점을 이용할수 있을까?

시간이 오래 걸리는 로직의 경우 동기처리시 한 청의 처리를 끝날때 까지 다른 요청을 받을수 없지만 비동기로 처리시 다수의 요청을 받을수 없지만 비동기로 처리시 다수의 요청을 동시에 받을 수 있다.

728x90

'[Java]' 카테고리의 다른 글

[웹개발] 웹스퀘어란?  (0) 2023.01.12
[Java] Collection이란?  (0) 2022.12.11
[Java] Basic 용어 정리  (0) 2022.12.07