CS

[ CS ] 동기와 비동기

haenni 2025. 9. 18. 13:37

들어가기앞서…

개발 공부를 하다보면 동기와 비동기라는 자주 듣게된다. 이건 멀티 스레드 혹은 동시성에 대해서 공부를 하다보면 더더욱 자주 듣게 되는데, 도대체 동기와 비동기란 무엇일까? 이번 기회에 알아보자.


동기와 비동기

동기와 비동기는 무엇일까?

아래의 사진은 동기와 비동기 이해를 돕기 위해 사용된 사진이다.

동기를 살펴보면 한명의 주인이 여러명의 고객을 순차적으로 맡아 결제를 진행하고있다. 또한 주문한 후에 커피가 나올때 까지 기다려야한다.

비동기를 살펴보면 여러명의 주인이 고객을 맡아 결제를 진행하고있다. 또한 주문 후 진동벨이 울리면 커피를 가져올 수 있다.

둘의 운영 방식에 확실히 차이점이 있어보인다. 이제 좀 더 깊게 들어가보자.

동기(Synchronous)

동기는 사전적으로 ‘동시에 일어난다’라는 의미를 가지고있다. 프로그래밍에서 동기는 하나의 작업(스레드)가 순차적으로 진행되는 것을 의미한다.

한 작업이 시작되면 해당 작업이 완료될 때 까지 다른 작업은 순차적으로 기다려야한다.

동기 테스트 코드

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");
    }
}
method1
method2
method3

자바의 특성상 위에서 아래로 내려오며 main문 순서대로 메서드를 실행하게 된다.

비동기(ASynchronous)

비동기는 사전적으로 ‘동시에 일어나지 않는다’라는 의미를 가지고있다.

즉 프로그래밍에서의 비동기는 하나의 작업이 시작되고 끝나는 것을 다른 작업이 기다리지않고, 각각의 작업이 독립적으로(병렬적으로)실행할 수 있는 방식을 의미한다.

하나의 작업이 종료되지 않아도 대기하지 않고 다음 작업을 실행하며, 서버에서 데이터를 가져와 화면에 표시하는 작업을 수행할 때, 서버에 데이터를 요청한 이후 서버로부터 데이터가 응답될 떄 까지 대기하지 않고 바로 다음 작업을 시작한다.

이후 서버로부터 데이터가 응답되면 이벤트가 발생하게 되고, 이벤트 핸들러가 데이터를 가지고 수행할 작업을 계속 수행한다.

이런 비동기 방식은 주로 I/O 작업이나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 유용하다.

이러한 작업을 비동기적으로 처리하면, 프로그램은 작업이 완료되기를 기다리는동안 다른 작업을 처리할 수 있어 전체적인 성능이 향상된다.

비동기 테스트 코드

자바에서는 멀티 스레드 동작이 비동기식으로 작동한다.

packaage Sychro_Asynchro;

public class Asynchor {
	public static void main(String[] args) {
    	
        Thread t = new Thread(() -> { method(); 
        });
	    
        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");
	}
}
실행할 떄마다 결과가 바뀐다.
method2
method3
method1
.
.
method3
method2
method1
.
.
method1
method2
method3

위의 코드는 각 스레드에 각각의 메서드를 수행하는 코드를 담았다. 위의 코드를 실행하게 되면 순차적으로 처리되지 않으며, 처리 순서가 보장되지 않는 것을 확인할 수 있다.

동기 VS 비동기

위의 정의를 살펴보면 비동기가 성능이 향상되니 무조건 비동기를 적용하면 좋지 않을까? 라는 생각이 들 수 있지만, 각자의 장단점이 뚜렷하여 활용되는 사례가 다르다.

**동기 방식**은 순차적으로 실행되는 것을 보장하고, 다른 스레드에 접근할 수 없기 때문에 안정적이므로 주로 간단하고 직관적인 코드 작성이 요구되는 경우에 사용된다.

예를 들어 순차적으로 실행되어야 하는 작업(= 특정 작업이 반드시 완료된 이후에 다음 작업을 수행해야하는 경우) 혹은 작업 간의 의존성이 높은 경우 동기 방식이 적합하다.

**비동기 방식**은 여러 작업을 동시에 처리해야하는 경우나, 시간이 오래 걸리는 작업을 다른 작업과 병렬로 처리해야 하는 경우에 적합하다.

예를 들어, 사용자 인터페이스 응답성을 향상시키기위해 네트워크 요청이나 파일 다운로드를 비동기적으로 처리할 수 있으며, 작업의 완료 여부를 기다리지 않고 다른 작업을 계속 실행할 수 있는 경우에 유용하다.


마무리하며…

동시성 문제를 Lock없이 비동기 방식으로 처리해보는 것은 어떨까? 라는 생각이 들어 적용하기 전에 기초를 다지고자 해당 내용을 공부하고 정리하게 되었다.

비동기식 사용 방식을 찾던 와중에 MQ를 이용한 비동기식 처리를 알게되었다. 백엔드에서 입력에 대한 처리 후 kafka나 RabbitMQ 등을 이용하여 메시지 큐에 이벤트를 보낸 후 백엔드에서 해당 처리를 완료처리하고, 해당 메시지에 대한 응답을 MQ를 통해 다시 해당 백엔드 서비스로 받아 처리하는 방식으로 비동기 처리가 가능하다.

이러한 기능을 이용한다면 백엔드 처리 후 MQ ~ 백엔드로 다시 받는 결과처리 로직을 기다리지 않고, 백엔드로 들어오는 인풋 처리를 모두 단순ㅇ히 메시지 큐로 요청 이벤트를 보내는 형식의 비동기 전송이 가능하다.

메시지 큐에 대해서 공부를 해봐야겠다.


레퍼런스

 

동기와 비동기에 대해 공부하며 참고한 레퍼런스입니다.

동기(Synchronous)와 비동기(Asynchronous)의 차이가 뭔가요?

 

동기(Synchronous)와 비동기(Asynchronous)의 차이가 뭔가요?

안녕하세요동기(Synchronous)와 비동기(Asynchronous)는 프로그래밍에서 중요한 개념으로오늘 한번 정리해보려합니다. 이 두가지 개념은 다양한 애플리케이션과 시스템에서 사용됩니다.이들 개념을

won-percent.tistory.com

자바 동기 비동기

 

자바 동기 비동기

출처 - https://poiemaweb.com/js-async 동기와 비동기식 처리에 대한 가장 쉬운 예시는 위 이미지를 참고하면 좋다. 하지만 이렇게만 알기보단 조금 더 디테일하게 알아보자 동기식 처리(Synchronous) 동기

velog.io

PoiemaWeb

 

Asynchronous processing model | PoiemaWeb

동기식 처리 모델(Synchronous processing model)은 직렬적으로 작업을 수행한다. 즉, 작업은 순차적으로 실행되며 어떤 작업이 수행 중이면 다음 작업은 대기하게 된다. 예를 들어 서버에서 데이터를 가

poiemaweb.com

 

 

 

 

 

 

 

들어가기 앞서 . . .

간단하게 왜 포스팅을 시작하게 되었는지 이유를 작성하자.

 


제목

간단하게 어떤 포스팅이고 어떤 주제를 다룰건지 작성하자

 

 

이론 1

내용

 

 

 


이론 2

내용


 

마무리하며

마무리하며 어떤 점을 배웠는지 작성해보자