
ํด๋น ํฌ์คํ ์ ์ ํ๋ธ ์ํ&๋๋ผ๋ง ๋ฆฌ๋ทฐ ์์ ํ๋ ์ด์ ํ๋ซํผ
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์ ์ ์ฉํด ๋ณด์ธ์ ๐
๊ธ ๋๋ฌด ์ ๋ดค์ต๋๋ค!!