프로젝트 구조화

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, 톡합 λ“±)을 μ–΄λ–»κ²Œ ꡬ쑰화할지에 λŒ€ν•΄ λ‹€λ£° κ²ƒμž…λ‹ˆλ‹€.

처리되지 않은 오류가 발생했습니다. 새로 고침 πŸ—™