인프런 커뮤니티 질문&답변

lateButEarly님의 프로필 이미지
lateButEarly

작성한 질문수

Flutter 앱 개발 기초

비동기 질문드립니다.

해결된 질문

작성

·

221

1

Http 통신을 위해 비동기 통신을 사용하는것으로 보이는데요

그런데 네트웤통신의 느림을 해소하기 위해 비동기 통신을 하였는데

굳이 그걸 또 async await을 사용해서 동기 통신처럼 만드는 이유가 있을까요?

응답을 받고 처리 하기 위함이라는 것은 알고 있습니다.

제 질문의 의도는 처음부터 동기처리 하면 되지 , 굳이 비동기 처리하고 나서 응답을 받고 다시 동기화 처리하는

사유가 따로 있을까 해서요

좋은 강의 감사드립니다.

 

추가 질문이 있습니다.

강의노트 전체 페이지를 갈수 있는 URL을 알수 잇을가요

지금은 해당 회차에 강의에 걸려 있는 링크를 타고 들어가고 있습니다.

답변 1

1

DevStory님의 프로필 이미지
DevStory
지식공유자

안녕하세요 김병식님

"비동기 처리하고 나서 응답을 받고 다시 동기화 처리하는 이유"에 대해 답변드리겠습니다.

이해를 돕기 위해 상황을 가정해 보겠습니다.
- 통신 함수 A는 비동기로 작동합니다.
- 함수 B는 내부에서 함수 A의 응답을 가공하여 C를 응답하는 함수입니다.
- 함수 D는 함수 B의 결과를 출력하는 함수입니다.

함수 B를 async & await을 이용해 구현해 보면 다음과 같을 것 입니다.

Future<C> B() async {
    var a = await A();
    return C(a);
}

함수 B는 C를 응답하기 위해선 시간이 걸리는 함수 A의 결과가 필요합니다. 따라서 A의 응답이 오길 기다려야하고 이를 위해 async & await을 사용하게 됩니다.

함수 내부에서 시간이 걸리는 코드를 기다릴 때 await을 붙이는데, await을 쓰려면 해당 함수에 async를 필수로 추가해줘야 합니다. async는 해당 함수가 비동기 함수임을 나타내는 키워드입니다.

Dart에서 시간이 걸리는 코드는 비동기로 작동하는데, 함수 내부에서 await을 사용하는 경우 해당 함수도 결과를 반환하는데 시간이 오래 걸릴 수 있기 때문에 비동기 함수라는 의미로 async를 선언을 해야하는 것 입니다. 이것이 await과 async가 함께 다니는 이유입니다.
그리고 비동기 함수는 반환하는데 시간이 걸린다는 의미로 반환 타입을 Future로 감싸주게 되는 것 입니다.

Dart에서 시간이 걸리는 코드는 비동기로 작동하기 떄문에, 함수 B가 내부에서 시간이 걸리는 코드를 기다리므로 함수 B도 비동기 함수가 됩니다.

다음으로 함수 D를 구현해 보도록 하겠습니다.

Future<C> B() async {
    var a = await A();
    return C(a);
}

void D() async {
    var c = await B();
    print(c);
}

위 코드에서 async & await이 두 번 사용되었습니다. 함수 B내부에서 async & await으로 동기화를 했는데, 함수 D에서 또 async & await으로 동기화를 구현하는지 의문이 들으신게 아닌가 추측해 봅니다. (만약 아니시라면 의문을 느끼신 코드 공유 부탁드립니다)

결론은 함수B가 함수A를 기다리므로 인해 비동기 함수가 되었기 때문에 함수 D에서 함수 B의 결과를 받아 무언가 동작을 하려면 함수 B를 기다려야 합니다. 따라서 함수 D에서도 async & await이 사용된 것으로 이해하실 수 있습니다.

참고로 async & await을 사용하지 않고 then을 이용하여 아래와 같이 구현하는 방법도 있습니다.

Future<C> B() {
    return A().then((a) {
        return C(a);
    });
}

void D() {
    B().then((c) {
        print(c);
    });
}

then을 line by line으로 보다 직관적이게 작성한 코드가 async & await라서 강의에선 async & await만 다루고 then은 다루지 않았는데, 이에 대한 상세한 내용은 영상을 참고해 주세요.

감사합니다 :)

lateButEarly님의 프로필 이미지
lateButEarly

작성한 질문수

질문하기