데이터 지속성 관리

이 μ„Ήμ…˜μ—μ„œλŠ” Linoκ°€ Entity Framework Coreλ₯Ό μ–΄λ–»κ²Œ κ΅¬μ„±ν•˜μ—¬ 도메인 계측이 μ™„μ „νžˆ 격리된 μƒνƒœλ‘œ μœ μ§€λ˜κ³  λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν”„λ‘œμ„ΈμŠ€κ°€ 예츑 κ°€λŠ₯ν•˜λ©° μ œμ–΄λ˜λŠ”μ§€ 배우게 λ©λ‹ˆλ‹€ β€” 전톡적인 λͺ¨λ†€λ¦¬μ‹ μ„œλΉ„μŠ€λ“  λͺ¨λ“ˆμ‹ μ„œλΉ„μŠ€λ“  μƒκ΄€μ—†μŠ΅λ‹ˆλ‹€.


lino new service λͺ…λ Ήμ–΄λ‘œ μ„œλΉ„μŠ€λ₯Ό 생성할 λ•Œ CLIλŠ” 두 κ°€μ§€ μ€‘μš”ν•œ 결정을 μš”μ²­ν•©λ‹ˆλ‹€:

  • μ•„ν‚€ν…μ²˜ β€” 전톡적인 μ„œλΉ„μŠ€ λ˜λŠ” λͺ¨λ“ˆν˜• μ„œλΉ„μŠ€.
  • 데이터 κ³΅κΈ‰μž β€” SqlServer λ˜λŠ” PostgreSql (ν–₯ν›„ λ²„μ „μ—μ„œ λ‹€λ₯Έ κ³΅κΈ‰μžκ°€ 좔가될 μ˜ˆμ •μž…λ‹ˆλ‹€).

전톡적인(λͺ¨λ†€λ¦¬μ‹) μ„œλΉ„μŠ€λ‚˜ λͺ¨λ“ˆν˜•(λͺ¨λ†€λ¦¬μ‹ λͺ¨λ“ˆ) μ„œλΉ„μŠ€ λͺ¨λ‘ μ„œλΉ„μŠ€λ‹Ή 단일 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ¨λ“ˆν˜• μ„œλΉ„μŠ€μ—μ„œλŠ” 각 λͺ¨λ“ˆμ΄ λ™μΌν•œ λ°μ΄ν„°λ² μ΄μŠ€ λ‚΄μ˜ 별도 μŠ€ν‚€λ§ˆμ— λ§€ν•‘λ©λ‹ˆλ‹€. μ΄λŠ” 각 bounded contextκ°€ λ³„λ„μ˜ 논리적 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μœ μ§€ν•˜μ—¬ κΈ°λŠ₯적 격리, 독립적 버전 관리 및 더 쑰직적이고 μ•ˆμ „ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ 보μž₯ν•©λ‹ˆλ‹€.

μ—”ν„°ν‹° νƒ€μž… ꡬ성

LinoλŠ” Persistence‑Ignorant 원칙을 λ”°λ¦…λ‹ˆλ‹€: 도메인 μ—”ν„°ν‹°λŠ” 인프라 μ„ΈλΆ€ 사항을 μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ λͺ¨λ“  ORM 맀핑은 IEntityTypeConfiguration<T>λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ— μœ„μΉ˜ν•˜λ©°, Configurations/<EntityName>Configuration.cs에 μ €μž₯λ©λ‹ˆλ‹€.

  • 각 μ—”ν„°ν‹°λŠ” μ „μš© ꡬ성 νŒŒμΌμ„ κ°€μ§‘λ‹ˆλ‹€.
  • μ „μ—­ κ·œμΉ™(예: decimal(18,2), μ •λ ¬, DateTime을 utc둜 μ§€μ •)은 ModelConfiguration에 쀑앙 집쀑화할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ꡬ성은 DbContext의 OnModelCreatingμ—μ„œ modelBuilder.ApplyConfigurationsFromAssembly(...)λ₯Ό 톡해 μ μš©λ©λ‹ˆλ‹€.

DbContexts

DbContextλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΈλžœμž­μ…˜ λ‹¨μœ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. LinoλŠ” μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€:

  • 전톡적인 μ„œλΉ„μŠ€ β€” λͺ¨λ“  DbSet<TEntity>λ₯Ό ν¬ν•¨ν•˜λŠ” 단일 AppDbContext.
  • λͺ¨λ“ˆν˜• μ„œλΉ„μŠ€ β€” 각 bounded contextλ§ˆλ‹€ λ³„λ„μ˜ <Module>DbContext. μ΄λ ‡κ²Œ ν•˜λ©΄ 각 λͺ¨λ“ˆμ΄ 더 λΉ λ₯΄κ²Œ 컴파일되고, λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 사이클이 μ§§μ•„μ§€λ©°, 병합 좩돌 μœ„ν—˜μ΄ μ€„μ–΄λ“­λ‹ˆλ‹€.

λͺ¨λ“  DbContextλŠ” <Module>/Infrastructure.Persistence에 λ“±λ‘λ˜κ³ , IUnitOfWorkλ₯Ό 톡해 λ…ΈμΆœλ˜λ©°, dependency injection으둜 ν•΄κ²°λ©λ‹ˆλ‹€.

λ ˆν¬μ§€ν† λ¦¬

ꡬ체적인 λ ˆν¬μ§€ν† λ¦¬λŠ” <Module>/Infrastructure.Persistence.Repositories에 μœ„μΉ˜ν•˜λ©° <Module>/Domain.Repositories λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ •μ˜λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. 각 λ ˆν¬μ§€ν† λ¦¬λŠ”:

  • λ³΅μž‘ν•œ 쿼리(LINQ, FromSql, DTO ν”„λ‘œμ μ…˜)λ₯Ό μΊ‘μŠν™”ν•©λ‹ˆλ‹€.
  • 도메인에 ν•„μš”ν•œ λ©”μ„œλ“œλ§Œ λ…ΈμΆœν•©λ‹ˆλ‹€ (μ• κ·Έλ¦¬κ±°νŠΈ 루트 쀑심).

μœ λ‹› 였브 μ›Œν¬ (Unit of Work)

μœ λ‹› 였브 μ›Œν¬λŠ” μ—¬λŸ¬ 리포지토리λ₯Ό μ‘°μ •ν•˜λŠ” νŠΈλžœμž­μ…˜ 경계 역할을 ν•˜μ—¬ λͺ¨λ“  μž‘μ—…μ΄ μ›μžμ μœΌλ‘œ μ‹€ν–‰λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€. κ°„λ‹¨ν•œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” DbContext 자체둜 μΆ©λΆ„ν•œ κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ LinoλŠ” 더 λ§Žμ€ μ œμ–΄μ™€ μœ μ—°μ„±μ„ μ œκ³΅ν•˜λŠ” μ „μš© κ΅¬ν˜„(UnitOfWork)을 μƒμ„±ν•©λ‹ˆλ‹€.

  • ν•„μš”ν•œ 경우 BeginTransaction, Commit, Rollback을 톡해 μˆ˜λ™μœΌλ‘œ νŠΈλžœμž­μ…˜μ„ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν˜„μž¬ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 도메인 이벀트λ₯Ό κ²Œμ‹œν•˜μ—¬ λ™μΌν•œ commit 사이클 λ‚΄μ—μ„œ μ‹€ν–‰λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.
  • μ•„μ›ƒλ°•μŠ€μ— 톡합 이벀트λ₯Ό μ§€μ†ν•˜μ—¬ νŠΈλžœμž­μ…˜ μ•„μ›ƒλ°•μŠ€ νŒ¨ν„΄μ„ λ”°λ₯΄λ©°, λΆ„μ‚° μ•„ν‚€ν…μ²˜ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μ‹ λ’°ν•  수 μžˆλŠ” 전달을 보μž₯ν•©λ‹ˆλ‹€(적용 κ°€λŠ₯ν•  경우).

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 관리

LinoλŠ” Entity Framework Core와 ν•¨κ»˜ λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ™„μ „νžˆ κ°„μ†Œν™”ν•˜κ³  μžλ™ν™”ν•˜μ—¬ 반볡 μž‘μ—…κ³Ό 일반적인 뢈일치 μœ„ν—˜μ„ μ œκ±°ν•©λ‹ˆλ‹€. μƒˆ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μƒμ„±ν•˜λ €λ©΄ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”:

lino database migrations add

λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μΈν„°λž™ν‹°λΈŒ λ„μš°λ―Έκ°€ λ‹€μŒ 정보λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ — λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ 적용될 ν”„λ‘œμ νŠΈ μ΄λ¦„μž…λ‹ˆλ‹€.
  • λͺ¨λ“ˆ — (λͺ¨λ“ˆν˜• μ„œλΉ„μŠ€μ—μ„œλ§Œ) λ³€κ²½ 사항이 μ†ν•œ λͺ¨λ“ˆμž…λ‹ˆλ‹€.
  • λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 이름변경 λ‚΄μš© μ„€λͺ…을 μž…λ ₯ν•˜μ„Έμš” (예: AddCustomerIsActive). LinoλŠ” .sql 슀크립트λ₯Ό 생성할 λ•Œ ν˜„μž¬ 버전과 증가 μˆœμ„œλ₯Ό μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜λ©°, λ‹€μŒ νŒ¨ν„΄μ„ λ”°λ¦…λ‹ˆλ‹€: /Scripts/v1.2.3/001_AddCustomerIsActive.sql.
μ°Έκ³ : Entity Frameworkκ°€ μƒμ„±ν•˜λŠ” .cs 파일 외에도 LinoλŠ” DDL λͺ…λ Ήμ–΄κ°€ ν¬ν•¨λœ ν•΄λ‹Ή .sql 슀크립트λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€. μ΄λŠ” λ³€κ²½ 사항을 μˆ˜λ™μœΌλ‘œ μ‹€ν–‰ν•˜κ±°λ‚˜ 인프라 νŒ€ 및 DBAκ°€ κ²€ν† ν•˜κΈ° μ‰½κ²Œ ν•©λ‹ˆλ‹€.
처리되지 않은 오류가 발생했습니다. 새로 고침 πŸ—™