프로젝트 구조화
Linoλ νμ₯ κ°λ₯νκ³ λͺ¨λνλ νλ‘μ νΈλ₯Ό ν¨μ¨μ μΌλ‘ μμ±ν μ μλλ‘ κ°λ°λμμ΅λλ€. κ³μΈ΅ κ° μ± μμ΄ λͺ ννκ² κ΅¬λΆλ μ ꡬμ±λ μ루μ μ μ 곡νλ©°, νλ‘μ νΈμ μꡬ μ¬νμ΄ λ°μ ν¨μ λ°λΌ νμ₯ν μ€λΉκ° λμ΄ μμ΅λλ€.
Linoλ₯Ό μ¬μ©νμ¬ νλ‘μ νΈλ₯Ό μμ±νλ©΄ μ±λ₯, νμ₯μ± λ° μ μ§ κ΄λ¦¬ μ©μ΄μ±μ μ€μ μ λ μν€ν μ² λ° λͺ¨λν λͺ¨λ² μ¬λ‘μ λ°λΌ ꡬμ±λ .NET μ루μ μ΄ μμ±λ©λλ€.
μ νλ‘μ νΈ λ§λ€κΈ°
lino project λͺ λ Ήμ΄λ μλ‘μ΄ .NET νλ‘μ νΈλ₯Ό κ°λ¨νκ³ ν¨μ¨μ μΌλ‘ μμ±ν μ μκ² λμμ€λλ€. μ΄ λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ νλ‘μ νΈμ ꡬ쑰λ₯Ό μ€μ νκ³ νμν μμ‘΄μ±μ μ ννλ©°, μΈμ΄ λ° μΈνλΌ μ€μ μ ν μ μμ΅λλ€.
μ νλ‘μ νΈλ₯Ό λ§λ€λ €λ©΄ λ€μ λͺ λ Ήμ΄λ₯Ό μ¬μ©νμΈμ:
lino project new
μ€ν μ€μ CLIλ λ€μ μ 보λ₯Ό μμ²ν©λλ€:
- νλ‘μ νΈ λ€μμ€νμ΄μ€: μ루μ μ μ£Όμ λ€μμ€νμ΄μ€λ₯Ό μ μν©λλ€.
- λμ€νλ μ΄ μ΄λ¦: μΈν°νμ΄μ€μ νμλλ μΉμν μ΄λ¦μ λλ€.
- νλ‘κ·Έλλ° μΈμ΄: νμ¬ C# (.NET)λ§ μ§μλ©λλ€.
- κ°λ° μ€ν: νμ¬ .NET 9μ Aspireκ° μ§μλ©λλ€.
- μ½λ λΆμκΈ°λ₯Ό μ¬μ©νμκ² μ΅λκΉ? 'μ' λλ 'μλμ€'λ₯Ό μ ννμΈμ.
- λΆμ° μΊμλ₯Ό μ¬μ©νμκ² μ΅λκΉ? 'μ' λλ 'μλμ€'λ₯Ό μ ννμΈμ.
- λΉλκΈ° ν΅μ μ μ¬μ©νμκ² μ΅λκΉ? 'μ' λλ 'μλμ€'λ₯Ό μ ννμΈμ.
- λ°μ΄ν° μΈμ΄: μμ€ν μμ μ¬μ©λλ μν°ν° μ΄λ¦κ³Ό λ€λ₯Έ λ°μ΄ν°μ μΈμ΄λ₯Ό μ μν©λλ€.
- μ ν리μΌμ΄μ μμ μ§μνλ μΈμ΄: μ΅λ 10κ° μΈμ΄μ λν΄ κ΅μ ν(i18n)λ₯Ό μ§μν©λλ€.
- κΈ°λ³Έ μΈμ΄: API, μλ΅ λ©μμ§, μ ν¨μ± κ²μ¬ λ° μ¬μ©μ μΈν°νμ΄μ€μμ μ¬μ©λλ κΈ°λ³Έ μΈμ΄λ₯Ό μ μν©λλ€.
μ 보λ₯Ό νμΈν ν Linoλ μλμΌλ‘ νλ‘μ νΈ κ΅¬μ‘°λ₯Ό μμ±ν©λλ€. μλμ κ°μ΅λλ€:
MyApp/ βββ MyApp.sln βββ src/ β βββ Aspire/ β β βββ AppHost/ β β β βββ MyApp.AppHost.csproj β β βββ ServiceDefaults/ β β βββ MyApp.ServiceDefaults.csproj β βββ Services/ β βββ Shared/ β βββ API/ β β βββ MyApp.Shared.API.csproj β βββ Application/ β β βββ MyApp.Shared.Application.csproj β βββ Domain/ β β βββ MyApp.Shared.Domain.csproj β βββ Infrastructure/ β β βββ MyApp.Shared.Infrastructure.csproj β βββ Infrastructure.Persistence/ β βββ MyApp.Shared.Infrastructure.Persistence.csproj βββ tests/
μ½λ λΆμκΈ°
μ μ μ½λ λΆμκΈ°λ κ°λ° μ€μ μ½λμ νμ§κ³Ό μΌκ΄μ±μ 보μ₯νλ λ° λμμ΄ λλ κ°λ ₯ν λꡬμ λλ€. μ΄ λꡬλ μ€ν μμ΄ μμ€ μ½λλ₯Ό κ²μ¬νμ¬ μ€λ₯, μ€νμΌ λ¬Έμ λ° κΈ°ν λΆμΌμΉλ₯Ό κ°μ§ν©λλ€.
νλ‘μ νΈ μμ± μ μ½λ λΆμκΈ°λ₯Ό νμ±ννλ©΄, CLIκ° μλμΌλ‘ λ€μ ν¨ν€μ§λ₯Ό μ€μ ν©λλ€:
- StyleCop.Analyzers: μ½λ μ€νμΌ κ²μ¬λ₯Ό μννμ¬ λ€μ¬μ°κΈ°, 곡백 λ° λͺ λͺ κ·μΉ λ±μ νμΈν©λλ€.
- SonarAnalyzer.CSharp: μ½λ νμ§ λ° λ³΄μ κ·μΉ μ§ν©μΌλ‘, μΌλ°μ μΈ λ²κ·Έμ μ μ¬μ μ·¨μ½μ μ κ°μ§νλ λ° λμμ μ€λλ€.
- Roslynator.Analyzers: C# μ½λμ λν λ€μν νμ§ κ·μΉμ μ 곡νμ¬ λ¦¬ν©ν λ§ λ° μ΅μ ν κΈ°νλ₯Ό μλ³ν©λλ€.
μ½λ λΆμκΈ°μ μ₯μ :
- νμ§ ν₯μ: μ½λλ₯Ό κΉ¨λνκ³ μ½κΈ° μ½κ² μ μ§νλ©° μΌλ°μ μΈ λ¬Έμ λ₯Ό λ°©μ§ν©λλ€.
- μ€λ₯ μλ°©: μ€ν μ μ μ€λ₯λ₯Ό κ°μ§νμ¬ κ°λ°μκ° λ¬Έμ λ₯Ό μ‘°κΈ°μ μμ ν μ μλλ‘ λμ΅λλ€.
- νμ€ν: λͺ¨λ κ°λ°μκ° λμΌν κ·μΉκ³Ό μ€νμΌμ λ°λ₯΄λλ‘ λ³΄μ₯νμ¬ μ½λ μΌκ΄μ±μ ν₯μμν΅λλ€.
- μ§μλλ 리ν©ν λ§: μ½λ 리ν©ν λ§μ λκ³ κ°μ μ¬νμ λν μ μμ μ 곡ν©λλ€.
μ½λ λΆμκΈ°λ₯Ό νμ±ννλ©΄ μ½λ νμ§μ μ κ·Ήμ μΌλ‘ κ°μ νκ³ νλ‘λμ νκ²½μμ λ°μν μ μλ μ€λ₯λ₯Ό μ€μΌ μ μμ΅λλ€.
λΆμ° μΊμ
λΆμ° μΊμλ μ ν리μΌμ΄μ μ μ±λ₯κ³Ό νμ₯μ±μ ν₯μμν€λ κΈ°μ λ‘, μμ£Ό μ‘μΈμ€λλ λ°μ΄ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€ μΈλΆμ μΊμ κ³μΈ΅μ μ μ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ μΈμ€ν΄μ€λ ν¨μ¨μ μΌλ‘ μΊμ λ°μ΄ν°λ₯Ό 곡μ νκ³ , κ³ κ°μ©μ± λ° μλ΅ μκ°μ μ€μΌ μ μμ΅λλ€.
νλ‘μ νΈ μμ± μ λΆμ° μΊμλ₯Ό νμ±ννλ©΄ Redisκ° Aspire 컨ν μ΄λμ ν΅ν©λμ΄ κ³ κ°μ©μ± μΊμ μμ€ν μ΄ μ 곡λ©λλ€.
λΆμ° μΊμμ μ₯μ :
- μ±λ₯ ν₯μ: μμ² μλ΅ μκ°μ μ€μ¬ λ°μ΄ν°λ² μ΄μ€ μ κ·Όμ μ΅μνν©λλ€.
- νμ₯μ±: λΆμ° μΊμ λλΆμ μ ν리μΌμ΄μ μ μν νμ₯μ΄ κ°λ₯νλ©°, μ¬λ¬ μΈμ€ν΄μ€μμ ν¬λͺ νκ² μΊμλ₯Ό μ κ·Όν μ μμ΅λλ€.
- κ³ κ°μ©μ±: Redisλ₯Ό μ¬μ©νλ©΄ μ₯μ κ° λ°μν΄λ μΊμκ° μ μ§λλ©°, λΆμ° μμ€ν μ μν κ°λ ₯ν μ루μ μ μ 곡ν©λλ€.
- λΉμ© μ κ°: λ°μ΄ν°λ² μ΄μ€μ μμ€ν μ λΆνλ₯Ό μ€μ΄κ³ λ°λ³΅λλ μμ²μμ λ°μνλ μ²λ¦¬ λΆλ΄μ μ€μ λλ€.
λΆμ° μΊμλ₯Ό νμ±ννλ©΄ μ ν리μΌμ΄μ μ μ±λ₯μ΄ ν¬κ² ν₯μλκ³ , μ¬μ©μμκ² λΉ λ₯Έ μλ΅μ μ 곡νλ©°, λ°±μλ μμ€ν μ λΆνλ₯Ό μ€μΌ μ μμ΅λλ€.
λΉλκΈ° ν΅μ
λΉλκΈ° ν΅μ μ μμ€ν κ³Ό κ΅¬μ± μμκ° μ°¨λ¨ μμ΄ ν΅μ ν μ μλ μ κ·Ό λ°©μμ λλ€. μ¦, λ°μ΄ν° μ μ‘μ΄λ μμ μ΄ λ€λ₯Έ μμ μ μ²λ¦¬λ₯Ό λ°©ν΄νμ§ μμ΅λλ€. μ΄λ λΆμ° μμ€ν μ΄λ λμ λΆνμμ ν¨μ¨μ±κ³Ό ν볡λ ₯μ΄ μ€μν μν©μμ νΉν μ μ©ν©λλ€.
λΉλκΈ° ν΅μ μ νμ±ννλ©΄ RabbitMQκ° νλ‘μ νΈμ ν΅ν©λκ³ , MassTransitκ° μ€μ λμ΄ μ ν리μΌμ΄μ μμ λΉλκΈ° ν΅μ μ μ½κ² μ¬μ©ν μ μμ΅λλ€.
λΉλκΈ° ν΅μ μ μ₯μ :
- ν₯μλ μ±λ₯: μμ€ν μ μ€ν νλ¦μ μ°¨λ¨νμ§ μκ³ μμ μ λ³λ ¬λ‘ μ€νν μ μμ΅λλ€.
- νμ₯μ±: μμ€ν μ νμ₯μ±μ μ©μ΄νκ² νμ¬ λλμ λ°μ΄ν°μ λμ μ¬μ©μλ₯Ό μ²λ¦¬νλ©΄μ μ±λ₯μ μ μ§ν μ μμ΅λλ€.
- ν볡λ ₯: μΌμμ μΈ μ₯μ κ° λ°μν΄λ λΉλκΈ° ν΅μ μ ν΅ν΄ λ©μμ§λ₯Ό μ¬μ²λ¦¬νκ±°λ λμ€μ μ²λ¦¬ν μ μμ΅λλ€.
- κ²°ν©λ κ°μ: μμ€ν μ΄ μ¦κ°μ μΈ μλ΅μ νμλ‘ νμ§ μκ³ ν΅μ ν μ μλλ‘ μ€κ³λμ΄ μ μ°μ±κ³Ό μ‘°μ§λ ₯μ λμ λλ€.
RabbitMQμμ ν΅ν©κ³Ό MassTransit μ¬μ©μ κ΅¬μ± μμ κ°μ ν΅μ μ λ ν¨μ¨μ μ΄κ³ ν볡λ ₯ μκ² λ§λ€μ΄ μ ν리μΌμ΄μ μ νμ₯μ±κ³Ό μ μ°μ±μ 보μ₯ν©λλ€.
λ€μ λ¨κ³
μ΄μ Linoλ‘ .NET νλ‘μ νΈλ₯Ό λ§λ€μμΌλ―λ‘, μ’μνλ μ½λ νΈμ§κΈ°μμ νλ‘μ νΈλ₯Ό μ΄μ΄ 보μΈμ. Visual Studio, Visual Studio Code λλ λ€λ₯Έ IDEλ₯Ό μ¬μ©ν μ μμ΅λλ€.
νλ‘μ νΈλ₯Ό μ΄κ³ λλ©΄ μ ν리μΌμ΄μ μ ꡬμ±νλ μλΉμ€λ₯Ό μΆκ°νκ³ μ€μ μ μμν μ μμ΅λλ€. μ΄κ²μ΄ κ°λ° νλ¦μ λ€μ λ¨κ³μ λλ€.
λ€μ μΉμ μμλ μλ‘μ΄ νλ‘μ νΈ λ΄μμ μλΉμ€λ₯Ό μμ±νκ³ κ΅¬μ±νλ λ°©λ²μ λ³΄μ¬ λ리며, μ ν리μΌμ΄μ μ μꡬ μ¬νμ λ§κ² μ 리λκ³ νμ₯ κ°λ₯ν μ±μ₯μ μν μ€λΉλ₯Ό ν©λλ€.
μλΉμ€ μμ± λ° κ΄λ¦¬
νλ‘μ νΈλ₯Ό μμ±ν ν, λ€μ λ¨κ³λ μλΉμ€λ₯Ό μΆκ°νλ κ²μ λλ€. Linoλ λͺ¨λ리μ μμ€ν μ΄λ λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²μμ μ¬μ©ν μ μλ μλΉμ€λ₯Ό κ°λ¨νκ³ μ§κ΄μ μΈ λ°©μμΌλ‘ μμ±ν μ μλ λ°©λ²μ μ 곡ν©λλ€.
μ μλΉμ€λ₯Ό μμ±νλ €λ©΄ λ€μ λͺ λ Ήμ΄λ₯Ό μ¬μ©νμΈμ:
lino service new
μ€ν μ€μ CLIλ λ€μ μ 보λ₯Ό μμ²ν©λλ€:
- μλΉμ€ λ€μμ€νμ΄μ€: μλΉμ€μ μ΄λ¦κ³Ό λ€μμ€νμ΄μ€λ₯Ό μ μν©λλ€.
- λμ€νλ μ΄ μ΄λ¦: μΈν°νμ΄μ€μ νμλλ μΉμν μ΄λ¦μ λλ€.
- μλΉμ€ μ ν: λ¨μν λλ λͺ¨λν μ€ μ ννμΈμ.
- λ°μ΄ν°λ² μ΄μ€: PostgreSQL λλ SQL Server μ€ μ ννμΈμ.
μλΉμ€ μ νμ΄ λ¨μνμΈ κ²½μ°, λ€μκ³Ό κ°μ μΆκ° μ 보λ μμ²λ©λλ€:
- μν€ν μ² μ€νμΌ: νμ¬λ Clean Architectureλ§ μ§μλ©λλ€.
- Strongly Typed ID μ¬μ© μ¬λΆ? μ λλ μλμ€ μ€μμ μ ννμΈμ.
μλΉμ€ μ ν
λ¨μν μλΉμ€: λ¨μν μλΉμ€λ λ κ°κ²°ν ꡬ쑰λ₯Ό κ°μ§κ³ μμΌλ©°, λͺ¨λ리μ μμ€ν μ΄λ κ° μλΉμ€κ° λ 립μ μΈ μ± μμ κ°μ§ λ§μ΄ν¬λ‘μλΉμ€ νλ‘μ νΈμ μ ν©ν©λλ€.
λͺ¨λν μλΉμ€: λ ν° μμ€ν μ μν΄ λ λμ μ‘°μ§κ³Ό νμ₯μ±μ΄ νμν κ²½μ°, λͺ¨λν μλΉμ€λ₯Ό μ νν μ μμ΅λλ€. μ΄ μ νμ μλΉμ€λ₯Ό λ μκ³ κ΅¬μ²΄μ μΈ λͺ¨λλ‘ λλμ΄ μμ€ν μ μ§λ³΄μ λ° νμ₯μ±μ μ©μ΄νκ² ν©λλ€.
λ¨μν μλΉμ€λ λͺ¨λν μλΉμ€λ λ°μ΄ν°λ² μ΄μ€λ κ° μλΉμ€λ§λ€ κ³ μ ν©λλ€. μν€ν μ² λ° Strongly Typed ID μ¬μ© μ¬λΆλ λ¨μν μλΉμ€μ μ μ©λ©λλ€. λͺ¨λν μλΉμ€μ κ²½μ°, μ΄ κ²°μ μ μλΉμ€ λ΄ κ° λͺ¨λμ μμ€μμ λ΄λ €μ§λλ€.
Linoμ ꡬ쑰λ μ μ°νμ¬ λμΌν νλ‘μ νΈ λ΄μμ λ¨μν λ° λͺ¨λν μλΉμ€λ₯Ό μμ±ν μ μμ΅λλ€.
μν€ν μ² μ€νμΌ
Linoλ λͺ¨λ μλΉμ€μ Clean Architectureλ₯Ό μ μ©ν©λλ€. μ΄λ μ ν리μΌμ΄μ μ΄ μ ꡬ쑰νλ μν€ν μ²λ₯Ό λ°λ₯΄λλ‘ λ³΄μ₯νλ©°, μ± μ λΆλ¦¬λ₯Ό μ΄μ§νκ³ μ μ§λ³΄μ λ° νμ₯μ±μ μ©μ΄νκ² ν©λλ€.
Clean Architectureμ μ₯μ :
- λΆλ¦¬: λΉμ¦λμ€ λ‘μ§μ κΈ°μ μ μΈλΆ μ¬νκ³Ό λ 립μ μ΄λ―λ‘ λ ν° μ μ°μ±κ³Ό ν μ€νΈ κ°λ₯μ±μ μ 곡ν©λλ€.
- μ μ§λ³΄μμ±: λ μ΄μ΄κ° μ λΆλ¦¬λμ΄ μμ΄ λ€λ₯Έ μμ€ν λΆλΆμ μν₯μ μ£Όμ§ μκ³ λ³κ²½μ λ μ½κ² ν μ μμ΅λλ€.
- ν μ€νΈ κ°λ₯μ±: κ΄μ¬μ¬μ λΆλ¦¬κ° κ° λ μ΄μ΄μ λν μ λ λ° ν΅ν© ν μ€νΈλ₯Ό λ 립μ μΌλ‘ μμ±νλ λ° μ©μ΄ν©λλ€.
- νμ₯μ±: νλ‘μ νΈλ λ μ½κ² νμ₯ν μ μμ΅λλ€. κ΅¬μ± μμλ λΉμ¦λμ€ λ‘μ§μ μν₯μ μ£Όμ§ μκ³ λ³κ²½λκ±°λ κ΅μ²΄λ μ μμ΅λλ€.
λ§μ½ λ¨μν μλΉμ€λ₯Ό μ ννκ³ Clean Architecture ꡬνμ μ¬μ©ν κ²½μ°, νλ‘μ νΈλ λ€μκ³Ό κ°μ κ΅¬μ‘°λ‘ μμ±λ©λλ€:
MyApp/ βββ MyApp.sln βββ src/ β βββ Aspire/ β β βββ AppHost/ β β β βββ MyApp.AppHost.csproj β β βββ ServiceDefaults/ β β βββ MyApp.ServiceDefaults.csproj β βββ Integrations/ β β βββ Internal/ β β βββ MySimpleService/ β β βββ Http/ β β βββ Clients/ β β β βββ MyApp.Integrations.MySimpleService.Http.Clients.csproj β β βββ Contracts/ β β βββ MyApp.Integrations.MySimpleService.Http.Contracts.csproj β βββ Services/ β βββ Shared/ β β βββ API/ β β β βββ MyApp.Shared.API.csproj β β βββ Application/ β β β βββ MyApp.Shared.Application.csproj β β βββ Domain/ β β β βββ MyApp.Shared.Domain.csproj β β βββ Infrastructure/ β β β βββ MyApp.Shared.Infrastructure.csproj β β βββ Infrastructure.Persistence/ β β βββ MyApp.Shared.Infrastructure.Persistence.csproj β βββ MySimpleService/ β βββ API/ β β βββ MyApp.MySimpleService.API.csproj β βββ Application/ β β βββ MyApp.MySimpleService.Application.csproj β βββ Domain/ β β βββ MyApp.MySimpleService.Domain.csproj β βββ Infrastructure/ β β βββ MyApp.MySimpleService.Infrastructure.csproj β βββ Infrastructure.Persistence/ β β βββ MyApp.MySimpleService.Infrastructure.Persistence.csproj β βββ IntegrationEvents/ β βββ MyApp.MySimpleService.IntegrationEvents.csproj βββ tests/ βββ Services/ βββ MySimpleService/ βββ IntegrationTests/ β βββ MyApp.MySimpleService.IntegrationTests.csproj βββ UnitTests/ βββ MyApp.MySimpleService.UnitTests.csproj
λͺ¨λν μλΉμ€λ₯Ό μ ννλ©΄ νλ‘μ νΈλ λ€μκ³Ό κ°μ ꡬ쑰λ₯Ό μ±ννλ©°, κ°λ° κ³Όμ μμ μλ‘μ΄ λͺ¨λμ μ μ°νκ³ μ²΄κ³μ μΌλ‘ μΆκ°ν μ μμ΅λλ€:
MyApp/ βββ MyApp.sln βββ src/ β βββ Aspire/ β β βββ AppHost/ β β β βββ MyApp.AppHost.csproj β β βββ ServiceDefaults/ β β βββ MyApp.ServiceDefaults.csproj β βββ Services/ β βββ Shared/ β β βββ API/ β β β βββ MyApp.Shared.API.csproj β β βββ Application/ β β β βββ MyApp.Shared.Application.csproj β β βββ Domain/ β β β βββ MyApp.Shared.Domain.csproj β β βββ Infrastructure/ β β β βββ MyApp.Shared.Infrastructure.csproj β β βββ Infrastructure.Persistence/ β β βββ MyApp.Shared.Infrastructure.Persistence.csproj β βββ MyModularService/ β βββ Host/ β β βββ MyApp.MyModularService.Host.csproj β βββ Infrastructure/ β β βββ MyApp.MyModularService.Infrastructure.csproj β βββ Modules/ βββ tests/
Strongly Typed ID
Strongly Typed IDλ μ½λμ μμ μ±κ³Ό λͺ
νμ±μ ν₯μμν€κΈ° μν μ κ·Ό λ°©μμΌλ‘, μλ³μ(ID) μ νμ΄ λ ꡬ체μ μ΄κ³ κ°λ ₯νκ² νμ΄νλμ΄, int
λλ guid
μ κ°μ μΌλ°μ μΈ μ νμ μ¬μ©νμ¬ κ³ μ μν°ν°λ₯Ό λνλ΄λ κ²μ λ°©μ§ν©λλ€.
Strongly Typed IDλ₯Ό μ¬μ©νλ©΄, μλ₯Ό λ€μ΄ μ¬μ©μ IDλ₯Ό λνλ΄κΈ° μν΄ μΌλ°μ μΈ μ«μ μ νμ μ¬μ©νλ λμ μ¬μ©μ IDμ λν ꡬ체μ μΈ μ νμ μμ±ν©λλ€. μ΄λ₯Ό ν΅ν΄ μλ‘ λ€λ₯Έ μ νμ IDκ° μλͺ»λ 컨ν μ€νΈμμ μ¬μ©λλ λ±μ μ€λ₯λ₯Ό λ°©μ§ν μ μμ΅λλ€.
Strongly Typed ID μ¬μ©μ μ₯μ :
- νμ μμ μ±: IDκ° μ¬λ°λ₯΄κ² μ¬μ©λλλ‘ λ³΄μ₯νλ©°, μλ₯Ό λ€μ΄ μ¬μ©μ IDμ μ ν IDκ° νΌν©λλ κ²μ λ°©μ§ν©λλ€.
- λͺ νμ±: κ° ID μ νμ΄ νΉμ ν΄λμ€μ μν΄ λͺ ννκ² ννλμ΄ μ½λκ° λ λͺ νν΄μ§λλ€.
- 리ν©ν λ§ μ©μ΄μ±: μλ³μ μ νμ λ³κ²½ν΄μΌ ν κ²½μ°, νΉμ ID μ νλ§ λ³κ²½νλ©΄ λλ©° λλ¨Έμ§ μ½λλ μμ νκ² μ μ§λ©λλ€.
- μ€λ₯ λ°©μ§: μλͺ»λ 컨ν μ€νΈμμ μΌλ°μ μΈ IDλ₯Ό μλͺ» μ¬μ©νλ λ²κ·Έλ₯Ό μ€μ λλ€.
λͺ¨λν μλΉμ€μ λ€μ λ¨κ³
λͺ¨λν μλΉμ€λ₯Ό μμ±ν ν, λ€μ λ¨κ³λ λͺ¨λμ μΆκ°νλ κ²μ λλ€. λͺ¨λμ μ¬μ©νλ©΄ λΉμ¦λμ€ λ‘μ§κ³Ό μΈνλΌλ₯Ό λ 립μ μΌλ‘ ꡬμ±ν μ μμ΄ μμ€ν μ λμ± νμ₯ κ°λ₯νκ³ μ‘°μ§μ μΌλ‘ λ§λ€ μ μμ΅λλ€.
λ€μ μΉμ μμλ λͺ¨λν μλΉμ€ λ΄μμ λͺ¨λμ μμ±νκ³ κ΄λ¦¬νλ λ°©λ²μ λ€λ£° κ²μ λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λν μλΉμ€κ° μ 곡νλ μ μ°μ±κ³Ό νμ₯μ±μ μ΅λν νμ©ν μ μμ΅λλ€.
λͺ¨λ μμ± λ° κ΄λ¦¬
λͺ¨λν μλΉμ€λ₯Ό λ§λ ν, λ€μ λ¨κ³λ ν΄λΉ μλΉμ€μ λͺ¨λμ μΆκ°νλ κ²μ λλ€. λͺ¨λμ λΉμ¦λμ€ λ‘μ§μ λ 립μ μΌλ‘ ꡬμ±ν μ μκ² νμ¬ μμ€ν μ λ ν° νμ₯μ±κ³Ό μ‘°μ§μ μ 곡ν©λλ€.
μλ‘μ΄ λͺ¨λμ μμ±νλ €λ©΄ λ€μ λͺ λ Ήμ΄λ₯Ό μ¬μ©νμΈμ:
lino module new
μ€ν μ€μ CLIλ λ€μ μ 보λ₯Ό μμ²ν©λλ€:
- μλΉμ€: μλ‘μ΄ λͺ¨λμ΄ μμ±λ μλΉμ€λ₯Ό μ μν©λλ€.
- λͺ¨λ λ€μμ€νμ΄μ€: λͺ¨λμ μ΄λ¦κ³Ό λ€μμ€νμ΄μ€λ₯Ό μ μν©λλ€.
- λμ€νλ μ΄ μ΄λ¦: μΈν°νμ΄μ€μ νμλ μΉμν μ΄λ¦μ λλ€.
- μν€ν μ² μ€νμΌ: νμ¬λ Clean Architectureλ§ μ§μν©λλ€.
- κ°λ ₯νκ² μ νμ΄ μ§μ λ IDλ₯Ό μ¬μ©ν κΉμ? μ λλ μλμ€λ₯Ό μ ννμΈμ.
λ§μ§λ§μΌλ‘, Linoλ λͺ¨λ μλΉμ€μ ꡬ쑰λ₯Ό μ μ§νλ©΄μ μλ‘μ΄ λͺ¨λμ μμ±ν©λλ€:
MyApp/ βββ MyApp.sln βββ src/ β βββ Aspire/ β β βββ AppHost/ β β β βββ MyApp.AppHost.csproj β β βββ ServiceDefaults/ β β βββ MyApp.ServiceDefaults.csproj β βββ Integrations/ β β βββ Internal/ β β βββ MyModularService/ β β βββ MyModule/ β β βββ Http/ β β βββ Clients/ β β β βββ MyApp.Integrations.MyModularService.MyModule.Http.Clients.csproj β β βββ Contracts/ β β βββ MyApp.Integrations.MyModularService.MyModule.Http.Contracts.csproj β βββ Services/ β βββ Shared/ β β βββ API/ β β β βββ MyApp.Shared.API.csproj β β βββ Application/ β β β βββ MyApp.Shared.Application.csproj β β βββ Domain/ β β β βββ MyApp.Shared.Domain.csproj β β βββ Infrastructure/ β β β βββ MyApp.Shared.Infrastructure.csproj β β βββ Infrastructure.Persistence/ β β βββ MyApp.Shared.Infrastructure.Persistence.csproj β βββ MyModularService/ β βββ Host/ β β βββ MyApp.MyModularService.Host.csproj β βββ Infrastructure/ β β βββ MyApp.MyModularService.Infrastructure.csproj β βββ Modules/ β βββ MyModule/ β βββ API/ β β βββ MyApp.MyModularService.MyModule.API.csproj β βββ Application/ β β βββ MyApp.MyModularService.MyModule.Application.csproj β βββ Domain/ β β βββ MyApp.MyModularService.MyModule.Domain.csproj β βββ Infrastructure/ β β βββ MyApp.MyModularService.MyModule.Infrastructure.csproj β βββ Infrastructure.Persistence/ β β βββ MyApp.MyModularService.MyModule.Infrastructure.Persistence.csproj β βββ IntegrationEvents/ β βββ MyApp.MyModularService.MyModule.IntegrationEvents.csproj βββ tests/ βββ Services/ βββ MyModularService/ βββ Modules/ βββ MyModule/ βββ IntegrationTests/ β βββ MyApp.MyModularService.MyModule.IntegrationTests.csproj βββ UnitTests/ βββ MyApp.MyModularService.MyModule.UnitTests.csproj
λ°μ΄ν°λ² μ΄μ€ ꡬ쑰
λ°μ΄ν°λ² μ΄μ€λ μλΉμ€μ μ°κ²°λμ΄ μμμ κ°μ‘°νλ κ²μ΄ μ€μν©λλ€. λͺ¨λν μλΉμ€ λ΄μμ κ° λͺ¨λμ κ΄λ ¨λ λ°μ΄ν°λ² μ΄μ€ λ΄μμ κ³ μ ν μ€ν€λ§λ‘ ννλ©λλ€. μ΄ μ κ·Ό λ°©μμ μ¬λ¬ κ°μ λ°μ΄ν°λ² μ΄μ€λ₯Ό μμ±ν νμ μμ΄ κ²©λ¦¬μ ꡬμ±μ μ 곡ν©λλ€.
λͺ¨λ κ° λ 립μ±μ λν΄
μλΉμ€ κ°μλ μ§μ μ μΈ μμ‘΄μ±μ΄ μλ―μ΄, λͺ¨λλ μλΉμ€ λ΄μμ λ 립μ μΈ νλ‘μ νΈλ‘ μμ±λ©λλ€.
μ΄ λΆλ¦¬μ μ₯μ :
- 격리: κ° λͺ¨λμ λ 립μ μΌλ‘ λ°μ ν μ μμ΄ μ μ§ κ΄λ¦¬μ μ§μμ μΈ λ°μ μ΄ μ©μ΄ν©λλ€.
- μ‘°μ§ν: μ ν리μΌμ΄μ μ μ§μ μΌλ‘ λͺ¨λνλλ©°, κ²½κ³λ₯Ό μ§ν€κ³ (Bounded Contexts) μννΈμ¨μ΄ μν€ν μ²μ λͺ¨λ² μ¬λ‘λ₯Ό μ΄μ§ν©λλ€.
- μ μ°μ±: μλΉμ€λ₯Ό ꡬμ±νλ λ€λ₯Έ λͺ¨λμ μ§μ μ μΈ μν₯μ λ―ΈμΉμ§ μκ³ λͺ¨λμ μΆκ°, μ κ±° λλ 리ν©ν λ§ν μ μμ΅λλ€.
- ν μ€νΈ μ©μ΄μ±: κ° λͺ¨λμ λ 립μ μΌλ‘ ν μ€νΈν μ μμ΄ μμ€ν μ μ λ’°μ± λ° νμ§μ΄ ν₯μλ©λλ€.
μ΄λ‘μ¨ λͺ¨λ μμ± νλ‘μΈμ€κ° μλ£λμμ΅λλ€. λ€μ μ£Όμ μμλ λͺ¨λμ λ΄λΆ μμλ€(μν°ν°, κ° κ°μ²΄, μ΄κ±°ν, λͺ λ Ήμ΄, 쿼리, API, ν΅ν© λ±)μ μ΄λ»κ² ꡬ쑰νν μ§μ λν΄ λ€λ£° κ²μ λλ€.