ํด๋น ํฌ์คํ ์ ์ ํ๋ธ ์ํ&๋๋ผ๋ง ๋ฆฌ๋ทฐ ์์ ํ๋ ์ด์ ํ๋ซํผ
Plotz
๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ๋์ ๋ ๊ธฐ์ ๋ฐ ๋ฐฉ๋ฒ๋ก ์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
๋ค์ด๋ก๋ ๋งํฌ : ์ฑ์คํ ์ด / ํ๋ ์ด์คํ ์ด
์ด๋ฒ ํฌ์คํ
์์๋ ์์ฃผ ์ฝ๊ฒ Flutter ํ๋ก์ ํธ์ Isolate
์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ฃจ์ด ๋ณด๋ ค๊ณ ํฉ๋๋ค. ๋ณต์กํ ์ค๋ช
์ ์ต๋ ๋ฐฐ์ ํ๊ณ ํต์ฌ
๋ด์ฉ๋ง ์ค๋ช
ํ๋ ค๊ณ ํฉ๋๋ค. ๋ชฉ์ฐจ๋ ์๋์ ๊ฐ์ต๋๋ค.
Isolate์ ๊ตฌ์ฒด์ ์ธ ์๋๋ฐฉ์์ ๋ํด ์ดํดํ์ง ๋ชปํ๊ณ ์๋๋ผ๋ ๋ฐ๋ก ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ ์ ์ฉ
ํ ์ ์๋๋ก ๋ชจ๋ํ๋ ์ฝ๋
๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ธ ๊ฐ๋ ์ด ๊ถ๊ธํ์๋ฉด Flutter ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
++
https://pub.dev/packages/easy_isolate_mixin
์ต๊ทผ์ Isolate์ ์ฝ๊ฒ ๋์์ฃผ๋ ํจํค์ง๋ฅผ ๋ฐฐํฌํ์ต๋๋ค!
๋จผ์ Isolate ๊ฐ๋ ์ ๊ฐ๋ณ๊ฒ ์ง๊ณ ๋์ด๊ฐ์๋ค.
Isolate๋ ๋ ๋ฆฝ์ ์ธ ์์ ๋จ์๋ก, ์์ฒด์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฐ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ๊ธฐ๋ฅ. ๊ฐ isolate๋ ์์ฒด์ ์ผ๋ก ์คํ๋๋ ์ฝ๋๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์๊ณ ํต์ ์ ์ํด ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉํจ ์ด๋ฅผ ํตํด ํ๋ฌํฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณ๋ ฌ ์์ ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ฑ์ ํฅ์์ํค๋ฉฐ, ๊ธด ์์ ์ ๋ถ๋ฆฌํ์ฌ ์ฑ์ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์.
๊ณต์๋ฌธ์์ ์ค๋ช ๋์ด ์๋ ๊ธ ์ ๋๋ค. ์กฐ๊ธ ๋ณต์กํ์ฃ ?
์ข ๋ ์ฝ๊ฒ ์ด์ผ๊ธฐํด๋ณด๊ฒ ์ต๋๋ค.
Dart๋ ์ฑ๊ธ ์ค๋ ๋
๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ ๋ฒ์ ํ๋์ ์์
๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ฉด UI๋ฅผ ๋ ๋๋ง
ํ๋ ๋์์๋ ๋คํธ์ํฌ๋ฅผ ํธ์ถ
ํ๋ ๊ฒ์ด ์์น์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ๋น๋๊ธฐ ์ฒ๋ฆฌ
์ Isolate(์ด๋ฒคํธ ๋ฃจํ)
๋ฅผ ํตํด ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ
์ ์ง์ํ๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก UI ๋ ๋๋ง ์์
๊ณผ ๋คํธ์ํฌ ํธ์ถ ์์
์ ๋์์ ์คํ์ํฌ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ(async-await)์ Isolate ๋ชจ๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ
์ ์ง์ํ๋ค๋ ๊ณตํต์ ์ด ์์ง๋ง ๋ช
ํํ ์ฐจ์ด์ ๋ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ด Isolate๋ฅผ ์ดํดํ๋๋ฐ, ์์ด์ ๊ต์ฅํ ์ค์ํ ๊ฐ๋
์ธ๋ฐ์. ์คํํฌ๋ํํธ ๊ฒ์
์ผ๋ก ๋น์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํตํด ๋์์ ์ผ๋ก ์์
์ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ํ
๋์ SCV
๊ฐ 2๊ฐ์ ๊ฑด๋ฌผ
์ ์ง๋ ์ํฉ์ผ ๋, ๊ฑด๋ฌผ์ ์กฐ๊ธ์ฉ ๋ฒ๊ฐ์ ๊ฐ๋ฉด์ ์ง๋ ์ํฉ์ด๋ผ๊ณ ์ดํดํ ์ ์์ต๋๋ค(SCV๋ ๊ฑด๋ฌผ์ ์ง๋ ๊ณผ์ ์ ์ค๋จ ๋ฐ ์ฌ๊ฐํ ์ ์๋ค๋ ์ ์ด ๊ณ ์ฆ๋์์ต๋๋ค)
์ฌ๊ธฐ์ ๊ฑด๋ฌผ์ ํ๋์ ์์
๋จ์
์ด๊ณ ๊ฑด๋ฌผ์ ์ง๋ SCV๋ ๋ฉ๋ชจ๋ฆฌ
๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ค๋ ๋
์ธ ์
์ด์ฃ .
๋ฐ๋๋ก ํ๋กํ ์ค์ ์ ๋์ ๊ฑด๋ฌผ์ ์ง๋ ๊ณผ์ ์์ฒด์ ๊ด์ฌํ์ง ์์ต๋๋ค. ์ ๋์ด ๊ตฌ ํํ์ ํ๋ผ์ฆ๋ง ํ๋
๋ฅผ ์์ฑํ๋ฉด ํ๋ผ์ฆ๋ง ํ๋ ์์ฒด๊ฐ ์ ๋์ ๊ด์ฌ ์์ด ์ค์ค๋ก ๊ฑด๋ฌผ์ด ์์ฑ๋๋ ํํ
์
๋๋ค. ์ฌ๋ฌ ๊ฐ์ ํ๋ผ์ฆ๋ง ํ๋๋ฅผ ์์ฑํ ์ ์๊ณ , ๊ฐ ํ๋ผ์ฆ๋ง ํ๋๋ ๋
๋ฆฝ์ ์ผ๋ก ๊ฑด๋ฌผ์ ๊ตฌ์ฑํ๋ค๋ ์ ์์ Isolate
๊ณผ ์ ์ฌํ ํน์ง์ ๊ฐ์ง๋๋ค. ์ฌ๋ฌ ๊ฐ์ Isolate์ด ์์ฑ๋ ์ ์๊ณ , ๊ฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
์ ๊ฐ์ง๊ณ ์์
์ ์งํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฆ, ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ Isolate์ ๋
๋ฆฝ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
์ ๊ฐ์ง๊ณ ๋ณ๋ ฌ ๋ฐ ๋น๋๊ธฐ ์์
์ ์ํํ๋ ํน์ง์ด ์์ต๋๋ค. ๋ํ, ์ฌ๋ฌ ๊ฐ์ Isolate์ด ์คํ
๋ ์ ์๋ ๊ตฌ์กฐ์ด๊ธฐ๋ ํฉ๋๋ค.
๊ฑด๋ฌผ์ ์ง๋ ํ์ : ๋ฉ๋ชจ๋ฆฌ ํ ๋น
๊ฑด๋ฌผ : ํ๋ก์ธ์ค
์ ๋ : ์ค๋ ๋
ํ๋กํ ์ค์ ํ๋ผ์ฆ๋ง ํ๋ : isolate(event loop)
์ ๊ฒฝํ์ ๋๋ถ๋ถ์ Isolate์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ๋ฉ์ธ ์ค๋ ๋์์๋
์ถฉ๋ถํ ์ญํ ์ ํด๋ผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํ์ง๋ง ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์์ธ Ioslate ๋์
์ ๊ณ ๋ คํด ๋ณผ ์ ์์ต๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ ๋๊ธฐํ
์ ํ๋ฆฌ์ผ์ด์
์์ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ ๋๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ, Isolate ์ฌ์ฉ์ด ๊ถ์ฅ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผ์๊ฑฐ๋ ์ฑ์์ ์ค์๊ฐ์ผ๋ก ์ฐจํธ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํด์ผ ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณต์กํ ๊ณ์ฐ
์ดํ๋ฆฌ์ผ์ด์
์์ ๋ณต์กํ ๊ณ์ฐ ์์
์ด ํ์ํ ๊ฒฝ์ฐ์๋ Isolate์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํนํ ๋ฌด๊ฑฐ์ด ์์
์ ์ํํ๋ loop๋ฌธ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต๋๋ค๋ฉด Isolate ๋์
์ ๊ณ ๋ คํด ๋ณด์ธ์.
์์์ ์ธ๊ธํ ๊ฒฝ์ฐ ์ด์ธ์๋ Frame Drop
, ์ฆ ๋ฒ๋ฒ
๊ฑฐ๋ฆผ ํ์
์ด ๋ณด์ธ๋ค๊ณ ์์ธ์ ํ์
ํ๊ณ Isolate์ ์ ์ฉํด๋ ๋ฌด๋ฐฉํฉ๋๋ค. ์์ฝํ๋ฉด UI ์ค๋ ๋์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์ฑ์ ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ ํฅ์ํ๊ธฐ ์ํด Isolate์ ์ฌ์ฉํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ด์ ์ค์ ๋ก Isolate์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ณธ ํฌ์คํ
์์๋ ๊ตฌ์ฒด์ ์ธ Isolate ์ฝ๋์ ์๋ ์๋ฆฌ์ ๋ํด์๋ ์ค๋ช
๋๋ฆฌ์ง ์์ง๋ง ์ฃผ์
์ ์ผ์ผํ ๋ค ๋ฌ์๋์์ผ๋ ์ฐธ๊ณ ํด์ฃผ์ธ์. ํต์ฌ ์ปจ์
๋ง ์๊ฐํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
import 'dart:async';
import 'dart:collection';
import 'dart:isolate';
import 'package:flutter/services.dart';
// Isolate๋ฅผ ๋ค๋ฃจ๋ mixin ํด๋์ค
mixin IsolateHelperMixin {
// ๋์์ ์คํํ ์ ์๋ Isolate์ ์ต๋ ๊ฐ์ ์ค์
static const int _maxIsolates = 5;
// ํ์ฌ ์คํ ์ค์ธ Isolate์ ๊ฐ์๋ฅผ ์ถ์
int _currentIsolates = 0;
// ๋ณด๋ฅ ์ค์ธ ์์
์ ์ ์ฅํ๋ ํ
final Queue<Function> _taskQueue = Queue();
// Isolate๋ฅผ ์์ฑํ์ฌ ํจ์๋ฅผ ์คํํ๊ฑฐ๋, ๋ง์ฝ ํ์ฌ ์คํ ์ค์ธ Isolate์ ๊ฐ์๊ฐ ์ต๋์น์ ๋๋ฌํ ๊ฒฝ์ฐ ํ์ ์์
์ ์ถ๊ฐ
Future<T> loadWithIsolate<T>(Future<T> Function() function) async {
if (_currentIsolates < _maxIsolates) {
_currentIsolates++;
return _executeIsolate(function);
} else {
final completer = Completer<T>();
_taskQueue.add(() async {
final result = await _executeIsolate(function);
completer.complete(result);
});
return completer.future;
}
}
// ์๋ก์ด Isolate๋ฅผ ์์ฑํ์ฌ ์ฃผ์ด์ง ํจ์๋ฅผ ์คํ
Future<T> _executeIsolate<T>(Future<T> Function() function) async {
final ReceivePort receivePort = ReceivePort();
final RootIsolateToken rootIsolateToken = RootIsolateToken.instance!;
final isolate = await Isolate.spawn(
_isolateEntry,
_IsolateEntryPayload(
function: function,
sendPort: receivePort.sendPort,
rootIsolateToken: rootIsolateToken,
),
);
// Isolate์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ณ , ์ด Isolate๋ฅผ ์ข
๋ฃํ ํ, ํ์์ ๋ค์ ์์
์ ์คํ
return receivePort.first.then(
(dynamic data) {
_currentIsolates--;
_runNextTask();
if (data is T) {
isolate.kill(priority: Isolate.immediate);
return data;
} else {
isolate.kill(priority: Isolate.immediate);
throw data;
}
},
);
}
// ํ์์ ๋ค์ ์์
์ ๊บผ๋ด์ด ์คํ
void _runNextTask() {
if (_taskQueue.isNotEmpty) {
final nextTask = _taskQueue.removeFirst();
nextTask();
}
}
}
// Isolate์์ ์คํ๋๋ ํจ์
Future<void> _isolateEntry(_IsolateEntryPayload payload) async {
final Function function = payload.function;
try {
BackgroundIsolateBinaryMessenger.ensureInitialized(
payload.rootIsolateToken,
);
} on MissingPluginException catch (e) {
print(e.toString());
return Future.error(e.toString());
}
// payload๋ก ์ ๋ฌ๋ฐ์ ํจ์ ์คํ ํ ๊ฒฐ๊ณผ๋ฅผ sendPort๋ฅผ ํตํด ๋ฉ์ธ Isolate๋ก ๋ณด๋
final result = await function();
payload.sendPort.send(result);
}
// Isolate ์์ฑ ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ํด๋์ค
class _IsolateEntryPayload {
const _IsolateEntryPayload({
required this.function,
required this.sendPort,
required this.rootIsolateToken,
});
final Future<dynamic> Function() function; // Isolate์์ ์คํํ ํจ์
final SendPort sendPort; // ๋ฉ์ธ Isolate๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํ SendPort
final RootIsolateToken rootIsolateToken; // Isolate๊ฐ ํต์ ์ ์ํ ํ ํฐ
}
์ ์ฉ ์์:
// Repository ๋ ์ด์ด์์ IsolateHelperMixin์ ์ ์ฉ
// ์ ์ ๋ ํฌ์งํ ๋ฆฌ ํด๋์ค
class UserRepository with IsolateHelperMixin {
UserRepository(this._api);
// Isolate ์ ์ฉ ๋ฒ์
Future<ProfileImgRes> loadUserProfileImg() async =>
loadWithIsolate(() => _api.loadUserProfileImg());
// Isolate ์ ์ฉ์ด ์๋ ๋ฒ์
Future<UserInfo> loadUserDetailInfo() async => _api.loadUserDetailInfo();
}
// ์ฝํ
์ธ ๋ ํฌ์งํ ๋ฆฌ ํด๋์ค
class ContentRepository with IsolateHelperMixin {
ContentRepository(this._api);
// Isolate ์ ์ฉ ๋ฒ์
Future<ContentImg> loadContentImg() async =>
loadWithIsolate(() => _api.loadContentImg());
// Isolate ์ ์ฉ์ด ์๋ ๋ฒ์
Future<ContentInfo> loadContentInfo() async => () => _api.loadContentInfo();
}
// ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
final userRepository = UserRepository(UserApi());
final user = await userRepository.getUserDetails();
print(user);
// ๋ฉ์ธ ํจ์์์ ํ์ํ ๊ฐ๋ค์ ์ด๊ธฐํ ํด์ค์ผ ํจ
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// NOTE : Isolate ํ ํฐ ์์ฑ ๋ฐ ์ด๊ธฐํ
final RootIsolateToken rootIsolateToken = RootIsolateToken.instance!;
BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken);
runApp(const MyApp());
}
Future<T> Function()
ํ์
์ ์ธ์๋ก ๋ฐ๋ ๋ฉ์๋Isolate์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ Future<T>
๋ฉ์๋๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉด ๊ฐํธํ๊ฒ Isolate์ ๊ธฐ๋ฅ์ ์คํ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ ์ฐ์ฑ
์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
// _api.loadContentImg() <-- ๊ธฐ์กด ๋ฉ์๋
Future<ContentImg> loadContentImg() async =>
loadWithIsolate(() => _api.loadContentImg());
๋๋ถ์ด, ์ด๋ฏธ ์กด์ฌํ๋ ํด๋์ค๋ ํจ์์ ๋ํด ๋ณ๋์ ์์ ์์ด Isolate๋ฅผ ์ ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด์ ๋ฐ๋ผ ๊ธฐ์กด ์ฝ๋๋ฅผ ํฌ๊ฒ ์์ ํ์ง ์๊ณ ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฐ๋ฐ ์๊ฐ
์ ์ค์ด๊ณ ์ฝ๋์ ๊ฐ๋
์ฑ
์ ํฅ์์ํค๋ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์์ฝํ์๋ฉด, Future Function() ํ์
์ ์ธ์๋ก ๋ฐ์์ผ๋ก์จ ๋ค์ํ ๋น๋๊ธฐ ์์
์ ๋ํด ๊ฐ๊ฒฐํ๊ณ ์ ์ฐํ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ
์ ํฅ์์ํค๋ฉฐ, ์ ์ง ๊ด๋ฆฌ
๋ฅผ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
Isolate์ mixin
ํด๋์ค๋ก ๊ด๋ฆฌํ๋ ์ด์ ๋ ํฌ๊ฒ 3๊ฐ์ง ์ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฌ์ฌ์ฉ์ฑ
Isolate ๊ด๋ฆฌ ์ฝ๋๋ฅผ ์ฌ๋ฌ ํด๋์ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ DRY
(Don't Repeat Yourself)์์น์ ๋ฐ๋ฅด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ ์ฝ๋์์ UserRepository์ ContentRepository ํด๋์ค์ ๊ณตํต์ ์ผ๋ก IsolateHelperMixin
ํด๋์ค๊ฐ ๋ฏน์ค์ธ๋์ด isolate๊ธฐ๋ฅ ๋์ผํ๊ฒ ์ํํ๊ณ ์์ต๋๋ค
์ค๊ณ์ ์ ์ฐ์ฑ
mixin์ ์ด์ฉํ๋ฉด ํด๋์ค ๋ด์์ ๊ด๋ฆฌ๋๋ ๋ฉ์๋์ ์ ํ์ ์ผ๋ก isolate์ ์ ์ฉ
ํ ์ ์๊ฒ ๋ฉ๋๋ค. ์๋ฅผ๋ค์ด UserRpeository์ loadUserProfileImg ๋ฉ์๋๋ Isolate์ด ์ ์ฉ๋์์ง๋ง loadUserDetailInfo ๋ฉ์๋๋ ์ ํ์ ์ผ๋ก Ioslate์ ์ ์ฉํ์ง ์์์ต๋๋ค. mixin ๋๋ถ์ ์ด๋ ๊ฒ ์ ์ฐํ ๊ตฌ์กฐ
๋ฅผ ๊ตฌ์ฑํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ชจ๋ํ
mixin์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ ๋ชจ๋ํ
ํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋์ ๊ฐ๋
์ฑ์ ํฅ์์ํค๋ฉฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋๋ค. ๋จํธ์ ์ผ๋ก Isolate์ ๋์ ์๋ฆฌ๋ฅผ ์์ธํ ์ดํดํ์ง ๋ชปํ๋ ์์
์๋ผ๋ ๊ฐํธํ๊ฒ Isolate ๊ธฐ๋ฅ์ ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
loadWithIsolate
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ต๋ ์คํ ๊ฐ๋ฅํ Isolate์ ๊ฐ์๋ฅผ ์ ํ
ํ๋ ๋ก์ง์ด ๋ค์ด๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์คํ
๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ๊ณ , ๋๋ฌด ๋ง์ Isolate์ด ๋์์ ์คํ๋์ด ๋ฐ์ํ ์ ์๋ ์ฑ๋ฅ ์ ํ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ Isolate์ ์ฝ๊ณ ์ ์ฐํ๊ฒ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์์์ ์ ๊น ์ธ๊ธํ์ง๋ง, ๋๋ถ๋ถ์ Isolate์ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ์คํ๋ ค Isolate์ ๋จ์ฉํ๋ฉด ์ ์ฒด์ ์ผ๋ก ์ฑ ์ฑ๋ฅ์ ์์ข์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ด์ฃ .
๊ทธ๋์ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ ์ค์ํฉ๋๋ค. Ioslate์ด ํ์ํ ๊ฒฝ์ฐ ํฌ์คํ ์์ ์ ๊ณต๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ฝ๊ณ ์ ์ฐํ๊ฒ Ioslate์ ์ ์ฉํด ๋ณด์ธ์ ๐
๊ธ ๋๋ฌด ์ ๋ดค์ต๋๋ค!!