동기 vs 비동기 in Flutter

힐링코더·2023년 8월 30일
0

Flutter for a code monkey

목록 보기
4/14

1) 프로그래밍, 특히 플러터에서의 동기란?

프로그래밍에서의 "동기"는 특히 비동기 프로그래밍과 대조되는 개념으로 사용됩니다. 특히 플러터에서 "동기"는 코드의 실행 흐름이 순차적으로 진행되는 상태를 의미합니다. 동기 코드는 한 작업이 완료될 때까지 다음 작업이 실행되지 않고 기다리는 방식으로 동작합니다.

예를 들어, 네트워크 요청을 보내는 동기 코드에서는 요청을 보내고 서버에서 응답이 올 때까지 코드가 블로킹되며 기다립니다. 이때 다음 코드는 해당 요청과 응답이 처리된 후에 실행됩니다. 따라서 동기 코드를 사용할 때는 작업이 완료될 때까지 기다리는 동안 다른 작업을 수행할 수 없는 단점이 있을 수 있습니다.

한편, 플러터와 같은 UI 프레임워크에서는 사용자 인터페이스 업데이트도 중요한 부분입니다. 동기적인 UI 업데이트는 사용자 입력에 빠르게 응답하여 부드러운 사용자 경험을 제공할 수 있습니다.

하지만 동기 코드는 실행이 끝날 때까지 블로킹되므로 일부 상황에서는 앱의 성능과 응답성을 저하시킬 수 있습니다. 특히 I/O 작업과 같은 블로킹 작업을 메인 스레드에서 수행할 경우 앱이 응답하지 않을 수 있습니다. 따라서 비동기 프로그래밍이 중요한 상황에서는 Future, Stream, async/await와 같은 도구를 사용하여 비동기 코드를 작성하여 앱의 응답성과 성능을 향상시키는 것이 일반적입니다.

2)프로그래밍, 특히 플러터에서의 비동기란?

프로그래밍에서의 비동기(asynchronous)란, 코드의 실행 흐름을 블로킹하지 않고 작업을 수행하는 개념을 의미합니다. 특히 플러터와 같은 모던한 프로그래밍 환경에서 비동기 프로그래밍은 중요한 개념 중 하나입니다.

비동기 코드를 작성하는 주요 목적은 작업의 시간이 오래 걸리거나 외부 리소스(네트워크 요청, 파일 입출력 등)를 사용해야 할 때, 해당 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행하면서 앱의 응답성을 유지하고 성능을 향상시키는 것입니다.

플러터에서 비동기 작업은 다양한 방식으로 수행될 수 있습니다. 가장 일반적인 방법은 async와 await 키워드를 사용하여 비동기 함수를 작성하는 것입니다. 이러한 비동기 함수는 Future나 Stream을 반환하며, 이들은 비동기 작업의 결과나 이벤트를 나타냅니다.

예를 들어, 네트워크 요청을 비동기적으로 처리하는 경우, 요청을 보내고 나서 그 결과를 기다리지 않고 다른 작업을 수행할 수 있습니다. 결과가 도착하면 해당 Future나 Stream이 완료되고, 그 때 비로소 해당 결과를 처리하거나 UI를 업데이트할 수 있습니다.

비동기 코드를 사용하면 앱이 느려지거나 멈추는 상황을 방지하면서, 동시에 다양한 작업을 효율적으로 처리할 수 있습니다.

3) async await을 하면 await 뒤의 코드에서 응답을 받을 때까지 기다려야 하니까 동기 아냐?

async와 await 키워드를 사용하는 비동기 코드에서 await 뒤의 코드에서 응답을 받을 때까지 기다리는 것처럼 보일 수 있습니다. 하지만 이는 실제로 코드의 실행 흐름을 블로킹하지 않는 비동기적인 동작입니다.

await 키워드는 해당 비동기 작업이 완료될 때까지 실행을 멈추고, 다른 작업을 실행하는 동안 해당 작업의 완료를 기다리는 것처럼 보이게 만듭니다. 하지만 이 과정에서 메인 스레드나 다른 작업 스레드를 블로킹하지 않습니다. 대신, 해당 작업이 완료되기를 기다리는 동안 다른 작업을 수행하면서 앱의 응답성을 유지합니다.

즉, await는 비동기 작업이 완료될 때까지 다음 코드를 실행하지 않고 대기하지만, 이는 작업이 완료되기를 기다리는 동안 다른 작업을 수행하면서 동시에 처리되는 비동기적인 메커니즘입니다. 따라서 await를 사용한 코드는 실제로는 블로킹하지 않으면서도 비동기적으로 동작합니다.

결국, async와 await를 사용하면 비동기 코드를 동기 코드처럼 보이게 작성할 수 있지만, 실제로는 앱의 응답성을 유지하면서 비동기 작업을 효율적으로 처리할 수 있습니다.

4) async await은 다트가 가진 특성이야?

네, 맞습니다. async와 await는 다트(Dart) 프로그래밍 언어의 특성입니다. 다트는 비동기 프로그래밍을 지원하기 위해 async와 await를 도입하여 효율적이고 직관적인 비동기 코드 작성을 가능하게 했습니다.

async와 await는 다음과 같은 특징을 가지고 있습니다:

async 함수: 함수 선언 앞에 async 키워드를 붙여서 해당 함수가 비동기 함수임을 나타냅니다. 비동기 함수 내에서는 await를 사용하여 비동기 작업을 기다릴 수 있습니다.

await 키워드: await 키워드를 사용하면 비동기 작업이 완료될 때까지 해당 라인에서 코드의 실행이 멈추고, 작업이 완료되면 결과를 반환합니다.

이러한 특성을 통해 다트에서는 비동기 코드를 동기 코드와 유사한 방식으로 작성할 수 있습니다. 이는 코드의 가독성을 향상시키고 비동기 작업을 보다 직관적으로 다룰 수 있도록 도와줍니다.

그러나 주의할 점은, async와 await를 사용하여 작성한 코드가 실제로 동기적으로 동작하는 것은 아니라는 점입니다. 이 코드는 비동기적으로 실행되며, await 키워드 뒤의 작업이 완료될 때까지 다른 작업을 수행하는 효과를 가집니다.

5) async await은 자바스크립트에도 있지 않아?

네, 맞습니다. async와 await는 자바스크립트(JavaScript)와 관련이 있는 개념이며, 다트(Dart)뿐만 아니라 자바스크립트에서도 사용됩니다.

자바스크립트에서의 async와 await 역시 비동기 코드를 보다 간결하고 읽기 쉽게 작성할 수 있도록 도와주는 기능입니다. async 함수는 비동기 함수를 선언할 때 사용되며, await 키워드는 비동기 작업이 완료될 때까지 코드의 실행을 일시 중단하고 작업이 완료되면 결과를 반환하도록 합니다.

두 언어에서의 async와 await의 기본 원리는 비슷하지만, 각 언어의 문법과 사용법은 약간 다를 수 있습니다. 이는 각 언어의 특성과 생태계에 따라 조금씩 다르게 구현되기 때문입니다. 따라서 두 언어 모두에서 비동기 코드를 다룰 때 해당 언어의 문법과 규칙을 따라야 합니다.

<== ChatGPT 말을 다 믿으면 안 되는 이유.

6) 블로킹에 대해 설명해 줘

블로킹(blocking)은 프로그램이나 작업의 실행 흐름이 특정 작업이 완료될 때까지 멈추는 상태를 의미합니다. 즉, 블로킹 작업은 해당 작업이 끝날 때까지 다음 작업이나 코드가 실행되지 않는 상황을 말합니다.

블로킹은 일반적으로 다음과 같은 상황에서 발생합니다:

입출력 작업: 파일 읽기/쓰기, 네트워크 통신, 데이터베이스 쿼리 등과 같은 I/O 작업은 시스템 리소스와의 상호작용을 포함하므로 시간이 오래 걸릴 수 있습니다. 이러한 작업이 진행되는 동안 프로그램의 실행 흐름이 블로킹될 수 있습니다.

동기 코드: 동기적으로 실행되는 코드는 각 작업이 순차적으로 실행되기 때문에 이전 작업이 완료되지 않으면 다음 작업이 실행되지 않습니다. 이런 경우에도 블로킹이 발생합니다.

블로킹은 주로 비동기 프로그래밍에서 주의해야 할 부분입니다. 비동기 프로그래밍에서는 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행하여 응답성과 성능을 향상시키는 것이 목표입니다. 따라서 블로킹 작업을 최소화하고 비동기 코드를 적절하게 활용하여 앱의 응답성을 유지하는 것이 중요합니다.

비동기 프로그래밍에서는 async와 await와 같은 도구를 사용하여 비동기 작업을 처리하고, 블로킹을 피하면서 다른 작업을 수행할 수 있습니다.

7) 블로킹과 논블로킹에 대해 설명해 줘

블로킹(Blocking)과 논블로킹(Non-blocking)은 프로그래밍과 컴퓨팅에서 사용되는 두 가지 중요한 용어입니다. 이 용어들은 주로 작업의 실행과 관련된 동작을 설명할 때 사용됩니다.

블로킹 (Blocking):
블로킹은 어떤 작업이 완료될 때까지 다음 작업이나 코드의 실행이 멈추는 상태를 의미합니다. 블로킹 작업은 해당 작업이 완료될 때까지 대기하는 동안 다른 작업이나 코드가 실행되지 않습니다. 예를 들어, I/O 작업이나 동기적인 코드 실행은 블로킹 작업을 일으킬 수 있습니다. 블로킹 작업은 프로그램의 응답성을 저하시키거나 멈출 수 있으므로 주의가 필요합니다.

논블로킹 (Non-blocking):
논블로킹은 작업이 실행 중일 때도 다른 작업이나 코드를 계속 실행하는 상태를 의미합니다. 논블로킹 작업은 한 작업이 진행되는 동안 다른 작업을 계속 처리할 수 있으므로 프로그램의 응답성을 유지하면서 작업을 병렬적으로 처리할 수 있습니다. 비동기 프로그래밍에서 자주 사용되는 개념이며, 비동기 코드와 함께 사용될 때 효과적으로 응답성과 성능을 향상시킬 수 있습니다.

블로킹과 논블로킹의 개념은 주로 I/O 작업이나 멀티스레딩과 관련이 깊습니다. 블로킹과 논블로킹 모두 상황에 따라 사용될 수 있으며, 어떤 작업을 어떤 방식으로 다루느냐에 따라 프로그램의 동작과 성능이 크게 달라질 수 있습니다.

8) 플러터에서의 블로킹과 논블로킹에 대해 설명해 줘

플러터(Flutter)는 다양한 비동기 프로그래밍 패턴을 지원하며, 이를 통해 블로킹과 논블로킹 작업을 효과적으로 다룰 수 있습니다. 플러터에서의 블로킹과 논블로킹에 대해 간단히 설명하겠습니다.

블로킹 (Blocking) 작업:
플러터에서의 블로킹 작업은 주로 I/O 작업이나 긴 계산 작업을 의미합니다. 예를 들어, 네트워크 요청을 보내고 응답을 기다리거나, 파일을 읽거나 쓸 때 발생할 수 있습니다. 이러한 블로킹 작업은 기본적으로 메인 스레드에서 수행되며, 해당 작업이 완료될 때까지 앱의 실행 흐름이 멈추는 문제가 발생할 수 있습니다. 이는 앱의 응답성을 저하시키거나 멈출 수 있습니다.

논블로킹 (Non-blocking) 작업:
플러터에서의 논블로킹 작업은 비동기 작업을 의미합니다. async와 await를 사용하여 비동기 함수를 작성하거나, Future와 Stream을 사용하여 비동기 작업을 처리합니다. 비동기 작업은 블로킹 작업과 달리 앱의 실행 흐름을 멈추지 않고 다른 작업을 수행할 수 있습니다. 이로 인해 앱의 응답성을 유지하면서 여러 작업을 동시에 처리할 수 있습니다.

플러터에서는 비동기 작업을 통해 블로킹 문제를 피하고 앱의 성능을 향상시킬 수 있습니다. 예를 들어, FutureBuilder나 StreamBuilder와 같은 위젯을 사용하여 비동기 작업의 결과를 UI에 반영하거나, async와 await를 활용하여 비동기 작업을 간편하게 처리할 수 있습니다.

요약하면, 플러터에서의 블로킹은 작업이 완료될 때까지 앱의 실행 흐름이 멈추는 상황을 의미하며, 논블로킹은 비동기 작업을 통해 앱의 응답성을 유지하면서 다양한 작업을 동시에 처리하는 상황을 의미합니다.

9) StreamBuilder를 사용해 DB에서 값을 받아 온다 생각해 보자.
이건 비동기로 작동해. 그런데 async await을 사용할 이유가 있을까?

StreamBuilder를 사용하여 데이터베이스에서 값을 받아오는 경우, 이미 비동기적인 방식으로 데이터를 처리하고 있기 때문에 일반적으로 async와 await을 추가로 사용할 필요는 없습니다.

StreamBuilder는 Stream을 감시하면서 데이터의 변경을 감지하고 해당 변경이 있을 때 UI를 업데이트하는 위젯입니다. 데이터베이스에서 값을 스트림으로 받아오는 경우, 해당 스트림은 비동기 작업으로 데이터를 실시간으로 제공하므로, 데이터의 변경을 기다리지 않고도 새로운 데이터가 도착할 때마다 자동으로 UI를 갱신합니다.

async와 await는 주로 Future와 함께 사용되며, 단일 비동기 작업을 처리할 때 유용합니다. 반면에 Stream은 여러 개의 데이터를 연속적으로 제공하므로, StreamBuilder를 통해 이미 데이터의 변경을 비동기적으로 처리하고 UI를 업데이트하고 있습니다. 따라서 async와 await을 추가로 사용할 이유는 없습니다.

요약하면, StreamBuilder를 사용하여 DB에서 값을 받아오는 경우 이미 비동기 작업으로 데이터를 처리하고 있으므로 async와 await을 사용할 필요가 없습니다. StreamBuilder를 통해 비동기 작업의 결과를 UI에 반영하는 것이 효율적입니다.

10) Future도 비동기잖아. 그런데 여기서는 왜 async await을 써야 돼?

맞습니다, Future 역시 비동기 작업을 다루는데 사용되는 개념입니다. 하지만 async와 await은 Future와는 약간 다른 역할을 수행합니다. 여기서는 Future와 async await의 차이와 언제 어떤 상황에서 사용해야 하는지에 대해 설명하겠습니다.

Future:
Future는 비동기 작업의 결과를 나타내는데 사용됩니다. 비동기 작업이 실행되면 해당 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있습니다. Future는 작업이 완료되면 결과값을 제공하거나 에러를 반환하게 됩니다. 이때 Future의 .then() 메서드나 async 함수에서 await을 사용하여 작업이 완료되었을 때 특정 코드를 실행할 수 있습니다.

async와 await:
async와 await는 비동기 코드를 더 간결하고 직관적으로 작성하기 위한 도구입니다. async 함수 내에서 await 키워드를 사용하면 해당 비동기 작업이 완료될 때까지 async 함수의 실행이 일시 중단되며, 작업이 완료되면 결과를 반환합니다. 이렇게 함으로써 비동기 코드를 동기 코드처럼 작성할 수 있습니다.

따라서 Future를 사용하면 비동기 작업의 결과를 다룰 수 있습니다. 그러나 async await을 사용하면 Future의 결과를 간결하고 직관적으로 다룰 수 있으며, 여러 개의 비동기 작업을 순차적 또는 병렬적으로 다룰 때 더 효과적입니다.

결론적으로, Future를 사용하여 비동기 작업의 결과를 다룰 수 있지만, async await을 사용하면 코드를 더 읽기 쉽고 관리하기 쉽게 작성할 수 있습니다.

11) 그런데 아까는 await 뒤의 결과를 기다리지 않고 나머지 코드도 실행한다며?

죄송합니다, 제 답변이 혼동을 드린 것 같습니다. await 키워드는 해당 비동기 작업의 결과가 나올 때까지 기다린 후, 그 결과를 반환하며, 그 동안 다른 코드는 실행되지 않습니다. 이것이 await의 주요 기능 중 하나입니다.

await을 사용하면 해당 비동기 작업이 완료되기를 기다린 후에 그 결과를 사용하거나 처리하는 코드를 작성할 수 있습니다. 이렇게 하면 비동기 코드를 동기 코드처럼 읽기 쉽게 작성할 수 있습니다.

따라서 await 뒤의 결과를 기다리지 않고 나머지 코드도 실행한다는 내용은 정확하지 않습니다. await은 비동기 작업의 완료를 기다린 후에 나머지 코드를 실행합니다.

<= ChatGPT 쉑...

12) 그럼 async await은 비동기 함수 내에서 동기적으로 처리해야 할 부분을 처리해 주는 거라고 생각하면 돼?

맞습니다, 그렇게 이해하시면 됩니다. async와 await는 비동기 함수 내에서 동기적인 코드를 처리할 수 있도록 도와주는 도구입니다.

비동기 함수 내에서 await을 사용하면 해당 비동기 작업이 완료될 때까지 함수의 실행이 일시 중단되고, 작업이 완료되면 그 결과를 반환하면서 동기적으로 코드를 처리할 수 있습니다. 이렇게 함으로써 코드를 순차적으로 작성하며, 비동기 작업의 결과를 기다린 후에 그 결과를 활용하는 것이 가능해집니다.

예를 들어, 데이터베이스에서 데이터를 가져오는 비동기 함수 내에서 await을 사용하여 데이터를 가져온 후에 그 데이터를 가공하거나 처리하는 부분을 동기적으로 다룰 수 있습니다. 이렇게 함으로써 코드의 가독성과 관리성을 향상시킬 수 있습니다.

요약하면, async await은 비동기 함수 내에서 동기적인 처리가 필요한 부분을 처리할 수 있도록 도와주는 도구로 이해하시면 됩니다.

13) 플러터에서의 동기와 비동기, 블로킹과 논블로킹을 가장 쉽게 10문장 내로 설명해 줘.

동기: 작업이 순차적으로 실행되며, 이전 작업이 완료될 때까지 다음 작업은 실행되지 않는 방식입니다.

비동기: 작업이 병렬적으로 실행되며, 작업이 완료되지 않아도 다음 작업이 실행될 수 있는 방식입니다.

블로킹: 작업이 완료될 때까지 다음 코드 실행이 멈추는 상태입니다.

논블로킹: 작업이 완료될 때까지 기다리지 않고 다른 코드를 실행할 수 있는 상태입니다.

동기적 블로킹: 작업이 순차적으로 실행되면서 작업이 완료될 때까지 다음 코드 실행이 멈추는 상태입니다.

동기적 논블로킹: 작업이 순차적으로 실행되지만 작업이 완료되지 않아도 다음 코드를 실행할 수 있는 상태입니다.

비동기적 블로킹: 작업이 병렬적으로 실행되며, 작업이 완료될 때까지 다음 코드 실행이 멈추는 상태입니다.

비동기적 논블로킹: 작업이 병렬적으로 실행되면서 작업이 완료되지 않아도 다음 코드를 실행할 수 있는 상태입니다.

async와 await: 비동기 함수 내에서 동기적으로 처리해야 할 부분을 다루는 데 사용되는 키워드입니다.

Future와 Stream: 비동기 작업의 결과를 나타내며, Stream은 연속적인 데이터를 비동기적으로 제공하는 방식을 나타냅니다.

profile
여기는 일상 블로그, 기술 블로그는 https://yourhealingcoder.tistory.com/

0개의 댓글