์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๊น?
์น์ฌ์ดํธ๋ ๋ฐฑ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋๋ถ๋ถ์ ์ ์ ์ ์ธ ์ฌ๋๋ค์ด ๊ฐ์ฅ ๋จผ์ ์ํ๋ ๊ฒ์ SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ก๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด SQL์ ์ ํฉํ์ง ์๋ค๋ ์๊ฐ์ด ๋ ์ค๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒ์ ๋๋ ์์ ๊ทธ๋ํ๋ฅผ ์์ฑํ ๋ ๊ฐ์ฒด ๊ฐ์ ๋ณต์กํ ๊ด๊ณ๋ฅผ ๊ฒ์ํด์ผ ํฉ๋๋ค.
์ต์ ์ ์ํฉ์ ํ์ผ๋ก ์์ ํ๊ณ ๋๋ฃ๊ฐ ๋น ๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์ ๋๋ค. ๋ฉ์ธ ํ์ด์ง์ SELECT๊ฐ ํฉ๋ฆฌ์ ์ธ ์๊ฐ ๋ด์ ์๋ฃ๋๋๋ก N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ๊ฐ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ผ๋ง๋ ๋ง์ ์๊ฐ์ ์๋นํ์ จ๋์?
๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ์ ๊ทผ ๋ฐฉ์์ NoSQL์ ๋๋ค. ๋ช ๋ ์ ์๋ ์ด ์ฃผ์ ์ ๋ํด ๋ง์ ๊ณผ์ฅ๋ ์ด์ผ๊ธฐ๊ฐ ์์์ต๋๋ค. ํธ๋ฆฌํ ๊ฒฝ์ฐ๋ฅผ ์ํด MongoDB๋ฅผ ๋ฐฐํฌํ๊ณ json ๋ฌธ์ ํ์์ ๋ต๋ณ์ ๋ง์กฑํ์ต๋๋ค. (๊ทธ๋ฐ๋ฐ ๋ฌธ์์ ์ํ๋งํฌ๊ฐ ์์ด์ ๋ชฉ๋ฐ์ ๋ช ๊ฐ๋ ๊ฝ์์ผ ํ๋?).
๋ค๋ฅธ ๋์ฒด ๋ฐฉ๋ฒ์ ์๋ํด ๋ณผ ๊ฒ์ ์ ์ํฉ๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ ์ฅ์(ํ์ผ, ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ์ ์ฅํด ๋ณด๋ ๊ฒ์ ์ด๋จ๊น์?
๋ฉ๋ชจ๋ฆฌ๋ ์ ๋ ดํด์ก์ผ๋ฉฐ ๋๋ถ๋ถ์ ์ค์ ๊ท๋ชจ ํ๋ก์ ํธ์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ 1GB ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๊ฐ๋๋ค. (์๋ฅผ ๋ค์ด, ์ ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ํ ํ๋ก์ ํธ๋
์ฅ์ :
- ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๊ฐ ๋ ์ฌ์์ง๋๋ค. ์ฟผ๋ฆฌ, ์ง์ฐ ๋ก๋ฉ, ORM ๊ธฐ๋ฅ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ผ๋ฉฐ ์ผ๋ฐ C# ๊ฐ์ฒด๋ก ์์ ํ ์ ์์ต๋๋ค.
- ๋ค๋ฅธ ์ค๋ ๋์์์ ์ก์ธ์ค์ ๊ด๋ จ๋ ๋ฌธ์ ๋ ์์ต๋๋ค.
- ๋งค์ฐ ๋น ๋ฆ ๋๋ค - ๋คํธ์ํฌ ์์ฒญ์ด ์๊ณ , ์ฝ๋๋ฅผ ์ฟผ๋ฆฌ ์ธ์ด๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๊ฐ์ฒด๋ฅผ (์ญ)์ง๋ ฌํํ ํ์๋ ์์ต๋๋ค.
- ๋์คํฌ์ XML, SQL Server, Azure Table Storage ๋ฑ ์ด๋ค ํ์์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
๋จ์ :
- ์ํ์ ํ์ฅ์ด ์์ค๋๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋ ์ค์ง ์๊ฐ์ด ์๋ ๋ฐฐํฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํ๋ฉด ๋ถ๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์์ค๋ ์ ์์ต๋๋ค. (ํ์ง๋ง ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฐ์ฝ ์ถฉ๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ ์ฃ ?)
์ด๋ป๊ฒ ์๋ํฉ๋๊น?
์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฒ์์๋ ๋ฐ์ดํฐ ์ ์ฅ์์ ์ฐ๊ฒฐ์ด ์ค์ ๋๊ณ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ฉ๋๋ค.
- ๊ฐ์ฒด ๋ชจ๋ธ, ๊ธฐ๋ณธ ์ธ๋ฑ์ค ๋ฐ ๊ด๊ณํ ์ธ๋ฑ์ค(1:1, 1:๋ค)๊ฐ ๊ตฌ์ถ๋ฉ๋๋ค.
- ๊ฐ์ฒด ์์ฑ ๋ณ๊ฒฝ(INotifyPropertyChanged) ๋ฐ ์ปฌ๋ ์ ์ ์์ ์ถ๊ฐ ๋๋ ์ ๊ฑฐ(INotifyCollectionChanged)์ ๋ํ ๊ตฌ๋ ์ด ์์ฑ๋ฉ๋๋ค.
- ๊ตฌ๋ ์ด ํธ๋ฆฌ๊ฑฐ๋๋ฉด ๋ณ๊ฒฝ๋ ๊ฐ์ฒด๊ฐ ๋ฐ์ดํฐ ์ ์ฅ์์ ์ฐ๊ธฐ ์ํด ํ์ ์ถ๊ฐ๋ฉ๋๋ค.
- ์ ์ฅ์์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ ์ฃผ๊ธฐ์ ์ผ๋ก(ํ์ด๋จธ์ ๋ฐ๋ผ) ์ ์ฅ๋ฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ๋ ์ ์ฅ์์ ์ ์ฅ๋ฉ๋๋ค.
์ฝ๋ ์
ํ์ํ ์ข ์์ฑ ์ถ๊ฐ
// ะัะฝะพะฒะฝะฐั ะฑะธะฑะปะธะพัะตะบะฐ
Install-Package OutCode.EscapeTeams.ObjectRepository
// ะฅัะฐะฝะธะปะธัะต ะดะฐะฝะฝัั
, ะฒ ะบะพัะพัะพะผ ะฑัะดัั ัะพั
ัะฐะฝััััั ะธะทะผะตะฝะตะฝะธั
// ะัะฟะพะปัะทัะนัะต ัะพ, ะบะพัะพััะผ ะฑัะดะตัะต ะฟะพะปัะทะพะฒะฐัััั.
Install-Package OutCode.EscapeTeams.ObjectRepository.File
Install-Package OutCode.EscapeTeams.ObjectRepository.LiteDb
Install-Package OutCode.EscapeTeams.ObjectRepository.AzureTableStorage
// ะะฟัะธะพะฝะฐะปัะฝะพ - ะตัะปะธ ะฝัะถะฝะพ ั
ัะฐะฝะธัั ะผะพะดะตะปั ะดะฐะฝะฝัั
ะดะปั Hangfire
// Install-Package OutCode.EscapeTeams.ObjectRepository.Hangfire
์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ค๋ช ํฉ๋๋ค.
public class ParentEntity : BaseEntity
{
public ParentEntity(Guid id) => Id = id;
}
public class ChildEntity : BaseEntity
{
public ChildEntity(Guid id) => Id = id;
public Guid ParentId { get; set; }
public string Value { get; set; }
}
๊ทธ๋ฐ ๋ค์ ๊ฐ์ฒด ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class ParentModel : ModelBase
{
public ParentModel(ParentEntity entity)
{
Entity = entity;
}
public ParentModel()
{
Entity = new ParentEntity(Guid.NewGuid());
}
public Guid? NullableId => null;
// ะัะธะผะตั ัะฒัะทะธ 1:Many
public IEnumerable<ChildModel> Children => Multiple<ChildModel>(x => x.ParentId);
protected override BaseEntity Entity { get; }
}
public class ChildModel : ModelBase
{
private ChildEntity _childEntity;
public ChildModel(ChildEntity entity)
{
_childEntity = entity;
}
public ChildModel()
{
_childEntity = new ChildEntity(Guid.NewGuid());
}
public Guid ParentId
{
get => _childEntity.ParentId;
set => UpdateProperty(() => _childEntity.ParentId, value);
}
public string Value
{
get => _childEntity.Value;
set => UpdateProperty(() => _childEntity.Value, value
}
// ะะพัััะฟ ั ะฟะพะธัะบะพะผ ะฟะพ ะธะฝะดะตะบัั
public ParentModel Parent => Single<ParentModel>(ParentId);
protected override BaseEntity Entity => _childEntity;
}
๋ง์ง๋ง์ผ๋ก ๋ฐ์ดํฐ ์ก์ธ์ค๋ฅผ ์ํ ์ ์ฅ์ ํด๋์ค ์์ฒด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class MyObjectRepository : ObjectRepositoryBase
{
public MyObjectRepository(IStorage storage) : base(storage, NullLogger.Instance)
{
IsReadOnly = true; // ะะปั ัะตััะพะฒ, ะฟะพะทะฒะพะปัะตั ะฝะต ัะพั
ัะฐะฝััั ะธะทะผะตะฝะตะฝะธั ะฒ ะฑะฐะทั
AddType((ParentEntity x) => new ParentModel(x));
AddType((ChildEntity x) => new ChildModel(x));
// ะัะปะธ ะธัะฟะพะปัะทัะตััั Hangfire ะธ ะฝะตะพะฑั
ะพะดะธะผะพ ั
ัะฐะฝะธัั ะผะพะดะตะปั ะดะฐะฝะฝัั
ะดะปั Hangfire ะฒ ObjectRepository
// this.RegisterHangfireScheme();
Initialize();
}
}
ObjectRepository ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
var memory = new MemoryStream();
var db = new LiteDatabase(memory);
var dbStorage = new LiteDbStorage(db);
var repository = new MyObjectRepository(dbStorage);
await repository.WaitForInitialize();
ํ๋ก์ ํธ๊ฐ HangFire๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
public void ConfigureServices(IServiceCollection services, ObjectRepository objectRepository)
{
services.AddHangfire(s => s.UseHangfireStorage(objectRepository));
}
์ ๊ฐ์ฒด ์ฝ์ :
var newParent = new ParentModel()
repository.Add(newParent);
์ด ํธ์ถ์ ํตํด ๊ฐ์ฒด๋ ์์ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ธฐ ์ํด ๋ก์ปฌ ์บ์์ ํ ๋ชจ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด ์์ ์๋ O(1)์ด ์์๋๋ฉฐ ์ด ๊ฐ์ฒด๋ฅผ ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ์ฅ์์์ ์ด ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ ์ธ์คํด์ค์ธ์ง ํ์ธํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));
๋ฌด์จ ์ผ์ด์ผ? ์ธํธ () ๋ฐํ ํ ์ด๋ธ์ฌ์ , ํฌํจํ๋ ๋์์ฌ์ ๊ธฐ๋ณธ ๋ฐ ๋ณด์กฐ ์ธ๋ฑ์ค์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์์ ํ ๋ฐ๋ณตํ์ง ์๊ณ ๋ ID(๋๋ ๊ธฐํ ์์์ ์ฌ์ฉ์ ์ธ๋ฑ์ค)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ๋ ๊ฐ์ฒด ๋ฆฌํฌ์งํ ๋ฆฌ ์์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๊ตฌ๋
์ด ์ถ๊ฐ๋๋ฏ๋ก ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด ๊ฐ์ฒด๋ ์ฐ๊ธฐ ๋๊ธฐ์ด์ ์ถ๊ฐ๋ฉ๋๋ค.
์ธ๋ถ์์ ์์ฑ์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ POCO ๊ฐ์ฒด๋ก ์์
ํ๋ ๊ฒ๊ณผ ๋์ผํด ๋ณด์
๋๋ค.
myParent.Children.First().Property = "Updated value";
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());
๊ทธ๋ฌ๋ฉด ๊ฐ์ฒด๊ฐ ์ญ์ ๋๊ธฐ์ด์๋ ์ถ๊ฐ๋ฉ๋๋ค.
์ ์ฅ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์?
๊ฐ์ฒด ๋ฆฌํฌ์งํ ๋ฆฌ ๋ชจ๋ํฐ๋ง๋๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ฉด(์์ฑ ์ถ๊ฐ, ์ญ์ ๋๋ ๋ณ๊ฒฝ) ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ชจ๋ธ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค.๊ตฌ๋ ํ๋ค I์ ์ฅ. ๊ตฌํ I์ ์ฅ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ชจ๋ธ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ถ๊ฐ, ์ ๋ฐ์ดํธ, ์ญ์ ๋ฑ 3๊ฐ์ ๋๊ธฐ์ด์ ์ ์ฅ๋ฉ๋๋ค.
๋ํ ๊ตฌํ I์ ์ฅ ์ด๊ธฐํ ์ ๋ณ๊ฒฝ ์ฌํญ์ด 5์ด๋ง๋ค ์ ์ฅ๋๋๋ก ํ๋ ํ์ด๋จธ๋ฅผ ์์ฑํฉ๋๋ค.
๋ํ ์ ์ฅ ํธ์ถ์ ๊ฐ์ ํ๋ API๋ ์์ต๋๋ค. ๊ฐ์ฒด์ ์ฅ์.์ ์ฅ().
๊ฐ ์ ์ฅ ์ ์ ๋จผ์ ์๋ฏธ ์๋ ์์ ์ด ๋๊ธฐ์ด์์ ์ ๊ฑฐ๋๊ณ (์: ์ค๋ณต ์ด๋ฒคํธ - ๊ฐ์ฒด๊ฐ ๋ ๋ฒ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ๋น ๋ฅด๊ฒ ์ถ๊ฐ/์ ๊ฑฐ๋ ๊ฒฝ์ฐ) ๊ทธ๋ฐ ๋ค์ ์ ์ฅ ์์ฒด๋ง ์ํ๋ฉ๋๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์ฒด ํ์ฌ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ฏ๋ก ๊ฐ์ฒด๊ฐ ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ์์ ๋ณด๋ค ์ต์ ๋ฒ์ ์ ๊ฐ์ฒด๋ฅผ ํฌํจํ์ฌ ๋ณ๊ฒฝ๋ ์์์ ๋ค๋ฅธ ์์๋ก ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ์ ์์ต๋๋ค.
๋ ๋ฌด์์ด ์๋์?
- ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ .NET Standard 2.0์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ชจ๋ ์ต์ .NET ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- API๋ ์ค๋ ๋๋ก๋ถํฐ ์์ ํฉ๋๋ค. ๋ด๋ถ ์ปฌ๋ ์
์ ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค. ๋์์ฌ์ , ์ด๋ฒคํธ ํธ๋ค๋ฌ์๋ ์ ๊ธ์ด ์๊ฑฐ๋ ํ์ํ์ง ์์ต๋๋ค.
๊ธฐ์ตํ ๊ฐ์น๊ฐ ์๋ ์ ์ผํ ๊ฒ์ ์ ํํ๋ ๊ฒ์ ๋๋ค ObjectRepository.Save(); - ์์ ์ธ๋ฑ์ค(๊ณ ์ ์ฑ ํ์):
repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");
๋๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํฉ๋๊น?
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ์ทจ๋ฏธ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค. ์๋ํ๋ฉด ํธ๋ฆฌํ๊ณ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ์์ฑํ๊ฑฐ๋ ๋ฌด๊ฑฐ์ด ์ธํ๋ผ๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ ํฐ ๋น์ฉ์ด ๋ค์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ ์ผ๋ฐ์ ์ผ๋ก litdb๋ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
ํ์ง๋ง ๊ณผ๊ฑฐ์๋ ์ง๊ธ์ ์์ด์ง ์คํํธ์ ์ธ EscapeTeams(์ฌ๊ธฐ์ ๋์ด ์๋ค๊ณ ์๊ฐํ๋๋ฐ ์๋, ๋ค์ ๊ฒฝํํด ๋ณด์ธ์) - Azure Table Storage์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์์ผ๋ก์ ๊ณํ
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ๋จ์ ์ค ํ๋์ธ ์ํ ํ์ฅ์ ์์ ํ๊ณ ์ถ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ถ์ฐ ํธ๋์ญ์ (sic!)์ด ํ์ํ๊ฑฐ๋, ๋ค๋ฅธ ์ธ์คํด์ค์ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ด์๋ ์ ๋๋ค๋ ๊ฐ๋ ฅํ ์์ง์ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฑฐ๋, "๋ง์ง๋ง ์ฌ๋์ด ์ณ๋ค"๋ ์์น์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋๋ก ํด์ผ ํฉ๋๋ค.
๊ธฐ์ ์ ๊ด์ ์์ ๋ณผ ๋ ๊ฐ๋ฅํ ๋ค์ ๊ตฌ์ฑํ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ๊ฐ์ฒด ๋ชจ๋ธ ๋์ EventLog ๋ฐ Snapshot ์ ์ฅ
- ๋ค๋ฅธ ์ธ์คํด์ค ์ฐพ๊ธฐ(๋ชจ๋ ์ธ์คํด์ค์ ์๋ํฌ์ธํธ๋ฅผ ์ค์ ? udp ๊ฒ์? ๋ง์คํฐ/์ฌ๋ ์ด๋ธ?์ ์ถ๊ฐ)
- RAFT์ ๊ฐ์ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด EventLog ์ธ์คํด์ค ๊ฐ ๋ณต์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ ๊ฐ ๊ฑฑ์ ํ๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์์ต๋๋ค. ๊ณ๋จ์ ์ญ์ ๋๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋งํฌ๊ฐ ์๋ ๊ฐ์ฒด ์ญ์ ์ฌ๋ก ๊ฐ์ง์ ๋๋ค.
์์ค ์ฝ๋
์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ด์ ๋จ์ ๊ฒ์ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ๋ฟ์
๋๋ค. ์ฝ๋๋ GitHub์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com