Fusion์ ๋ํด์ ์ฅ๊ธฐ ์ฌ๋ก๊น ์ ์์ํฉ๋๋ค.
์ต์ข ๋ชฉํ:
- Fusion์ ์ด์ฉํ ๋ค์ํ ์ํ ๊ตฌ์ฑ
- Fusion ๊ด๋ จ ๊ธฐ์ ๋ฌธ์ ๋ฐ ๋ฐํ์๋ฃ
- Fusion GitHub ํ๋์ ์ฐธ์ฌ
โป ์ฌํด ๋ด๋ด ์งํํ ์ฅ๊ธฐ ์ฌ๋ก๊น ์ ๋๋ค.
Fusion์ ๋ํด์ ์ฅ๊ธฐ ์ฌ๋ก๊น ์ ์์ํฉ๋๋ค.
์ต์ข ๋ชฉํ:
โป ์ฌํด ๋ด๋ด ์งํํ ์ฅ๊ธฐ ์ฌ๋ก๊น ์ ๋๋ค.
๋จผ์ ๋ญ๊ฐ๋ฅผ ํ์ ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋จธ๋ ์ฝ๋๋ฅผ ์คํํด๋ณด๋๊ฒ ๋น ๋ฆ ๋๋ค.
ํจ์ ์ ๋ํด ๋๋ต์ ์ผ๋ก ์ดํด๋ด ์๋ค.
์ผ๋จ Overview๋ง ๋ด๋ ๋จธ๋ฆฌ์ ์ฅ๊ฐ ๋๋ ค๊ณ ํฉ๋๋ค. ๋จผ์ ๊ฐ๋ ์ ์ธ ์ ๊ทผ์ ํด๋ด ๋๋ค.
Fusion์ "Real-time User Interface"๋ฅผ ์ ๊ณตํ๋ ํ๊ฒฝ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฐ ํ๊ฒฝ์ ์ ๊ณตํ๊ธฐ ์ํด์ ์ฝ๋๊ฐ ์๋นํ ๋ณต์กํด์ง๊ณ , ์์ ๋์ด ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ง๋ง๋ค ๊ธฐ๋ฅ ๊ตฌํ์ ํ ๋ ์๋ จ๋ ๊ฐ๋ฐ์๊ฐ ์๋๋ฉด ์ผ๊ด๋๊ฒ ์์ฑํ๊ธฐ๊ฐ ์ด๋ ต๊ณ , ๊ทธ ์์์ ๋ค์ํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ด๋ จํด์ ํ์ด์ค๋ถ์ด๋ ํธ์ํฐ ๋ฑ์ ์๋น์ค๋ค์ ์ด๋ฐ ๊ณ ํต์ ์ด๋ฏธ ๊ฒฝํํ์ต๋๋ค.
Fusion์ ์ด์ฉํ๋ฉด "Real-time User Interface"๋ฅผ ๊ตฌํํด์ผ ํ ๊ฐ๋ฐ์๊ฐ ์บ์ฑ
, ๋ฌดํจํ
, ์ต์ข
์ผ๊ด์ฑ
๊ด์ ์์ ์์
ํด์ผ ํ ์๋นํ ์ฝ๋ฉ๋์ ์ค์ฌ์ฃผ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. (์์ง ํ์
์ด ๋ ๋์ด์ ๊ฐ๋
์ ์ผ๋ก ์ ๊ทผ)
๋ถ์ฐ ์ปดํจํ ์๋น์ค, ํฌ๋ช ์ถ์ํ์ ํน์ง์ผ๋ก, SignalR ์์ด Fusion๋ง์ผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ํตํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํฌ๋ช ์ถ์ํ๋ก ์ธํด, ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
Fusion์ 2020๋
10์๋ถํฐ ์์๋ ์์ฃผ ๋ฐ๋ํ ํ๋ก์ ํธ ์
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ํ์ฝ๋๋ record
๋ฑ๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋์ด ์์ด์ C# 9์ ๋ฐฐ์ฐ๋๋ฐ ์ข์ ์ํ์ด ๋ฉ๋๋ค.
๋ค์์ ์จ๋ผ์ธ ์ํ์ ํตํด Fusion์ ๋ํด ์ข ๋ ์ ์ ์ ์์ต๋๋ค.
Stl.Samples.Blazor (servicetitan.com)
์ํ์์ Blazor Server ๋ฐ Webassembly ๋ชจ๋๋ฅผ ๋๋ค ์ง์ํ๋ค๋ ๊ฒ์ ์ธ์๊น์ต๋๋ค. Fusion์ ์ด์ฉํ ์ฝ๋๊ฐ Blazor ๋ชจ๋์ ์๊ด์์ด ๊ฑฐ์ ๊ฐ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ผ๋จ ์ฝ๋ ๊ฐ๊ฐ์ ๋๋ผ๊ธฐ ์ํด ๊ฐ๋จํ Blazor ์ฑ์ ๋ง๋ค๊ณ ์ ํฉ๋๋ค. ์ด ์ฑ์ ๊ธฐ๋ณธ ํ ํ๋ฆฟ์ผ๋ก ์๊ธฐ๋ ํด๋ฆญ์ ๊ณต์ ํ๋๊ฒ ๋ ํ ๋ฐ์, ๋ฌผ๋ก ์ํ์ ๋ณด๊ณ ๋ฐ๋ผํ ๊ฒ๋๋ค. ๊ทธ๋ฌ๋ฉด์ ์ตํ ๋ณด์ฃ
์ํ์ ์์น๋, ์ git clone์ผ๋ก ๋ด๋ ค๋ฐ์ ์ํ์ src/Blazor/HelloBlazorServer
์
๋๋ค
๋จผ์ NuGet ์ฐธ์กฐ๋ฅผ ๋ด ์๋ค.
๋จผ์ Blazor Server๋ก ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ต์ด ๊ธฐ๋ณธ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ ํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์น๋ธ๋ผ์ฐ์ ๋๊ฐ๋ก ๋์๋ณด๊ฒ ์ต๋๋ค.
์คํํด๋ณด๋ฉด ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์นด์ดํฐ๋ ์๋ก ๊ณต์ ๋์ง ์์ต๋๋ค. ์ค์๊ฐ์ฑ์ ๊ฐ์ง๋ ค๋ฉด ์ดํ๋ฉด์ผ๋ก ๊ฐ๋จํ ์ค๋ช ํด๋ณผ ๋,
์ผ์ชฝ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋น์ฐํ ์ผ์ชฝ์ ์นด์ดํธ๋ ์ฆ๊ฐํ ํ ๋ฐ, ์ค๋ฅธ์ชฝ ์ฐฝ์ผ๋ก ์ด ์ ๋ณด๋ฅผ ๋ณด๋ผ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์ฆ,
์ผ์ชฝ ๋ฒํผ์ ๋๋ฆ โ ์์ ์ ์นด์ดํธ๋ฅผ ์ฆ๊ฐํจ โ ์นด์ดํธ๊ฐ ์ฆ๊ฐํ์์ ๊ฐ์ ์ธ์ ์ ๊ตฌ์ฑ์์๊ฒ ์ ํํจ โ ๊ฐ์ ์ธ์ ์ ๋ค๋ฅธ ๊ตฌ์ฑ์์ด ๋ณ๊ฒฝ๋์์์ ์ธ์ํจ โ ์์ ์ ์นด์ดํธ๋ฅผ ๋ณ๊ฒฝ๋ ๊ฐ์ผ๋ก ๋๊ธฐํ ํจ
๋ญ ์ด๋ฐ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ค์๊ฐ ๋ณํ๋ฅผ ์ ์ฉํ๊ฒ ๋๋๋ฐ์, Fusion์ ์ด๋ป๊ฒ ์ด๋ฅผ ์ฒ๋ฆฌํ๋์ง ์ดํด๋ด ์๋ค.
NuGet์ ํตํด Stl.Fusion.Server
๋ฅผ ์ค์นํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ Startup.cs
์ Fusion
๊ด๋ จ ์ค์ ๋ค์ ํฉ๋๋ค.
public void ConfigureServices(IServiceCollection services)
{
...
// Fusion services
services.AddSingleton<IUpdateDelayer>(_ => new UpdateDelayer(0.5));
services.AddFusion(fusion => {
fusion.AddFusionTime(); // IFusionTime is one of built-in compute services you can use
});
// This method registers services marked with any of ServiceAttributeBase descendants, including:
// [Service], [ComputeService], [CommandService], [RestEaseReplicaService], etc.
services.UseAttributeScanner().AddServicesFrom(Assembly.GetExecutingAssembly());
...
๋๋จธ์ง๋ ๋์ผํ ๊ฒ ๊ฐ๊ตฐ์. ์ฌ๊ธฐ์ IUpdateDelayer
๋ ์์ ๋ ๋ด์ฉ์ ๋ช์ด๋ค์ ๋ฐ์ํ ์ง์ ๋ํ ์ฑ๊ธํค ์๋น์ค๋ฅผ ๋ฑ๋กํฉ๋๋ค. (์ด๊ฒ ์ด๋ค ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ฐ์๋๋์ง๋ ์์ง์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค)
๊ทธ๋ฆฌ๊ณ AddFusion()
์ ํตํด Fusion ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํ ์ ์๋๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ์ํ์๋ FusionTime
๊ธฐ๋ฅ์ ์ถ๊ฐํ์์ต๋๋ค. (๊ฐฑ์ ๋ ์๊ฐ ๊ธฐ์ค์ผ๋ก ์๊ฐ์ ์ธก์ ํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ณด์
๋๋ค.)
๊ทธ๋ฆฌ๊ณ UseAttributeScanner()
๋ Fusion์์ ์ฌ์ฉํ๋ Attribute
๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ์, AddServicesFrom()
์ ํตํด ํ์ฌ ์คํ ์ด์
๋ธ๋ฆฌ์์๋ง ์ฐพ๋ ์ฝ๋์
๋๋ค.
App.Razor๋ _Host.cshtml, ์ฌ์ง์ด MainLayout.razor๊น์ง ๋ฌ๋ผ์ง๋๊ฑด ์์ต๋๋ค.
๋จผ์ Counter.razor
๋ฅผ ์ดํด๋ณด์ฃ
Computed ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด Component๋ก๋ ์๋ฉ๋๋ค. ๊ทธ๋์ Fusion์์๋ ComputedStateComponent๋ฅผ ์ฌ์ฉํ๋๋ฐ์,
@inherits ComputedStateComponent<string>
Counter.razor
๋ฅผ ๋ ๋ณด๊ธฐ ์ ์ CounterService.cs
๋ฅผ ๋ด
์๋ค.
[ComputeService]
public class CounterService
{
private readonly object _lock = new object();
private int _count;
private DateTime _changeTime = DateTime.Now;
[ComputeMethod]
public virtual Task<(int, DateTime)> Get()
{
lock (_lock) {
return Task.FromResult((_count, _changeTime));
}
}
public Task Increment()
{
lock (_lock) {
++_count;
_changeTime = DateTime.Now;
}
using (Computed.Invalidate())
Get();
return Task.CompletedTask;
}
}
๋์ฌ๋์ด ํด๋น ํ์ด์ง์ ์ ์ํ์ ๋ CounterService์ ์ธ์คํด์ค๋ ์ด ๋ช๊ฐ์ผ๊น์? (์์ง ์ ๋ ์ ํํ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ฐ๋ ์์ผ๋ก๋ ํ๋์ฌ์ผ ํฉ๋๋ค)
ํ . ์ฝ๋๋ฅผ ํด์ํ๊ธฐ ์ํด ์กฐ๊ธ ๋ ํ์ต์ด ํ์ํฉ๋๋ค. ๋ค์์ ํํ ๋ฆฌ์ผ์ ๋ฐ๋ผ๊ฐ ๋ด ์๋ค.
Part 0: NuGet packages
Part 1: Compute Services
Part 2: Computed Values and IComputed<T>
Part 3: State: IState<T> and Its flavors
Part 4: Replica Services
Part 5: Caching and Fusion on Server-Side Only
Part 6: Real-time UI in Blazor Apps
Part 7: Real-time UI in JS / React Apps
Part 8: Scaling Fusion Services
Part 9: CommandR
Fusion์ ๊ณต๋ถํ๋ฉด์ ์ํ์ ๋ฐ๋ผ ํ๋๊ฒ ๋ง์ผ๋ก๋ Fusion์ ์ดํดํ๋๋ฐ ๋ถ์กฑํจ์ด ์์์ต๋๋ค. ๊ทธ๋์ ์ ๊ณตํ๋ ํํ ๋ฆฌ์ผ์ ๋ฐ๋ผ๊ฐ๊ฒ ๋์์ต๋๋ค.
Fusion์ด ์ ๊ณตํ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ค์์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ Compute Service๋ก ์์ฐ์ค๋ฝ๊ฒ ๊ตฌํํ ์ ์๋ ์บ์ฑ
๊ธฐ๋ฅ์
๋๋ค.
์ผ๋ฐ์ ์ธ ์บ์ฑ์ ์์๊ฐ ๋ฌดํจํ(๋ค์ ๊ณ์ฐ๋์ด์ผ ํ )๊ฐ ๋์์ ๋ ์บ์ฑ ํธ๋ฆฌ๋ฅผ ๋ค์ ๊ณ์ฐํฉ๋๋ค. ์ด ์ ๋ต์ ์์ ๊ท๋ชจ์ ์๋น์ค์์๋ ์ ๋์ํ์ง๋ง ์ฌ์ฉ์๊ฐ ๋ง์์ง๊ฑฐ๋ ๊ท๋ชจ๊ฐ ํฐ ์๋น์ค์์๋ ๊ทธ๋ฆฌ ํจ์จ์ ์ด์ง ๋ชปํฉ๋๋ค. ๊ทธ๋์ Fusion์ ๋ฐ๋์ ์ ๋ต์ ์ ํํ์ต๋๋ค.
์ ์ฒด๋ฅผ ์บ์ฑํ๋, ์์์ ๋ฌดํจํ๊ฐ ๋ฐ์ํ๋๋ผ๋, ์ ์ฒด๋ฅผ ๋ค์ ๊ณ์ฐํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ํฐ ๊ท๋ชจ์ ์๋น์ค์์ ํ์๋ก ํ๋ ์บ์ฑ
์์ ์ ์ฉํ๋ฐ, ์บ์ฑ ํธ๋ฆฌ ์์์ ๋ฌดํจํ๊ฐ ๋น๋ฒํ ๋ฐ์ํ ์ฌ์ง๊ฐ ์๋นํ๊ธฐ ๋๋ฌธ์
๋๋ค.
Fusion์ Console ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ์บ์ฑ
๊ธฐ๋ฅ์ ํ
์คํธ ํด ๋ณผ ์ ์์ต๋๋ค.
.NET 5 ์์ ํ ์คํธ ํ์ต๋๋ค.
dotnet new console
Install-Package Stl.Fusion
์ฃผ์์ ํ๊ณ ํ๋ฉด์ ๋์์ ํ์ธํด๋ณด์์ฃ !
using Microsoft.Extensions.DependencyInjection;
using Stl.Async;
using Stl.DependencyInjection;
using Stl.Fusion;
using System;
using System.Collections.Concurrent;
using System.Reflection;
using System.Threading.Tasks;
using static System.Console;
var counters = CreateServices().GetRequiredService<CounterService>();
for (var i = 0; i < 5; i++)
WriteLine(await counters.Get("a"));
counters.Increment("a");
for (var i = 0; i < 5; i++)
WriteLine(await counters.Get("a"));
//var services = CreateServices();
//var counterSum = services.GetRequiredService<CounterSumService>();
//WriteLine(await counterSum.Sum("a", "b"));
//WriteLine(await counterSum.Sum("a", "b"));
//var services = CreateServices();
//var counterSum = services.GetRequiredService<CounterSumService>();
//WriteLine("Nothing is cached (yet):");
//WriteLine(await counterSum.Sum("a", "b"));
//WriteLine("Only GetAsync(a) and GetAsync(b) outputs are cached:");
//WriteLine(await counterSum.Sum("b", "a"));
//WriteLine("Everything is cached:");
//WriteLine(await counterSum.Sum("a", "b"));
//var services = CreateServices();
//var counters = services.GetRequiredService<CounterService>();
//var counterSum = services.GetRequiredService<CounterSumService>();
//WriteLine(await counterSum.Sum("a", "b"));
//counters.Increment("a");
//WriteLine(await counterSum.Sum("a", "b"));
static IServiceProvider CreateServices()
{
var services = new ServiceCollection();
services.AddFusion();
services.UseAttributeScanner().AddServicesFrom(Assembly.GetExecutingAssembly());
return services.BuildServiceProvider();
}
[ComputeService]
public class CounterService
{
private readonly ConcurrentDictionary<string, int> counters = new();
[ComputeMethod]
public virtual async Task<int> Get(string key)
{
WriteLine($"{nameof(Get)}({key})");
await Task.Delay(500);
return counters.TryGetValue(key, out var value) ? value : 0;
}
public void Increment(string key)
{
WriteLine($"{nameof(Increment)}({key})");
counters.AddOrUpdate(key, k => 1, (k, v) => v + 1);
using (Computed.Invalidate())
{
Get(key).Ignore();
}
}
}
[ComputeService]
public class CounterSumService
{
public CounterService Counters { get; }
public CounterSumService(CounterService counters) => Counters = counters;
[ComputeMethod]
public virtual async Task<int> Sum(string key1, string key2)
{
WriteLine($"{nameof(Sum)}({key1}, {key2})");
return await Counters.Get(key1) + await Counters.Get(key2);
}
}
์์ ์์ค์ฝ๋๋ฅผ ๊ฐ๋จํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
ComputeServiceAttribute
์ ์ํด CounterServer๋ Compute Service
๊ฐ ๋ฉ๋๋ค.ComputeMethodAttribute
์ ์ํด Get()
๋ฉ์๋๋ Compute Method
๊ฐ ๋ฉ๋๋ค.virtual async Task<TResult> MethodName(params1, params2, ...)
ํํ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
IComputed<TResult>
์ํ๋ฅผ ๊ฐ์ง๊ฒ ๋๊ณ , ์ด๊ฒ์ ํตํด ์บ์ฑ
์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.์บ์ฑ
๊ธฐ์ค(Key)์ ๋ฉ์๋์ ๋ณด, ์ธ์คํด์ค, ์ธ์๊ฐ ๋ฉ๋๋ค.virtual
ํค์๋๊ฐ ์์ด์ผ ํฉ๋๋ค.Get()
๋ฉ์๋๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ์ํ์ ์๋ฎฌ๋ ์ด์
ํ๊ธฐ ์ํด Task.Delay(500)
์ผ๋ก 0.5์ด ๋๋ ์ด๋ฅผ ์ฃผ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Get(a)
0
0
0
0
0
Increment(a)
Get(a)
1
1
1
1
1
์ด๊ฒ์ ์๋ฏธ๋ ๋ฌด์์ผ๊น์? ์ต์ด ๊ฐ์ด ๊ณ์ฐ๋ ํ ์ดํ ์บ์ฑ๋ ๊ฐ์ ๋ฐ๋ก ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. (0.5์ด์ ์ฒ๋ฆฌ ์์์๊ฐ์ด ์บ์ฑ์ ํตํด ์์ด์ก์ต๋๋ค!)
๊ทธ๋ฐ๋ฐ, ๋ฐํํด์ผ ํ ๊ฐ์ Increment()
๋ฉ์๋์ ์ํด ์ํฅ์ ๋ฐ๊ฒ ๋๋๋ฐ์, Fusion์์๋ ๋ช
์์ ์ผ๋ก ๋ฌดํจํ ์ฝ๋๋ฅผ using (Computed.Invalidate()) { ... }
๋ธ๋ญ ์์์ ํ๋ฒ์ ํธ์ถํ๋๊ฒ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. (Ignore()๋ ์ปดํ์ผ ๊ฒฝ๊ณ ๋ฅผ ์์ ๊ธฐ ์ํ Fusion์์ ์ ๊ณตํ๋ ์ผ์ข
์ ๋ฐฉํธ์
๋๋ค.)
Fusion์ ์ด ๋ธ๋ญ(ComputeContextScope)์ Compute Method
๋ฅผ ๋ฌดํจํ ํฉ๋๋ค.
๋๋ฒ์งธ Compute Service
์ธ CounterSumService
๋ฅผ ๋ณผ๊น์?
Fusion์ DependencyInjection
์ ํตํด ์์ฑ์ธ์๋ก ๋ค๋ฅธ Compute Service
์ธ์คํด์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค. (์ด ์ฆ์๋ถํฐ Compute Service๋ ์ฑ๊ธํค ์ธ์คํด์ค์์ด ์๋ช
ํด์ง๋๋ค)
๊ทธ๋ฆฌ๊ณ ComputeAttribute
๋ฅผ ํตํด Compute Method
์กฐํฉ์ผ๋ก ์๋ก์ด Compute Method๋ฅผ ๋ง๋ค ์ ์๋๋ก ๋์์ธ ๋์์ต๋๋ค. (์ด๋์๋ ๋์ผํ ์บ์ฑ ๊ธฐ์ค(Key)๋ ๋ฉ์๋์ ๋ณด, ์ธ์คํด์ค, ์ธ์๊ฐ ๋ฉ๋๋ค)
์ฆ, ์ธ์ (โaโ, โbโ)์ (โbโ, โaโ)๋ ๋ค๋ฅธ ์บ์ฑ ๋์์ด ๋ฉ๋๋ค.
์ฝ๋ ์ฃผ์์ ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณผ๊น์?
Nothing is cached (yet):
Sum(a, b)
Get(a)
Get(b)
0
Only GetAsync(a) and GetAsync(b) outputs are cached:
Sum(b, a)
0
Everything is cached:
0
์คํํด๋ณด์๊ณ ๊ทธ ์๋ฏธ๊ฐ ์ดํด๋๋ค๋ฉด, Fusion์์ ์ ๊ณตํ๋ ์บ์ฑ ๊ธฐ๋ฅ์ ๋ง๊ฐํจ์ ๋๋ ์ ์๊ณ Service-Client ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๋ค์ํ ์์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ผ์ค ์ ์์ต๋๋ค.
๋จ์ง ์บ์ฑ
๋ถ๋ถ๋ง ๋ถ์ํ์ ๋ฟ์ธ๋ฐ, ๋ค๋ฅธ ์ฌ๋ฌ ๊ตต์งํ ๊ธฐ๋ฅ๊น์ง ํด์ 2020๋
10์๋ถํฐ ์์ํ ํ๋ก์ ํธ๋ผ๋๊ฒ ๋ฏฟ๊ฒจ์ง์ง๊ฐ ์๋๊ตฐ์!
ํํ ๋ฆฌ์ผ์ ์ข ๋ ์์ธํ ๋ด์ฉ์ด ์์ผ๋ Compute Services
๋ฐ Computed Values and IComputed<T>
๋ฅผ ์์ธํ ๋ณผ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ค์์ผ๋ก State
์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
ํํ ๋ฆฌ์ผ์ ์ํด Fusion์ ๋๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ ๋ํด ์ด์ ์๊ฒ ๋์๋๋ฐ์,
Compute Service
์ ์๋น์ค์ ์กฐํฉ์ ํตํด ํ๋ฒ๋ง ๊ณ์ฐํ๋ฉด ์กฐํฉ๋ ๊ฐ ์ค์ ํ๋๊ฐ ๋ฌดํจํ๊ฐ ๋ ๋๊น์ง ๊ณ์ ์บ์ฑ๋๋ค๋ ๊ฒ์ ์ ์ ์๊ณ ์,์ด์ IState<T>
์ ๋ํด ์ ํ์๊ฐ ์๋๋ฐ์, IState<T>
๋ ์ฆ โ์ํโ ์
๋๋ค.
Fusion์์ ๊ณ์ฐ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ณ์ฐ๋์์ผ๋ฏ๋ก ๋ฌดํจํ ๋ ๋๊น์ง "๋ถ๋ณ์ฑ"์ ๊ฐ์ง๋๋ค.
IState<T>
๋ ์ต์ ๋ฒ์ ผ์ โ์ถ์ โ ํฉ๋๋ค. ์ด์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ ์ ํ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋ง๋ Stl.Fusion์ ์ฌ์ฉ์๊ฐ ํ๊ตญ์ ์ ๋ฐ์ ์์ ์๋ ์๊ฒ ์ต๋๋ค ^^;
Stl.Fusion์ ์ดํดํ๊ณ ์ฐ๊ธฐ์๋ ๋ฌ๋์ปค๋ธ๊ฐ ์๋ ์ค์๊ฐ ์๋น์ค๋ฅผ ๋ง๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋๋ค. ํนํ๋ ๋ง๋์ ๋ถ์ ๊ฐ์ด๋ ๋ฌธ์๊ฐ ๋๋ต ์ดํด์ํค๊ณ ๋ฐ๋ก ์ธ ์ ์๋๋ก
์ ๊ด์ ์ด ์๋๋ผ ๊น๊ฒ ์ดํดํ๊ณ ํ์ฉํ ์ ์๋๋ก
ํ๋ ๋ฌธ์๋ผ ์ค์๊ฐ ์ฑ์ ๋ง๋ค์ด๋ณธ ๊ฒฝํ์ด ์์ ๊ฒฝ์ฐ ๋๋ ค ์๋นํ ๋ํดํ๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋์ ์ ๋ ์ฌ๋ฌ๋ถ์๊ฒ Stl.Fusion์ ์ฌ์ฉํด์ ASP.NET Core Web API + ์ํผ์ผ๋ก ์ฑํ ํ๋ก๊ทธ๋จ ๊ฐ๋จํ ๋ง๋ค์ด์ ์๊ฐํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
Stl.Fusion์ผ๋ก ๊ฐ๋จํ ๋ง๋ ํจ์ ์ฑ
๊ด๋ จ ๋ธ๋ก๊ทธ๋ ๊ณง ๊ณต์ ํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค;;
๋ค์์ Uno๋ฅผ ์ด์ฉํด ๋ค์ํ ํ๋ซํผ์ ์ฑ์ผ๋ก (Webasembly ํฌํจ!) ์บ ํผ์ค๋ฅผ ๊ณต์ ํด ๊ฐ์ด ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ์์ ๋ฅผ ์งํํด๋ณด๊ฒ ์ต๋๋ค.