Topic (오늘의 주제)
동기(Synchronous)와 비동기(Asynchronous)의 차이와 활용 작업의 실행 순서와 흐름 제어를 결정하는 핵심 원리로, 효율적인 시스템 설계와 사용자 경험(UX) 향상을 위해 어떻게 코드를 구조화해야 하는지 학습합니다.
Why (왜 사용하는가? 왜 중요한가?)
- 실무: 네트워크 API 호출, DB 쿼리, 파일 I/O 등 응답이 지연될 수 있는 작업에서 동기식을 사용하면 화면이 멈추거나(UI 프리징) 시스템이 응답을 멈추는 병목 현상이 발생합니다. 이를 막기 위해 비동기 처리가 필수적입니다.
- 구조적 의미: CPU나 스레드가 작업 완료를 기다리며 쉬는 시간(Idle)을 없애고, 그 시간에 다른 작업을 처리하게 함으로써 한정된 시스템 자원을 극대화하고 처리량(Throughput)을 높입니다.
- 면접 의도: 지원자가 시스템의 병목 구간(I/O Bound)을 인지하고 최적화할 수 있는지, 멀티 스레드나 이벤트 루프 등 언어별 비동기 처리 메커니즘을 제대로 이해하고 코드를 작성해 보았는지를 확인하려 합니다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | 동기(Sync): 요청과 그 결과가 순차적으로 일어나는 방식 (이전 작업이 끝나야 다음 작업 시작). 비동기(Async): 요청을 보낸 후 결과를 기다리지 않고 곧바로 다음 작업을 진행하는 방식. |
| 동작 방식 | 동기: 스레드가 Task A를 실행 후, 결과가 반환될 때까지 대기(Block)하다가 Task B를 실행합니다. 비동기: Task A를 백그라운드(또는 다른 스레드)에 위임하고, 결과를 기다리지 않고 즉시 Task B를 실행합니다. Task A의 결과는 추후 콜백(Callback)이나 이벤트 형태로 전달받습니다. |
| 장점/단점 | 동기: 장점: 코드가 위에서 아래로 실행되어 설계가 직관적이고 흐름 파악과 디버깅이 쉽다. 단점: 응답이 올 때까지 아무것도 못하고 자원을 낭비한다. 비동기: 장점: 대기 시간 없이 다른 작업을 수행해 자원 효율과 응답성이 극도로 높다. 단점: 흐름 추적이 어렵고(콜백 지옥), 동기화 문제나 예외 처리가 까다롭다. |
| 필요 조건 | 비동기 결과를 처리하기 위한 반환 객체(Promise, Future)나 콜백 함수(Callback), 그리고 이를 스케줄링할 백그라운드 스레드나 이벤트 루프(Event Loop) 환경이 필요합니다. |
| 예시/비교 | Sync/Async vs Blocking/Non-blocking: 이 둘은 자주 혼용되지만 다릅니다. 동기/비동기는 "작업 완료 여부를 누가 신경 쓰는가(순서의 문제)"이고, 블로킹/논블로킹은 "함수를 호출했을 때 제어권(실행 권한)을 바로 돌려주는가(대기의 문제)"입니다. |
Interview Answer Version (면접 답변식 요약)
"동기와 비동기의 가장 큰 차이는 작업의 순차적 실행 여부와 대기 시간에 있습니다. 동기 방식은 한 작업이 끝나야만 다음 작업을 수행하므로 설계가 직관적이지만, I/O 작업 시 스레드가 대기 상태에 빠져 자원 효율이 떨어집니다. 반면, 비동기 방식은 작업 처리를 백그라운드나 다른 스레드에 맡기고 제어권을 즉시 돌려받아 다른 작업을 수행합니다. 실무에서는 외부 API 호출이나 DB 조회와 같은 병목 구간에 비동기나 논블로킹 방식을 적용하여 시스템의 응답 속도와 전체 처리량(Throughput)을 최적화하는 데 사용합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
- 실무 활용 예: * 프론트엔드: 서버에 사용자 데이터를 요청(fetch API)하고, 데이터를 받아오는 동안 로딩 스피너 애니메이션을 보여줄 때.
- 백엔드: 사용자 회원가입 시, 핵심 로직(DB 저장) 후 시간이 걸리는 '환영 이메일 발송' 작업을 비동기(예: Spring @Async, 메시지 큐)로 처리하여 응답 속도를 높일 때.
- 설정 시 반드시 고려해야 할/주의할 파라미터:
- 동시에 여러 비동기 실행하기: JavaScript에서 async/await를 쓸 때, 서로 의존성 없는 두 I/O 작업을 await로 각각 대기시키면 안 됩니다. Promise.all()을 사용하여 두 작업을 동시에 병렬로 던져 시간을 절약해야 합니다.
- 스레드 풀(Thread Pool) 관리: Java 환경 등에서 비동기 처리를 위해 무분별하게 스레드를 생성하면 Context Switching 비용이 더 커집니다. 반드시 스레드 풀 크기를 적절히 제한해야 합니다.
- "이걸 모르고 사용하면 생기는 문제" (예외 처리의 함정):
- 비동기 코드 블록 내부에서 발생한 예외(Exception)는 메인 흐름의 일반적인 try-catch문으로 잡히지 않습니다. 비동기로 던져진 작업은 호출한 컨텍스트와 이미 분리되었기 때문입니다. 콜백 함수 내에서 에러 처리를 따로 하거나, .catch()를 명시적으로 작성하지 않으면 'Unhandled Promise Rejection' 등으로 인해 시스템이 조용히 실패하거나 크래시될 수 있습니다.
예상 꼬리질문 정리
- 동기/비동기(Sync/Async)와 블로킹/논블로킹(Blocking/Non-blocking)을 각각 설명하고, 이 두 개념이 조합된 4가지 모델(예: Sync-Blocking, Async-NonBlocking 등)에 대해 설명해 주시겠어요?
- (의도: 제어권 반환이라는 개념과 완료 통지 방식의 차이를 정확히 구분할 수 있는지 확인)
- JavaScript는 싱글 스레드 언어라고 알고 있는데, 어떻게 네트워크 요청 같은 비동기 처리를 동시에 수행할 수 있나요?
- (의도: Call Stack, Web API, Task Queue, Event Loop로 이어지는 런타임 환경 구조 이해도 확인)
- Java 환경 등에서 비동기 프로그래밍을 할 때 공유 자원에 접근해야 한다면, 어떤 동시성(Concurrency) 이슈가 발생할 수 있고 어떻게 해결해야 하나요?
- (의도: 멀티 스레드 기반의 비동기 처리 시 Race Condition 제어 및 ThreadLocal 컨텍스트 유실 문제 해결 능력 확인)
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: XSS와 CSRF (0) | 2026.02.25 |
|---|---|
| Daily Dev Q&A: HTTP 메서드 (0) | 2026.02.25 |
| Daily Dev Q&A: Redis의 특징 (0) | 2026.02.24 |
| Daily Dev Q&A: 자바 리플렉션 (0) | 2026.02.23 |
| Daily Dev Q&A: Spring AOP (0) | 2026.02.23 |