๐ํจ์คํธํธ๋์ ์์ ํ๋ฒ๊ฑฐ๋ฅผ ์ฌ ๋จน๋๋ค๊ณ ๊ฐ์ ๐
ํ๋ฒ๊ฑฐ๋ฅผ ์ฃผ๋ฌธํ๊ณ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ์ ํ ์์์ฆ์ ๋ฐ๋๋ค->๋ด ์ฃผ๋ฌธ๋ฒํธ๊ฐ ํ๋ฉด์ ๋จ๋ ๋์ (๋ด ํ๋ฒ๊ฑฐ๊ฐ ๋์ฌ๋์) ํ์ฅ์ค์ ๋ค๋ ์ค๊ฑฐ๋ ์์ ์ ๋ฃ๊ฑฐ๋ ์ํ๋ ๋ค๋ฅธ์ผ์ ํ ์ ์๋ค->๋ค๋ฅธ์ผ์ ํ๋ ๋์ค์ ๋ด ์ฃผ๋ฌธ ๋ฒํธ๊ฐ ๋ชจ๋ํฐ์ ๋์๋์ง๋ง ํ์ธํ๋ฉด ๋๋ค->๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฃผ๋ฌธ์์์ฆ์ ์ต์ข ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ์๋, ์์์ฆ์ ๋ฏธ๋์ ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ฌธํ ํ๋ฒ๊ฑฐ๋ฅผ ๋ฐ์ ์ ์๋ค๋ ์ผ์ข ์ ์ฝ์ ! (์ค์ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ ์ธ์ด์์๋ Future์ ๋๋ถ์ด โ์ฝ์โ์ด๋ผ๋ ๋ป์ Promise๋ผ๋ ํด๋์ค๊ฐ ์กด์ฌํจ)
์ด๋ ๋ฏ Future์ ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ฌธ ํ ์์ง ๋ฐ์ง ์์ ํ๋ฒ๊ฑฐ์ฒ๋ผ ํ์ฌ์๋ ์ค์ ์ ์ผ๋ก ์กด์ฌํ์ง ์๋ ์ํ์, ๊ทธ๋ฌ๋ ์ ์ ํ์ ์ฃผ๋ฌธ ์์์ฆ์ด ํ๋ฒ๊ฑฐ๋ก ๊ตํ๋ ๋ ๋น๋ก์ ๊ตฌ์ฒด์ ์ธ ์ฌ๋ฌผ๋ก ๋ฐ๋๊ฒ ๋๋ค.
Dart์์ Futureํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋ฏธ๋์ String,int,image ๋ฑ ๊ทธ ๋ฌด์ธ๊ฐ๊ฐ ๊ตฌ์ฒด์ ์ธ ๊ฒฐ๊ณผ๋ฌผ๋ก ๋ํ๋์ ์ค์ ์ ์ธ ๊ฐ์ฒด๋ก ๋ฐํ๋๋ค๋ ์๋ฏธ
๊ทธ๋์ Future์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฃผ๋ฌธ ์์์ฆ๊ณผ ๊ฐ์ ๊ฒ
์ฆ, ์ผ์ข
์ ์ฝ์์ด์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ํ์ ํ์ธํ ์ ์๋ ์ค์ ์ ์ธ ์ฌ๋ฌผ์ด ๋๋ ๊ฒ
Future์ ์ค๋ช
ํ ๋ ์์ง ๊ฐ๋ดํ์ง ์์ ๋ฐ์ค๋ก ๋น์ ํ ์๋ ์๋ค.
Futureํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋จ Future์ด๋ผ๋ ๊ฐ์ฒด, ์ฆ ๋ฐ์คํ๋๊ฐ ์์ฑ์ด ๋๊ณ ํ์ ์ฐ๋ฝ์ ๋ฐ๊ณ ๋ฐ์ค๋ฅผ ์ด์ด๋ณด๋ฉด int๋ String ๋๋ ์๋ฌ๋ฉ์ธ์ง ๊ฑด ์ค์ ์ ์ธ ๊ฐ์ฒด๊ฐ ๋ฆฌํด ์ฆ, ๋ฐ์ค ์์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ๋ ์ฃผ๋ฌธํ ๋ ๋น์ฐํ ์ฐ๋ฆฌ๊ฐ ์ ์ ํ์ ๋ฌด์์ ๋จน๊ฒ ๋ ์ง ์๊ณ ์๋ค.Future๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์์ผ ํ ์ง ๋ฏธ๋ฆฌ ์ง์ ์ ํด ์ค ์ ์๋ค
Futureํด๋์ค๋ ์ ๋๋ฆญ์ฒ๋ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐ์ดํฐ ํ์ ์ง์ ํด ์ค ์ ์๋ค.
Future< >
ex) Future<String>
๋ฐ์ ์ ์ฌ์๊ฐ๋ ์ค๊ตญ์ง์์ 10๋ช ์ค 8๋ช ์ ์ง์ฅ๋ฉด์ ์ฃผ๋ฌธํ๊ณ 1๋ช ์ ์งฌ๋ฝ, 1๋ช ์ ๋ณถ์๋ฐฅ์ ์ฃผ๋ฌธํ์๋ ์ฃผ๋ฐฉ์ฅ์ด ์ฃผ๋ฌธ์ด ์ ์ผ ๋จผ์ ๋ค์ด์๊ณ ์ ์ผ ์์ด ๋ง์ ์ง์ฅ๋ฉด๋ง์ ๋จผ์ ๋ง๋ค๊ณ ๋๋จธ์ง ๋ฉ๋ด๋ ์ ํ ๋ง๋ค์ง ์๋๋ค๋ฉด ์งฌ๋ฝ๊ณผ ๋ณถ์๋ฐฅ์ ํ์ฐธ ๋ค์ ๋ง๋ค์ด ์ง ๊ฒ์ด๋ค.
๋ฐ์๋ฉด ๋์์ ์ง์ฅ๋ฉด ๋ฉด์ ์ถ์ผ๋ฉฐ ๋ฐฅ๋ ๋ณถ๊ณ ์งฌ๋ฝ ๊ตญ๋ฌผ๋ ๋ง๋ค ์ ์๋ค.->์ผ์ ํ๋๋ฐ ์์ด์ ์ถ๊ตฌํ๋ ๋ชฉ์ ์ด ๋ค๋ฅด๊ณ ๋์์ ์ผ์ด๋์ง ์์ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ผํ๋ ๊ฒ ->Async ๋น๋๊ธฐ
์ง์ฅ๋ฉด๋ง ๋จผ์ ๋ง๋๋ ๊ฒ -> ํ๊ฐ์ง ๋ชฉ์ ๋ง์ ๊ฐ์ง๊ณ ์์๋๋ก ํด์ผํ ์ผ ํ๊ฐ์ง๋ง ํ๋๊ฒ->Synchronous ๋๊ธฐ
๐กasync์ ๊ด๋ จํด์ await๋ ์์
์ด ์ฒ๋ฆฌ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ผ๋ ์๋ฏธ !
1.await ํค์๋๋ฅผ ์ฌ์ฉํ ํจ์๋ ๋ฌด์กฐ๊ฑด async ํจ์์ด์ด์ผ ํฉ๋๋ค.
Future functionName() async {
...
await someFunction();
...
}
2.async ํจ์๋ ๋ฌด์กฐ๊ฑด Future ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
import 'dart:async';
Future<int> futureNumber() {
// 3์ด ํ 100์ด ์์์์ ๋์ต๋๋ค
return Future<int>.delayed(Duration(seconds: 3), () {
return 100;
});
}
void main() {
// future ๋ผ๋ ๋ณ์์์ ๋ฏธ๋์(3์ด ํ์) int๊ฐ ๋์ฌ ๊ฒ์
๋๋ค
Future<int> future = futureNumber();
future.then((val) {
// int๊ฐ ๋์ค๋ฉด ํด๋น ๊ฐ์ ์ถ๋ ฅ
print('val: $val');
}).catchError((error) {
// error๊ฐ ํด๋น ์๋ฌ๋ฅผ ์ถ๋ ฅ
print('error: $error');
});
print('๊ธฐ๋ค๋ฆฌ๋ ์ค');
}
์ ์ฝ๋๋ฅผ ์ํํ์ ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ถ๋ ฅ์ด ๋๋ค.
๊ธฐ๋ค๋ฆฌ๋ ์ค
val: 100
Future๋ ๋น๋๊ธฐ๋ฅผ ์ํด์ ์กด์ฌํ๋ค. ๋ง์ฝ 100์ค์ ์ฝ๋์๋ค๊ณ ๊ฐ์ ํด๋ณธ๋ค๋ฉด, ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ ๊ฒฝ์ฐ Future<int> ์์ ๊ฐ์ด ๋์ฌ ๋๊น์ง 100์ค์ ์ฝ๋๋ ๋์ํ์ง ์๊ณ ์ ์งํด์์๊ฒ์ด๋ค. ์ด 100์ค์ ์ฝ๋์ Future<int>๋ก๋ถํฐ ๋์ฌ ๊ฐ์ด ์ ํ ํ์์๋ค๋ฉด ๋งค์ฐ ๋นํจ์จ์ ์ผ ๊ฒ์ด๋ค.
Future<int> ์์ ๊ฐ์ด ๋์ค์ง ์์๋ ๊ณ์ํด์ ๋์์ ์ํํ ์ ์๋๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ฝ๋์์ 3์ด๊ฐ ์ง๋ future์ then์ด ๋์ํ๊ธฐ ์ ์ ๊ณ์ํด์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋ฐ์ print ๊ฐ ๋จผ์ ์ถ๋ ฅ์ด ๋๋ค.
Future<ProcessedData> createData() {
return _loadFromDisk().then((id){
return _fetchNetworkData(id);
}).then((data){
return ProcessedData(data);
})
}
์ด ํจ์๋ ๋ฏธ๋์ ProcessedData ๊ฐ ๋์ฌ ์์์ธ Future๋ฅผ returnํ๋ค. ๊ฐ์ฅ ๋จผ์ ๋์คํฌ๋ก๋ถํฐ id ๊ฐ์ ์ฝ์ด๋ค์ด๋ _loadFromDsik() ํจ์๊ฐ ์ํ๋๊ณ , id ๋ฅผ ์ฝ์ด๋ค์ด๋ฉด _fetchNetworkData() ํจ์์ id๋ฅผ ์ธ์๋ก ๋ฃ์ด์ ๋คํธ์ํฌ๋ฅผ ์ด์ฉํด data ๋ฅผ ๋ฐ์์จ๋ค. ๊ทธ๋ฆฌ๊ณ data ๋ฅผ ๋ค ๋ฐ์์ค๋ฉด ProcessedData(data) ๋ฅผ return ํ๋ค.
Future<ProcessedData> createDate() async {
final id = await _loadFromDisk();
final data = await _fetchNetworkData(id);
return ProcessedData(data);
}
then ์ ์ด์ฉํด ์์ฑํ ์ฝ๋์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋์ง๋ง, ํจ์ฌ ๊ฐ๊ฒฐํ๋ฉฐ ๋ง์น ๋๊ธฐ์ ์ผ๋ก ์ผ์ด๋๋ ์ฝ๋์ธ ๊ฒ ์ฒ๋ผ ๋ณด์ธ๋ค. ์ด๋ฌํ ๊ฐ๊ฒฐํจ ๋๋ฌธ์ async / await ๋ Future ๋ฅผ ์กฐ๊ธ ๋ ์ฉ์ดํ๊ฒ ์ฌ์ฉํ๋๋ก ๋์์ค๋ค.
Future<ProcessedData> createDate() async {
final id = await _loadFromDisk();
final data = await _fetchNetworkData(id);
return ProcessedData(data);
}
์ฝ๋์ ์์๋ฅผ ์ดํด๋ณด๋ฉด
1.createData() ํจ์๊ฐ ์คํ๋ ๋ ๊ฐ์ฅ๋จผ์ ์ฒซ ๋ฒ์งธ ์ค์ await ํค์๋๊ฐ ๋ถ์ _loadFromDisk() ๋ฅผ ์ํํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ํด๋น ํจ์๋ฅผ ์คํํ๋ฉด์ '์, await ๋ฅผ ๋ณด๋ ์ด ํจ์๋ฅผ ์ํํ๋ ค๋ฉด ๋ญ๊ฐ ๋ค๋ฅธ ๊ฒ๋ค์ด ํ์ํ๊ฒ ๊ตฐ.' ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ์ผ๋จ ์ด ํจ์์ ์ํ์ ๋ฉ์ถ๋ค.
2.๊ทธ๋ฆฌ๊ณ ํจ์๋ฅผ ํธ์ถํ ๊ณณ์ Future ๋ฅผ return ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ "์ด ํจ์๋ ๋น๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ๊ฐ ์ข ํ์ํด. ์ผ๋จ ProcessedData ๊ฐ ๋ด๊ธธ ์์ Future ๋ฅผ ๋ฏธ๋ฆฌ ์ค๊ฒ. ๋์ค์ ์ด ํจ์๊ฐ ๋ชจ๋ ์๋ฃ๋๋ฉด ProcessedData ๊ฐ ๋์ฌ๊ฑฐ์ผ." ๋ผ๊ณ ๋งํ๋ค.
ํด๋น ํจ์๋ await ๊ฐ ๋ถ์ _loadFromDisk() ํจ์๊ฐ ๋๋ ๋๊น์ง ๋ค์ ๋์์ ์ํํ์ง ์๊ณ ๊ฐ๋งํ ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋ง์น ์์์์ ๊ฐ์ด ๋์์ผ then ํจ์๋ฅผ ์ํํ ์ ์์๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ง์ด๋ค.
3._loadFromDisk() ํจ์์ ์ํ์ด ์๋ฃ๋๋ฉด ๊ทธ ๋ค์ ์ค์ ์ํํ๋ค. ์ด๋ฒ์๋ await ๊ฐ ๋ถ์ ํจ์์ด๊ธฐ ๋๋ฌธ์ ๋ง์ฐฌ๊ฐ์ง๋ก _fetchNetworkData(id) ๊ฐ ์ํ์๋ฃ ๋ ๋๊น์ง ํจ์๋ฅผ ๋ ์ด์ ์งํํ์ง ์๊ณ ๊ธฐ๋ค๋ฆฐ๋ค.
4.2๋ฒ ์งธ ์ค๋ ๋ค ๋ง์น๋ฉด ์ด์ return ProcessedData(data) ๊ฐ ์ํ๋๋ค. ์ด return ์ ํตํด createData() ๋ฅผ ํธ์ถํ ๋ ์์ด ๋ฐ์ ์์์์ ProcessedData ๊ฐ ๋์ค๊ฒ ๋๋ค.
์ด๋ฐ ์์๋ก ๋์์ ํฉ๋๋ค. await ๋ฅผ ๋ง๋๋ฉด ํด๋น ๋์์ ์๋ฃ๋๊ธฐ ์ ๊น์ง ๋ฉ์ถ์ด์ ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์ then(...) ํจ์ ์ฒ๋ผ ๋์์ ํ๋ฉฐ ์ ์ฒด์ ์ธ ์ฝ๋๋ ํจ์ฌ ๊ฐ๋ ์ฑ์ด ์ข๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์์์์ 2๋ฒ ๋๋ฌธ์ async ํจ์์ return ํ์ ์ ๋ฌด์กฐ๊ฑด Future ์ด์ด์ผ ํ๋ค. await ๋ฅผ ์ฌ์ฉํ์์ ํ ๋ async ํจ์์ผ ํ ๊ณ , await ๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์, ํจ์์ return ๊น์ง ๊ฐ๊ธฐ ์ด์ ์ ๋ฏธ๋ฆฌ Future ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ async ํจ์๋ ๋ฌด์กฐ๊ฑด Future ๋ฅผ ๋ฐํํด์ผ ํ๋ ๊ฒ!
๐กawait ๋ฅผ ๋ง๋๋ฉด ํจ์๋ฅผ ์ ์ ๋ฉ์ถ๊ณ ํจ์๋ฅผ ํธ์ถํ ๊ณณ์ Future ๋ฅผ return ํ๋ค.
๐กawait ๊ฐ ๋ถ์ ๋์์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง ํจ์๋ฅผ ๋ ์ด์ ์งํํ์ง ์๋๋ค.
๐กreturn ์ ํตํด 1๋ฒ์์ ์ฃผ์๋ Future ์์ return ๊ฐ์ด ๋์ค๊ฒ ํ๋ค.
๐์ฐธ๊ณ ์๋ฃ