본문 바로가기

백엔드 기술면접

백엔드 개발자 면접 질문 #1 - 동기와 비동기?

답변: 동기는 하나의 작업이 순차적으로 진행되 끝날때까지 다른 작업이 대기하는 방식이고 비동기는 작업 완료 여부와 상관없이 다른 작업을 처리하는 방식입니다.

 

1. 동기(Synchronous)와 비동기(Asynchronous)란 무엇인가요?

동기(Synchronous):

  • 정의: 작업이 순차적으로 실행되며, 이전 작업이 완료될 때까지 다음 작업이 대기하는 방식입니다.
  • 특징:
    • 작업 순서가 명확하고 직관적입니다.
    • 느린 작업(예: 네트워크 요청, 파일 I/O)으로 인해 전체 프로세스가 멈출 수 있습니다.
  • 비유:
    "동기는 카페에서 커피를 주문하고 그 자리에 서서 커피가 나올 때까지 기다리는 것과 같습니다."

비동기(Asynchronous):

  • 정의: 작업이 요청된 후 바로 다음 작업으로 넘어가며, 작업 완료 여부와 상관없이 다른 작업을 처리하는 방식입니다.
  • 특징:
    • 느린 작업 중에도 다른 작업을 병렬로 처리합니다.
    • 작업 완료 후 콜백(callback) 또는 이벤트를 통해 결과를 처리합니다.
  • 비유:
    "비동기는 카페에서 커피를 주문하고, 커피가 준비되면 호출받아 가는 것과 같습니다."

2. 동기와 비동기의 차이는 무엇인가요?

구분동기(Synchronous)비동기(Asynchronous)
처리 방식 작업 완료 전까지 대기 대기하지 않고 다음 작업 진행
속도 느린 작업으로 전체 지연 가능 작업 중 병렬 처리 가능
구현 복잡도 구현이 단순 상대적으로 복잡(콜백, 비동기 제어)
사용 사례 CPU 중심 작업, 단순한 작업 처리 I/O 중심 작업, 네트워크 통신

3. 어떤 상황에서 동기/비동기를 사용하나요?

동기(Synchronous):

  • 작업 순서가 중요하고, 결과가 즉시 필요할 때.
  • 예:
    • 금융 애플리케이션에서 잔액 확인 후 출금 처리.
    • CLI(Command-Line Interface) 도구에서 단계별 작업 처리.

비동기(Asynchronous):

  • 느린 작업(I/O, 네트워크 등)이 다른 작업을 방해하지 않아야 할 때.
  • 예:
    • 웹 애플리케이션에서 사용자 요청 처리(API 호출).
    • GUI 애플리케이션에서 데이터 로딩 중 UI 반응성 유지.

4. 동기와 비동기의 장단점은 무엇인가요?

동기의 장단점:

  • 장점:
    • 직관적이고 디버깅이 쉽습니다.
    • 코드가 단순합니다.
  • 단점:
    • 느린 작업이 전체 성능을 저하시킬 수 있습니다.

비동기의 장단점:

  • 장점:
    • 효율적인 자원 사용.
    • 사용자 경험(UX)이 개선됩니다.
    • 멀티태스킹이 가능해 작업 병렬 처리에 유리합니다.
  • 단점:
    • 구현 및 디버깅이 복잡합니다.
    • 비동기 흐름 제어가 어렵습니다(예: 콜백 헬).

5. Java에서 동기와 비동기를 구현하는 방법은?

동기 방식 구현 예시:

public String fetchData() {
    String data = database.query(); // 데이터베이스 응답 대기
    return data; // 작업 완료 후 실행
}
 

비동기 방식 구현 예시 (CompletableFuture):

public void fetchDataAsync() {
    CompletableFuture.supplyAsync(() -> database.query())
                     .thenAccept(result -> System.out.println(result));
    System.out.println("다른 작업 수행 중...");
}​

6. 면접에서 추가적인 질문에 대비하기 위한 팁

  • 동기와 비동기를 선택할 때의 기준은?
    • 응답 속도와 작업 우선순위에 따라 결정.
    • 비동기는 주로 I/O 중심 작업에 적합하고, 동기는 연속성이나 작업 결과가 중요한 경우 적합.
  • 비동기와 멀티스레드는 같은 것인가?
    • 비동기는 멀티스레드와 관련이 있지만 반드시 멀티스레드를 사용하지 않아도 구현 가능합니다. 예를 들어, 비동기 작업은 이벤트 루프를 사용하는 단일 스레드에서도 동작합니다.

 

심화 - 비동기와 멀티스레드 

스레드 개수 하나의 스레드만 사용 여러 스레드 사용
작업 처리 방식 이벤트 루프와 비동기 작업 큐를 사용하여 논블로킹 방식으로 작업 처리 각 스레드가 독립적으로 작업을 실행
컨텍스트 스위칭 없음 (단일 스레드로 모든 작업 처리) 있음 (스레드 간 전환 발생)
I/O 바운드 작업 효율적 (OS가 작업 완료를 알리면 이벤트 루프가 처리) 효율적이지만 스레드 리소스 관리 필요
CPU 바운드 작업 비효율적 (단일 스레드만 사용하므로 병렬 처리 불가) 효율적 (스레드 간 병렬 처리 가능)
사용 사례 Node.js, Python asyncio (I/O 중심 시스템) Java Thread, ExecutorService, Spring Async (CPU와 병렬 처리가 필요한 경우)
리소스 소모 스레드가 하나이므로 메모리와 CPU 사용량이 적음 여러 스레드 생성 및 관리로 메모리와 CPU 소모 증가
병렬 처리 없음 (논리적으로 비동기 작업이 처리되지만 실제 병렬 처리는 아님) 있음 (여러 스레드가 동시에 실행)

 

 

심화2 - 하드웨어와 소프드웨어에서의 스레드

 

**"4코어 16스레드"**라는 표현은 CPU의 하드웨어 수준의 스레드 병렬 처리 능력을 나타냅니다. 이는 CPU가 동시에 처리할 수 있는 하드웨어 스레드의 수를 의미하며, 소프트웨어에서 생성할 수 있는 소프트웨어 스레드의 수와는 다릅니다.

4코어 16스레드의 의미

  • 4코어: 물리적인 CPU 코어가 4개 있다는 뜻입니다.
  • 16스레드: 각 코어가 하이퍼스레딩 (Hyper-Threading) 또는 SMT (Simultaneous Multi-Threading) 기술을 지원하여 1개의 물리적 코어가 2개 이상의 하드웨어 스레드를 처리할 수 있다는 뜻입니다.
    • 즉, 4코어 × 4스레드 = 총 16개의 하드웨어 스레드가 있습니다.

하드웨어 스레드와 소프트웨어 스레드의 차이

하드웨어 스레드

  • CPU가 동시에 실행할 수 있는 병렬 작업 단위.
  • 물리적 CPU 코어와 연관되며, 하이퍼스레딩 기술로 인해 물리적 코어보다 많은 스레드를 처리할 수 있음.
  • CPU의 설계에 따라 고정된 숫자(예: 4코어 16스레드).

소프트웨어 스레드

  • 운영 체제(OS)와 소프트웨어에서 생성한 논리적인 실행 단위.
  • 운영 체제의 스케줄러가 하드웨어 스레드를 사용해 소프트웨어 스레드를 실행함.
  • 소프트웨어 스레드의 수는 CPU의 하드웨어 스레드 수와 무관하게 더 많이 생성할 수 있음. 하지만, 하드웨어 스레드보다 많은 소프트웨어 스레드가 생성되면 컨텍스트 스위칭으로 인해 성능이 저하될 수 있음.

하드웨어 스레드 수와 소프트웨어 스레드 수의 관계

  • **하드웨어 스레드(16개)**는 소프트웨어 스레드의 병렬 처리 능력을 제한합니다.
    • CPU가 동시에 실행할 수 있는 스레드는 최대 16개입니다.
  • 소프트웨어 스레드는 이를 넘어설 수 있으며, 100개, 1000개 이상의 스레드를 생성할 수도 있습니다.
    • 하지만 하드웨어 스레드 수(16개)를 초과하는 소프트웨어 스레드는 큐에 대기하며, CPU는 이를 순차적으로 처리합니다.