안녕하세요! 피피아노입니다🎵
이번 포스팅에서는 프로그래밍에서 중요한 개념인 '동기'와 '비동기'에 대해 간단하고 쉽게 이해할 수 있는 방법으로 설명해보려고 합니다.
프로그래밍을 배우다 보면 동기 방식과 비동기 방식에 대해서 접할 때가 있는데 정확한 개념과 어떤 경우에 각각의 방식이 쓰이는지 한 번 정리해보겠습니다!
동기 방식 (Synchronous)
동기 방식 (Synchronous)은 요청과 그 결과가 순차적으로 이루어지는 통신 방식을 말합니다. 코드가 실행되면, 해당 코드의 작업이 완료될 때까지 다음 코드로 넘어가지 않습니다. 이는 마치 질문을 하고 답변을 듣는 과정에서, 질문에 대한 답변을 들을 때까지 다음 질문을 하지 않는 것과 유사합니다.
동기 방식을 좀 더 쉽게 이해하기 위해, 카페에서 커피를 주문하고 받는 상황을 생각해보겠습니다.
여러분이 주문을 하고 나서 바로 커피를 받지 못하고, 주문한 커피가 만들어질 때까지 기다리는 상황입니다. 그동안 다른 주문을 받거나 다른 일을 처리할 수 없고, 당신이 주문한 커피가 완성될 때까지 기다려야 합니다. 이렇게 요청과 그 결과가 동시에 이루어지고, 요청한 일이 끝나야 다음 일을 진행할 수 있는 방식을 '동기 방식'이라고 합니다.
동기 방식의 장점으로는 구현이 상대적으로 간단하고 직관적이라는 점이 있습니다. 반면, 단점으로는 요청에 대한 처리가 완료될 때까지 프로세스가 멈추는 블록킹(blocking)이 발생하므로, 효율성이 떨어질 수 있습니다.
비동기 방식 (Asynchronous)
이번에는 비동기 방식을 설명해보겠습니다. 눈치가 빠르신 분은 아마 동기 방식 설명을 보고 나서 감이 오셨을 겁니다.
비동기 방식 (Asynchronous)은 요청과 그 결과가 동시에 이루어지지 않는 통신 방식을 말합니다. 코드가 실행되면, 해당 코드의 작업 완료 여부와 상관없이 즉시 다음 코드로 넘어갑니다. 이는 마치 편지를 보내고 답장을 기다리는 과정에서, 편지에 대한 답장이 오기를 기다리면서도 다른 일을 계속 진행하는 것과 유사합니다.
이번에도 카페에서 커피를 주문하는 상황을 상상해보겠습니다. 이번에는 주문을 하고 나서 바로 커피를 받을 때까지 기다리지 않아요. 대신 주문 번호를 받고, 커피가 완성되면 주문 번호를 불러서 커피를 받는 상황입니다. 이렇게 커피를 기다리는 동안, 다른 일을 할 수 있고, 커피가 준비되면 그때 받아가는 방식을 '비동기 방식'이라고 합니다.
프로그래밍에서도 이렇게 동기 방식과 비동기 방식이 존재합니다. 동기 방식은 요청과 그에 대한 응답이 순차적으로 이루어져야 하며, 하나의 작업이 끝나야 다음 작업을 진행할 수 있습니다. 반면, 비동기 방식은 요청을 보낸 후 응답을 기다리는 동안에도 다른 작업을 진행할 수 있어 효율적으로 시간을 활용할 수 있습니다.
그러면 여기에서 "어? 그러면 효율적으로 다른 작업도 할 수 있는 비동기 방식이 훨씬 좋은 방식이네?" 라고 생각이 드실 수도 있는데
아닙니다!!
물론 효율적으로 시간을 활용하고 작업을 할 수 있다는 건 장점이지만 언제나 비동기 방식이 좋은 것은 아닙니다.
동기 방식과 비동기 방식은 상황에 따라서 장점이 되는 경우도 있고 단점이 되는 경우도 있는데 이중 어떤 것을 선택할지는 문제의 상황과 요구 사항에 따라 달라집니다.
"그럼 그 상황이 대체 뭐냐?" 라고 생각이 드실텐데, 지금 설명해드리겠습니다!
동기 / 비동기 방식의 적용 상황
동기 방식은 순차적으로 코드가 실행되기 때문에 코드의 흐름을 이해하기 쉽고, 디버깅이 비교적 간단합니다. 하지만, 한 작업이 완료될 때까지 다른 작업을 진행하지 못하는 블록킹(blocking) 현상이 발생하므로, 효율성이 떨어질 수 있습니다. 따라서, 순차적인 처리가 필요하거나, 앞선 작업의 결과가 후속 작업에 영향을 주는 경우에는 동기 방식이 적합합니다.
비동기 방식은 요청에 대한 처리가 완료되지 않아도 다음 작업을 진행할 수 있어, 시스템의 자원을 효율적으로 활용할 수 있습니다. 이는 특히 네트워크 요청, 파일 I/O, 대용량 데이터 처리 등의 작업에서 유용합니다. 하지만, 코드의 실행 순서가 보장되지 않아 로직의 복잡성이 증가하고, 디버깅이 어려울 수 있습니다. 따라서, 비동기 작업의 결과가 다른 작업에 영향을 주지 않는 경우, 또는 여러 개의 독립적인 작업을 병렬로 처리해야 하는 경우에는 비동기 방식이 적합합니다.
동기 / 비동기의 제어 방식
자, 이렇게 개념에 대해서 살펴봤고 어떤 경우에 사용되는지도 알아봤으니, 제어 방식도 간단히 살펴보고 가겠습니다.
먼저 동기 제어 방식부터 살펴보겠습니다.
동기 제어 방식은 데이터의 전송을 시작하기 전에 송신측과 수신측 사이에 시간을 맞추는 과정이 필요합니다. 이를 동기화라고 하며, 이 과정을 통해 송신측과 수신측은 각각의 클럭을 일치시키게 됩니다.
동기 제어 방식에서는 이러한 클럭의 일치를 통해 데이터의 전송을 제어합니다. 이 방식은 연속적인 대량의 데이터를 빠르게 전송할 수 있어 효율적이지만, 동기화 과정이 필요하다는 단점이 있습니다.
다음은 비동기 제어 방식을 살펴보겠습니다.
비동기 제어 방식에서는 송신측과 수신측의 클럭을 동기화할 필요가 없습니다. 대신, 각 데이터 단위(보통은 바이트 단위)의 시작과 끝에 특별한 신호를 추가하여 데이터의 시작과 끝을 표시합니다. 이를 통해 수신측은 데이터의 시작과 끝을 알 수 있습니다. 이 방식은 동기화 과정이 필요 없어 간단하고 유연하지만, 데이터 단위마다 제어 신호를 전송해야 하므로 동기 제어 방식에 비해 전송 효율이 떨어질 수 있습니다.
결국, 동기 제어 방식과 비동기 제어 방식은 각각의 장단점이 있으므로, 전송할 데이터의 양, 전송 속도, 시스템의 복잡도 등의 요인을 고려하여 적절한 제어 방식을 선택해야 합니다.
자! 이렇게 프로그래밍에서 사용되는 동기/비동기 방식에 대해서 알아봤는데 글을 보시다가 이해가 안 가시는 부분이나 잘못된 부분이 있다면 댓글 부탁드립니다! 혹시 궁금하신 주제가 있다면 댓글 달아주시면 포스팅 해보도록 하겠습니다.
감사합니다!
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'IT 지식' 카테고리의 다른 글
[IT지식] CI/CD란 무엇일까? (4) | 2024.07.18 |
---|