Git의 축복이 끊이질 않던 요 며칠이 지나고 드디어! 새로운 주제로 돌아와 보았다.
CS의 9번째 주제는 동기 및 비동기 처리에 관해 다뤄보려고 한다.
그럼 동기랑 비동기 알아보러 가~볼~까~?
동기 & 비동기
개발을 진행하다 보면 동기와 비동기라는 단어를 자주 접할 수 있다.
근데 이 둘이 정확히 무엇인지는 모르는 경우가 많을 것이다... (경험담 아닙니다.)
그러니 동기와 비동기의 개념부터 차근차근 알아가 보자!
동기(synchronous)란?
요청과 그 결과가 순차적으로 이루어지는 통신 방식
동기 방식의 코드가 실행되면, 해당 코드의 작업이 완료될 때까지 다음 코드로 넘어가지 않는다.
즉, 동기 방식은 요청을 보낸 후 응답을 받아야지만 다음 동작이 이루어지는 방식이라고 할 수 있다.
동기 방식을 사용할 경우, 실제로 cpu가 느려지지는 않지만, 시스템의 전체적인 효율은 저하될 수 있다.
동기 방식을 이해하기 쉽게 카페에서 커피를 주문하는 상황을 예로 들어보자.
한 사람이 커피를 주문한 경우, 점원은 해당 주문을 처리하기 전까지 다른 주문을 받거나 다른 일을 처리할 수 없는 것이다.
이렇듯 요청과 그 결과가 동시에 이루어지고, 요청한 일이 끝나야 다음 일을 진행할 수 있는 방식을 '동기 방식'이라고 부른다.
동기 방식은 구현이 상대적으로 간단하고 직관적이지만, 요청에 대한 처리가 완료될 때까지 프로세스가 멈추는 '블록킹' 현상이 발생하여 효율성이 떨어질 수 있다.
비동기(asynchronous)란?
요청과 그 결과가 동시에 이루어지지 않는 통신 방식
비동기 방식의 코드가 실행되면, 해당 코드의 작업 완료 여부와 상관없이 즉시 다음 코드로 넘어간다.
즉, 요청을 보낸 후 응답의 수락 여부와는 상관없이 다음 태스크가 동작하는 방식이라고 할 수 있다.
비동기 방식 역시 이해하기 쉽게 카페에서 커피를 주문하는 상황을 예로 들어보자.
한 사람이 커피를 주문한다면 커피가 나올 때까지 기다리는 게 아니라 주문 번호를 받고, 커피가 완성되어 주문 번호가 불리면 커피를 받아가는 상황이다. 점원은 앞의 손님이 계속해서 기다리지 않으니까 다른 사람의 주문을 받을 수 있는 상황이 되는 것이다.
이렇듯 요청을 보낸 후 응답을 기다리는 동안에도 다른 작업을 진행할 수 있어 효율적으로 시간을 활용할 수 있는 방식을 '비동기 방식'이라고 부른다.
비동기 방식은 응답을 기다리는 동안에도 작업이 가능하여 효율적인 자원 사용이 가능하지만, 콜백 함수의 늪에 빠져 흐름이 복잡해질 수 있다.
동기 vs 비동기 차이점 비교
위에서 개념을 다루긴 했지만 서로 혼동되는 내용이 많을 것 같아 표로도 정리해 보았다😎
구분 | 동기 | 비동기 |
처리 방식 | 작업이 순차적으로 처리됨 | 요청 후 결과와 무관하게 다음 작업 진행 가능 |
응답 대기 | 응답이 올 때까지 기다림 (블로킹) | 응답을 기다리지 않음 (논블로킹) |
흐름 구조 | 직관적이고 단순함 | 복잡할 수 있음 (콜백 함수의 늪) |
멀티태스킹 | 불가능하거나 비효율적 | 가능하며 효율적 |
장점 | 구현이 쉽고 직관적 디버깅 용이 |
자원 활용 효율성 증가 UI 멈춤 방지 |
단점 | 처리 시간 동안 대기 필요 자원 낭비 가능 |
코드 구조가 복잡해질 수 있음 예외 처리의 어려움 |
어떤 방식을 어떤 상황에 써야 할지 감은 잡히는데...
... 뭘 언제 써야 한다는 거지...?
그럼 동기랑 비동기는 언제 사용할까?
동기 방식을 사용하는 경우
결과가 반드시 순서대로 필요한 경우
Ex. 금융 애플리케이션에서 거래 순서대로 처리해야 하는 로직
A가 송금하고 B가 그 금액을 인출해야 한다면, 송금이 완료된 후 인출이 진행돼야 한다.
순서가 중요한 상황에서는 작업 완료 후 다음으로 넘어가는 동기 방식이 더 안전하다.
간단한 작업 흐름일 경우
Ex. 로컬 파일 읽기나 간단한 수치 연산
작업 자체가 금방 끝나는 경우, 비동기 방식보다 동기가 더 직관적이고 효율적일 수 있다.
오류 처리가 중요한 작업일 경우
Ex. 로그인 로직 - '로그인 API 호출 → 성공 시 토큰 저장 → 이후 화면으로 이동'
중간 과정에서 오류가 나면 즉시 중단하고 명확하게 처리해야 하므로 동기 방식이 적합하다.
비동기 방식을 사용하는 경우
네트워크 요청이 필요한 경우
Ex. 앱에서 날씨 정보 가져오기, 게시글 리스트 불러오기
네트워크 요청을 비동기로 처리하지 않으면 데이터를 가져오는 동안 UI 자체가 멈춰버릴 수 있기 때문에 비동기 방식이 적합하다.
사용자 입력 이벤트를 처리하는 경우
Ex. 사용자 입력 이벤트 로직 - '버튼 클릭 → 애니메이션 실행 + 서버에 데이터 전송'
애니메이션은 바로 실행하고, 서버 응답은 나중에 받아도 되므로 둘을 분리해서 비동기 처리하면 부드러운 UX를 제공할 수 있기 때문에 비동기 방식이 더 적합하다.
장시간 걸리는 작업의 경우
Ex. 대용량 이미지 다운로드, 머신러닝 모델 로딩
대용량의 작업을 동기로 처리하면 전체 앱이 멈출 수 있다는 치명적인 에러가 발생할 수 있기 때문에, 비동기 방식을 사용하여 백그라운드에서 처리해야 안정적으로 작업을 수행할 수 있다.
동기와 비동기 모두 각 방식에 대한 장단점이 확실하게 있는 개념이라 사용하는 환경도 확실하게 구분되는 것을 볼 수 있다.
동기 및 비동식 방식을 잘못 선정할 경우, 작업의 효율성과 안정성에 큰 영향을 미칠 수 있으니, 동기와 비동기 개념을 확실하게 이해하고 필요한 작업에 알맞은 방식을 선정하는 것이 매-우 중요하다.
마무리...
늘 "동기가 뭐야?", "비동기가 뭐야?"라는 질문을 받으면 "그거 뭐... 직렬... 병렬... 처리...? 뭐 그런 거...?"라고 대답해 온 나...
사실 틀린 말은 아니긴 하지만, 어디서 주워들은 지식으로 직렬-병렬 처리라고만 대답했었다.
사실 아직 직렬-병렬 처리 말고 한 줄로 설명할만한 문장이 떠오르지 않아서 같은 질문을 받으면 같은 대답을 할 것 같긴 하다.
하. 지. 만 이전에는 자신감 없던 대답이었다면, 이제는 자신감 있게 대답할 수 있지 않을까?
확실히 헷갈리는 개념을 직접 정리해 보면 좀 더 쉽게 와닿는 것 같긴 하다...
그럼 오늘도 이해하려고 열심히 노력한 각자의 뇌에게 칭찬의 박수를 쳐주며 오늘의 공부를 마쳐보자👏👏
'CS' 카테고리의 다른 글
11. REST API & RESTful API (2) | 2025.04.14 |
---|---|
10. 서버와 클라이언트 (1) | 2025.04.13 |
8. Git Flow (0) | 2025.04.11 |
7. Git & Github (0) | 2025.04.07 |
6. JSON, XML, YAML (0) | 2025.04.07 |
댓글