자바

동기 처리와 비동기 처리

Blue_bull 2025. 2. 7. 01:23

초급 개발자를 위한 동기 처리 vs 비동기 처리 개념 이해하기

1. 동기 처리(Synchronous Processing)

  • 개념: 하나의 작업이 끝나야 다음 작업이 실행됨.

  • 예시: 음식 주문 후, 요리가 다 끝날 때까지 기다린 후 음식을 받음.

  • 코드 예제 (Java)

    public class SyncExample {
        public static void main(String[] args) {
            System.out.println("요리 시작");  // 1
            cook();  // 2 (요리하는 동안 멈춰 있음)
            System.out.println("요리 완료, 서빙 시작"); // 3
        }
    
        public static void cook() {
            try {
                Thread.sleep(3000); // 3초 동안 요리 (대기)
                System.out.println("요리가 끝남");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
  • 실행 흐름:

    요리 시작
    (3초 대기)
    요리가 끝남
    요리 완료, 서빙 시작
  • 특징:

    • 코드가 위에서 아래로 순차적으로 실행됨.
    • 하나의 작업이 끝나야 다음 작업이 실행됨.
    • 프로그램이 멈춘 것처럼 보일 수 있음.

2. 비동기 처리(Asynchronous Processing)

  • 개념: 하나의 작업을 실행하는 동안 다른 작업을 동시에 진행 가능.

  • 예시: 음식 주문 후, 다른 손님을 받거나 서빙을 하면서 요리가 완료되길 기다림.

  • 코드 예제 (Java - CompletableFuture)

    import java.util.concurrent.CompletableFuture;
    
    public class AsyncExample {
        public static void main(String[] args) {
            System.out.println("요리 시작"); // 1
    
            CompletableFuture.runAsync(() -> cook()); // 2 (비동기 실행)
    
            System.out.println("서빙 준비 중"); // 3 (요리가 끝나길 기다리지 않음)
        }
    
        public static void cook() {
            try {
                Thread.sleep(3000); // 3초 동안 요리
                System.out.println("요리가 끝남");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
  • 실행 흐름 (결과 예측)

    요리 시작
    서빙 준비 중
    (3초 후)
    요리가 끝남
  • 특징:

    • 요리가 끝나길 기다리지 않고 바로 "서빙 준비 중"이 출력됨.
    • 동시에 여러 작업을 수행 가능 → 효율적.
    • 하지만 실행 순서를 보장하지 않기 때문에 결과 순서가 다를 수 있음.

비동기 처리가 중요한 이유

  1. 속도 향상 → 동기 처리로 하면 하나씩 기다려야 하지만, 비동기 처리하면 여러 개를 동시에 진행할 수 있음.
  2. 응답성 증가 → 웹 서버, 데이터 처리 등에서 중요한 개념 (예: 서버가 여러 요청을 동시에 처리 가능).
  3. 리소스 활용 최적화 → CPU가 유휴 상태로 기다리는 것을 방지.

언제 동기/비동기를 사용할까?

상황 동기 처리 비동기 처리
간단한 작업 ✅ 적합 ❌ 불필요
사용자 입력 대기 ✅ 적합 ❌ 필요 없음
서버 요청 (API 호출) ❌ 느림 ✅ 적합
파일/데이터베이스 처리 ❌ 지연됨 ✅ 비동기로 처리

요약

  • 동기 처리: 한 작업이 끝나야 다음 작업 진행 → 이해하기 쉬우나 느릴 수 있음.
  • 비동기 처리: 작업을 병렬로 실행 → 성능 향상, 효율적이지만 복잡할 수 있음.
  • Java에서 비동기 처리: Thread, CompletableFuture, ExecutorService 등을 활용.

비동기 처리를 연습하려면?

  1. Thread.sleep()을 활용하여 동기/비동기 실행 결과 비교.
  2. CompletableFuture를 사용하여 비동기 실행 흐름을 이해하기.
  3. 실제 API 요청(HttpClient)을 동기/비동기로 비교해보기.