ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Asynchronous 비동기
    자바 및 spring boot 2024. 6. 2. 16:07

    비동기 프로그래밍(Asynchronous Programming)은 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 수행할 수 있게 하는 프로그래밍 방식입니다. 이는 동시성 문제를 해결하고, 시스템의 응답성을 높이며, I/O 작업을 효율적으로 처리하는 데 유용합니다. 비동기 프로그래밍의 주요 개념과 이를 구현하는 방법에 대해 자세히 설명하겠습니다.

    ### 주요 개념

    1. **비동기 작업**: 비동기 작업은 시작된 후 즉시 반환되어 호출 스레드가 다른 작업을 계속할 수 있게 합니다. 작업이 완료되면 콜백 함수, 이벤트, 또는 미래(future) 객체 등을 통해 결과를 처리합니다.
    2. **콜백(callback)**: 작업이 완료된 후 실행될 함수를 말합니다. 비동기 작업이 완료되면 시스템은 이 함수를 호출하여 결과를 처리합니다.
    3. **프라미스(Promise)와 퓨처(Future)**: 비동기 작업의 결과를 나타내는 객체입니다. 작업이 완료되면 결과 값을 제공하거나, 작업이 실패하면 오류를 반환합니다.

    ### 비동기 프로그래밍의 장점

    - **응답성 향상**: 긴 작업(I/O, 네트워크 요청 등)을 수행할 때 시스템이 블로킹되지 않아서, 사용자 인터페이스(UI)와 같은 응답성을 요구하는 부분에서 유용합니다.
    - **자원 활용 극대화**: CPU, 메모리 등의 자원을 더 효율적으로 사용하게 해줍니다. 여러 작업이 동시에 진행될 수 있어서 시스템의 처리량이 증가합니다.
    - **동시성 처리**: 여러 작업이 동시에 진행되므로 병렬 처리가 가능해집니다.

    ### 비동기 프로그래밍 구현 방법

    1. **콜백 함수**
       콜백 함수를 사용하여 비동기 작업이 완료되면 특정 함수를 호출하게 합니다. 이는 전통적인 비동기 프로그래밍 방식입니다.

       ```java
       // JavaScript 예시
       function fetchData(callback) {
           setTimeout(() => {
               const data = "Hello, World!";
               callback(data);
           }, 1000);
       }

       fetchData((data) => {
           console.log(data); // "Hello, World!" 출력
       });
       ```

    2. **프라미스(Promise)**
       프라미스는 비동기 작업의 완료 또는 실패를 처리하는 객체입니다. 콜백보다 가독성과 체인 가능성이 뛰어납니다.

       ```java
       // JavaScript 예시
       function fetchData() {
           return new Promise((resolve, reject) => {
               setTimeout(() => {
                   const data = "Hello, World!";
                   resolve(data);
               }, 1000);
           });
       }

       fetchData().then((data) => {
           console.log(data); // "Hello, World!" 출력
       });
       ```

    3. **async/await**
       `async/await`는 프라미스를 더 쉽게 사용할 수 있게 해주는 문법입니다. 비동기 코드를 마치 동기 코드처럼 작성할 수 있어서 가독성이 좋습니다.

       ```java
       // JavaScript 예시
       async function fetchData() {
           const data = await new Promise((resolve, reject) => {
               setTimeout(() => {
                   resolve("Hello, World!");
               }, 1000);
           });
           console.log(data); // "Hello, World!" 출력
       }

       fetchData();
       ```

    4. **Future와 CompletableFuture (Java)**
       Java에서는 `Future`와 `CompletableFuture`를 사용하여 비동기 프로그래밍을 구현할 수 있습니다.

       ```java
       // Java 예시
       import java.util.concurrent.CompletableFuture;

       public class AsyncExample {
           public static void main(String[] args) {
               CompletableFuture.supplyAsync(() -> {
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   return "Hello, World!";
               }).thenAccept(data -> {
                   System.out.println(data); // "Hello, World!" 출력
               });

               System.out.println("비동기 작업 중...");
           }
       }
       ```

    5. **Reactive Programming**
       Reactive Programming은 비동기 데이터 스트림을 사용하여 데이터 흐름과 전파 변화를 처리하는 프로그래밍 패러다임입니다. 예를 들어, Java의 `Project Reactor`나 `RxJava`를 사용할 수 있습니다.

       ```java
       // RxJava 예시
       import io.reactivex.Observable;

       public class ReactiveExample {
           public static void main(String[] args) {
               Observable<String> observable = Observable.create(emitter -> {
                   emitter.onNext("Hello, World!");
                   emitter.onComplete();
               });

               observable.subscribe(System.out::println);
           }
       }
       ```

    ### 결론

    비동기 프로그래밍은 동시성과 병렬 처리를 효율적으로 구현할 수 있는 강력한 기법입니다. 다양한 언어와 프레임워크에서 이를 지원하는 여러 방법이 있으며, 각 방법은 특정 상황에 맞게 사용될 수 있습니다. 비동기 프로그래밍을 통해 시스템의 성능과 응답성을 크게 향상시킬 수 있습니다.

Designed by Tistory.