프로그래밍에서 동기( Synchronous )와 비동기( asynchronous )라는 개념은
코드가 실행되는 방식과 흐름을 이해하는 데 중요한 개념입니다.
이 두 가지는 주로 시스템의 응답성, 효율성을 다룰 때 사용되며, 각각의 개념을 정확히 이해하고
더 나은 프로그램 설계 및 구현에 필수적입니다.
동기(Synchronous) 프로그래밍
개념
동기 프로그래밍에서는 작업이 순차적으로 실행됩니다. 즉, 하나의 작업이 끝날 때까지 다음 작업이 시작되지 않습니다.
이러한 방식은 코드가 작성된 순서대로 실행되며,
이전 작업이 완료되어야만 다음 작업이 진행되므로 실행 순서를 예측하기 쉽습니다.
public void fetchData() {
// 데이터베이스에서 데이터를 가져오는 작업
List<String> data = getDataFromDatabase();
// 데이터를 처리하는 작업
processData(data);
// 결과를 출력하는 작업
printData(data);
}
예시에서는 데이터베이스에서 데이터를 가져오고, 가져온 데이터를 처리한 후,
결과를 출력하는 작업이 순차적으로 이루어집니다.
하나의 작업이 완료되지 않으면 다음 작업이 시작되지 않습니다.
활용 사례는
- 파일 입출력 : 파일을 읽거나 쓸 때
- 데이터베이스 쿼리 : 데이터베이스에서 데이터를 읽거나 쓸 때
- UI 업데이트 : 사용자 인터페이스에서 순차적인 작업을 처리할 때
장점
코드가 직관적이며 이해하기 쉽고 실행 순서가 명확합니다.
단점
- 긴 작업 (네트워크 요청등)이 있다면 전체 프로그램이 블로킹 될 수 있다.
- 응답 시간이 길어질수 있음.
비동기(Asynchronous) 프로그래밍
개념
비동기 프로그래밍에서는 작업이 동시에 실행될 수 있습니다.
하나의 작업이 완료되기를 기다리지 않고, 다른 작업을 진행할 수 있습니다.
비동기 작업은 완료되면 콜백 함수나 미래 객체(Future, Promise)를 통해 결과를 처리합니다
public void fetchData() {
// 데이터베이스에서 데이터를 비동기로 가져오는 작업
CompletableFuture<List<String>> dataFuture = getDataFromDatabaseAsync();
// 데이터 가져오기 완료 시 실행할 콜백 함수 등록
dataFuture.thenAccept(data -> {
// 데이터를 처리하는 작업
processData(data);
// 결과를 출력하는 작업
printData(data);
});
}
예시에서는 데이터베이스에서 데이터를 비동기로 가져오고, 데이터가 준비되면 콜백 함수를 통해 나머지 작업 처리
활용 사례는
- 웹 서비스 API 호출 등
- 파일 입출력 : 비동기 파일 읽기/쓰기
- 타이머 : 일정 시간 후에 작업을 실행할 때
장점
- 긴 작업이 전체 프로그램을 블로킹하지 않습니다.
- 응답 시간이 짧아질 수 있습니다.
단점
- 코드가 복잡해질 수 있습니다.
- 디버깅과 오류 처리가 어렵습니다.
동기, 비동기 차이점 요약
실행 방식: 동기는 순차적, 비동기는 동시에
블로킹 여부: 동기는 블로킹, 비동기는 논블로킹
응답 시간: 동기는 응답 시간이 길어질 수 있음, 비동기는 짧아질 수 있음
코드 복잡도: 동기는 간단, 비동기는 복잡
언제 어떤 방식을 사용하는가?
동기 : 단순한 작업 순서가 중요한 경우, 또는 작업이 짧고 응답시간이 중요하지 않는 경우
1. 파일 처리 애플리케이션
파일을 읽고 그 내용을 바로 처리하여 사용자에게 결과를 보여줄때
예 ) 텍스트 파일을 읽고, 파일의 내용을 분석하여 결과를 출력할때 ( 웹북 )
2. 단일 요청-응답 기반 웹 서비스
사용자가 요청을 보내면 서버가 즉시 응답을 반환하는 경우
예 ) 사용자 로그인 처리
로그인 요청을 처리하는 동안 다른 작업을 수행할 필요가 없기때문에
비동기 : 긴 작업이 많고, 응답성이 중요한 경우.
예를 들어, 사용자 인터페이스가 있는 애플리케이션에서 비동기 방식으로
네트워크 요청을 처리하면 사용자는 프로그램이 멈추지 않고 계속 사용할 수 있습니다.
1. 웹 애플리케이션에서 데이터 페칭
웹 페이지 로딩 후, 추가 데이터를 서버에서 비동기로 가져오는 경우
예 ) 사용자가 웹 페이지를 열 때 초기 화면을 빠르게 보여주고, 이후 추가 데이터를 비동기로 가져와 화면에 업데이트
2. 마이크로서비스 간의 통신
서로 다른 마이크로서비스가 상호작용할 때,
하나의 서비스가 다른 서비스의 응답을 기다리지 않고 계속 작업을 수행할 수 있어야 하는 경우
예) 주문 서비스가 결제 서비스에 결제 요청을 보내고, 응답을 기다리지 않고 주문 프로세스를 계속 진행.
마무리
여러 스레드가 하나의 리소스에 동시에 접근하여 수정하려고 할 때, 동시성 문제가 발생할 수 있습니다.
예를 들어, 입금과 출금이 동시에 일어나는 은행 계좌 시스템이 있습니다.
만약 잔고가 만원인 계좌에 입금 작업이 먼저 수행되어 2만원으로 증가하려는 순간에
출금 작업이 동시에 수행되어 잔고가 0원이 되는 상황이 발생할 수 있습니다.
이는 동시성 문제로 인해 발생하며, 이러한 문제를 해결하기 위해서는 적절한 동기화 메커니즘이 필요합니다.
실제 서비스에서 동기와 비동기의 사용은 상황과 요구사항에 따라 다르고
동기 방식은 순차적인 작업이 중요하거나 작업시간이 짧거나 간단한 경우에 적합합니다.
반면, 비동기 방식은 긴 작업이 많고 응답성이 중요한 경우, 특히 사용자 경험을 향상시키기위해 많이 사용됩니다.
이러한 차이를 이해하고 적절히 사용하여 개발중인 프로젝트나 서비스에 효율적인 애플리케이션을 개발하는데
필수라고 생각합니다.
'CS지식' 카테고리의 다른 글
| 클라우드 ( AWS ) 지식 (1) | 2024.08.02 |
|---|---|
| 운영체제와 WAS 정리 (1) | 2024.08.02 |
| 네트워크 CS지식 (2) | 2024.08.01 |
| 동시성 제어 - 뮤텍스와 세마포어 (3) | 2024.07.31 |
| 데이터베이스 CS 지식 (5) | 2024.07.30 |