애플리케이션 사용 사례 정의

이 μ„Ήμ…˜μ—μ„œλŠ” Lino CLIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‚¬μš© 사둀λ₯Ό μ •μ˜ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ‚¬μš© μ‚¬λ‘€λŠ” μ‚¬μš©μž λ˜λŠ” μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°„μ˜ ꡬ체적인 μƒν˜Έ μž‘μš©μ„ λ‚˜νƒ€λ‚΄λ©°, λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ μΊ‘μŠν™”ν•˜κ³  도메인 쀑심 μ•„ν‚€ν…μ²˜λ₯Ό μ΄‰μ§„ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” CQRS νŒ¨ν„΄μ„ 톡해 읽기 및 μ“°κΈ° μž‘μ—…μ˜ 뢄리λ₯Ό 닀루고, Result Pattern을 μ‚¬μš©ν•˜μ—¬ 응닡 λ°˜ν™˜μ„ ν‘œμ€€ν™”ν•˜λŠ” 방법을 μ„€λͺ…ν•©λ‹ˆλ‹€.


CQRS (Command Query Responsibility Segregation) νŒ¨ν„΄μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” μž‘μ—…(Commands)κ³Ό λ‹¨μˆœνžˆ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” μž‘μ—…(Queries)을 λΆ„λ¦¬ν•˜λŠ” 것을 μ œμ•ˆν•©λ‹ˆλ‹€. 이 μ ‘κ·Ό 방식은 각 μž‘μ—… μœ ν˜•μ„ λ…λ¦½μ μœΌλ‘œ μ΅œμ ν™”ν•  수 있게 ν•˜μ—¬ ν™•μž₯μ„±, μ„±λŠ₯, μ‹œμŠ€ν…œ μœ μ§€ 관리λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.


Result Pattern은 μž‘μ—…μ˜ λ°˜ν™˜ 값을 ν‘œμ€€ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©°, 성곡 λ˜λŠ” μ‹€νŒ¨ μ—¬λΆ€, 였λ₯˜ λ©”μ‹œμ§€, κ²°κ³Ό 데이터λ₯Ό μΊ‘μŠν™”ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‹€μ–‘ν•œ κ³„μΈ΅μ—μ„œ μΌκ΄€λœ 응닡 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.


μš°λ¦¬λŠ” Commands 및 Queries 파일이 μ–΄λ–»κ²Œ κ΅¬μ„±λ˜λŠ”μ§€, 데이터 μœ νš¨μ„± 검사가 μ–΄λ–»κ²Œ μ΄λ£¨μ–΄μ§€λŠ”μ§€, Handlers에 도메인 둜직이 μ–΄λ–»κ²Œ μ μš©λ˜λŠ”μ§€, 그리고 κ²°κ³Όλ₯Ό ν‘œμ€€ν™”λœ λ°©μ‹μœΌλ‘œ λ°˜ν™˜ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³Ό κ²ƒμž…λ‹ˆλ‹€. 이 λͺ¨λ“  과정은 Lino CLIλ₯Ό 톡해 ν•΄λ‹Ή ꡬ성 μš”μ†Œλ“€μ„ μžλ™μœΌλ‘œ μƒμ„±ν•¨μœΌλ‘œμ¨ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

μ°Έκ³ : ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ, ν˜„μž¬ LinoλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ³„μΈ΅μ—μ„œ CQRS νŒ¨ν„΄μ„ μ μš©ν•˜κΈ° μœ„ν•œ 두 κ°€μ§€ μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€: Jimmy Bogard의 MediatR 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” Mediator νŒ¨ν„΄, λ˜λŠ” Martin Othamar의 Mediator 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

μ‚¬μš© 사둀 κ°œμš”

μ‚¬μš© μ‚¬λ‘€λŠ” μ‚¬μš©μž λ˜λŠ” μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°„μ˜ μ™„μ „ν•œ μƒν˜Έμž‘μš©μ„ λ‚˜νƒ€λ‚΄λ©°, νŠΉμ • λΉ„μ¦ˆλ‹ˆμŠ€ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€. Linoμ—μ„œλŠ” 각 μ‚¬μš© 사둀가 λ‹€μŒκ³Ό 같이 λ‚˜λ‰©λ‹ˆλ‹€:

  • λͺ…λ Ή(Command): μ‹œμŠ€ν…œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λ €λŠ” μ˜λ„(생성, μ—…λ°μ΄νŠΈ, μ‚­μ œ λ“±)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • 쿼리(Query): 도메인 μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  데이터λ₯Ό μ‘°νšŒν•˜λ €λŠ” μ˜λ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λΆ„λ¦¬λŠ” μ½”λ“œμ˜ λͺ…확성을 높이고, ν…ŒμŠ€νŠΈλ₯Ό μš©μ΄ν•˜κ²Œ ν•˜λ©°, 읽기 및 μ“°κΈ° μž‘μ—…μ˜ 독립적인 ν™•μž₯성을 κ°€λŠ₯ν•˜κ²Œ ν•˜κ³ , 클린 μ•„ν‚€ν…μ²˜ 원칙과 도메인 주도 섀계 (DDD)의 λͺ¨λ²” 사둀에 λΆ€ν•©ν•©λ‹ˆλ‹€.

λͺ…λ Ή(Commands)

λͺ…λ Ή(Command)은 μ‹œμŠ€ν…œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λ°μ΄ν„°λ§Œ λ‹΄κ³  μžˆλŠ” λΆˆλ³€ λ©”μ‹œμ§€μž…λ‹ˆλ‹€(예: CreateInvoice, DeactivateUser). λͺ…령은 μž‘μ—… μˆ˜ν–‰μ— ν•„μˆ˜μ μΈ μ •λ³΄λ§Œ 포함해야 ν•©λ‹ˆλ‹€.

λͺ…λ Ήμ˜ νŠΉμ§•

  • λΆˆλ³€μ„±: record λ˜λŠ” 곡개 setμžκ°€ μ—†λŠ” get만 μžˆλŠ” 클래슀 ν˜•νƒœλ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€.
  • λͺ…λ Ήν˜• 이름: 싀행될 μž‘μ—…μ„ λ°˜μ˜ν•˜λ©° 예λ₯Ό λ“€μ–΄ CreateOrder, UpdateCustomerAddress 등이 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΅œμ†Œν•œμ˜ 데이터: μž‘μ—… 싀행에 ν•„μš”ν•œ ν•„λ“œλ§Œ ν¬ν•¨ν•˜λ©° λŒ€λŸ‰μ˜ 데이터λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 독립적인 검증: 각 λͺ…령은 자체 검증 κ·œμΉ™μ„ κ°€μ§€λ©°, ν•Έλ“€λŸ¬(Handler)에 μ „λ‹¬λ˜κΈ° 전에 일관성을 보μž₯ν•©λ‹ˆλ‹€.

λͺ…λ Ή 검증기(Command Validators)

λͺ…λ Ή κ²€μ¦κΈ°λŠ” λͺ…령이 μ˜¬λ°”λ₯΄κ²Œ ν˜•μ„±λ˜μ—ˆλŠ”μ§€ 및 λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬ 사항을 μΆ©μ‘±ν•˜λŠ”μ§€ ν•Έλ“€λŸ¬μ— μ „λ‹¬ν•˜κΈ° 전에 ν™•μΈν•©λ‹ˆλ‹€. Linoμ—μ„œλŠ” .NET ν”„λ‘œμ νŠΈμ—μ„œ 널리 μ‚¬μš©λ˜κ³  κ·œμΉ™ μž‘μ„±μ— Fluent APIλ₯Ό μ œκ³΅ν•˜λŠ” FluentValidation 라이브러리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

일반 검증 κ·œμΉ™

  • NotEmpty, NotNull - ν•„μˆ˜ ν•„λ“œμš©
  • InclusiveBetween - 숫자 λ²”μœ„μš©(예: κΈˆμ•‘, μ΅œμ†Œ/μ΅œλŒ€ μˆ˜λŸ‰)
  • MaximumLength, MinimumLength - λ¬Έμžμ—΄ 길이용
  • RuleForEach - μ»¬λ ‰μ…˜(List<T>) ν•­λͺ© κ²€μ¦μš©
  • Must - μ‚¬μš©μž μ •μ˜ κ·œμΉ™μš©(예: λ¬Έμ„œ ν˜•μ‹, λ‚ μ§œ 검증)

λͺ…λ Ή ν•Έλ“€λŸ¬(Command Handlers)

λͺ…λ Ή ν•Έλ“€λŸ¬λŠ” ν•΄λ‹Ή λͺ…λ Ήκ³Ό κ΄€λ ¨λœ 도메인 λ‘œμ§μ„ μ‹€ν–‰ν•˜λŠ” μ±…μž„μ΄ μžˆμŠ΅λ‹ˆλ‹€. 리포지토리, μž‘μ—… λ‹¨μœ„(IUnitOfWork), 보쑰 μ„œλΉ„μŠ€λ“€μ„ μ‘°μœ¨ν•˜κ³  ν•„μš” μ‹œ 도메인 이벀트λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

ν•Έλ“€λŸ¬ κ΅¬ν˜„ νŒ¨ν„΄

  • μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 리포지토리, μ™ΈλΆ€ μ„œλΉ„μŠ€, UnitOfWork λ“±μ˜ μ˜μ‘΄μ„±μ„ λ°›μŠ΅λ‹ˆλ‹€.
  • 도메인 μ—”ν‹°ν‹°λ₯Ό λ§€ν•‘ν•˜κ³  μΈμŠ€ν„΄μŠ€ν™”ν•˜μ—¬ 초기 일관성을 보μž₯ν•©λ‹ˆλ‹€.
  • λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™ 적용(μΆ”κ°€ 검증, κ°’ 계산, 도메인 이벀트 트리거)
  • IUnitOfWork λ˜λŠ” 직접 리포지토리λ₯Ό 톡해 변경사항을 μ˜μ†ν™”ν•©λ‹ˆλ‹€.
  • 성곡 λ˜λŠ” μ‹€νŒ¨λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λͺ…λ Ή κ²°κ³Ό(Command Result)(Result<T>)λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λͺ…λ Ή 결과와 Result νŒ¨ν„΄

λͺ…λ Ή κ²°κ³ΌλŠ” 호좜자(예: API λ˜λŠ” ν”„λŸ°νŠΈμ—”λ“œ)κ°€ 계속 μ§„ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ λ°μ΄ν„°λ§Œ ν¬ν•¨ν•˜λŠ” κ°„λ‹¨ν•œ DTOμ—¬μ•Ό ν•©λ‹ˆλ‹€. 일반적으둜 μƒμ„±λ˜κ±°λ‚˜ μ—…λ°μ΄νŠΈλœ μ—”ν‹°ν‹°μ˜ μ‹λ³„μž(Id)와 μ‹€νŒ¨ μ‹œ 였λ₯˜μ— λŒ€ν•œ ν‘œμ€€ν™”λœ 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

λͺ…령이 μ‹€νŒ¨ν•  수 μžˆλŠ” μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” Result νŒ¨ν„΄μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 이 νŒ¨ν„΄μ€ 성곡 λ˜λŠ” μ‹€νŒ¨μΌ 수 μžˆλŠ” μž‘μ—… κ²°κ³Όλ₯Ό μΊ‘μŠν™”ν•˜λŠ” μΆ”μƒν™”μž…λ‹ˆλ‹€. .NETμ—μ„œλŠ” Result<T>와 같은 νƒ€μž…(λ˜λŠ” μœ μ‚¬ 라이브러리)을 주둜 μ‚¬μš©ν•˜λ©°:

  • 성곡 μ‹œ Valueλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€(예: λ‹¨μˆœ DTO).
  • μ‹€νŒ¨ μ‹œ ν‘œμ€€ν™”λœ μ½”λ“œ λ˜λŠ” λ©”μ‹œμ§€(Error)λ₯Ό μ €μž₯ν•˜λ©°, HTTP μ½”λ“œ, 검증 세뢀사항 λ“± μΆ”κ°€ 메타데이터가 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • API μ „μ²΄μ—μ„œ 였λ₯˜ 처리 흐름을 ν†΅ν•©ν•˜μ—¬ 계측 κ°„ 일관성을 μœ μ§€ν•©λ‹ˆλ‹€.

CLIλ₯Ό μ‚¬μš©ν•œ λͺ…λ Ή 생성

LinoλŠ” λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό 톡해 μƒˆ λͺ…령에 ν•„μš”ν•œ λͺ¨λ“  μ•„ν‹°νŒ©νŠΈλ₯Ό μ‰½κ²Œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€:

lino command new

이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ λŒ€ν™”ν˜• λ§ˆλ²•μ‚¬κ°€ λ‹€μŒμ„ μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ β€” λͺ…령이 생성될 μ„œλΉ„μŠ€ 이름
  • λͺ¨λ“ˆ β€” λͺ¨λ“ˆν™”λœ μ„œλΉ„μŠ€μ˜ 경우 λŒ€μƒ λͺ¨λ“ˆ μ •μ˜
  • μ—”ν‹°ν‹° β€” λͺ…λ Ήκ³Ό κ΄€λ ¨λœ 도메인 μ—”ν‹°ν‹°(선택 μ‚¬ν•­μ΄μ§€λ§Œ ꢌμž₯)
  • λͺ…λ Ή 이름 β€” μ΅œμ’… λͺ…λ Ή 이름(예: CreateOrder)

확인 ν›„ Linoκ°€ μžλ™μœΌλ‘œ λ‹€μŒ νŒŒμΌλ“€μ„ μƒμ„±ν•©λ‹ˆλ‹€:

  • CreateOrderCommand.cs
  • CreateOrderCommandValidator.cs
  • CreateOrderCommandHandler.cs
  • CreateOrderCommandResult.cs

μƒμ„±λœ ꡬ쑰 μ˜ˆμ‹œ

CreatePerson λͺ…령을 예둜 λ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. μƒμ„±λœ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€:

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Application/
                β”œβ”€β”€ MyApp.MyService.Application.csproj
                └── UseCases/
                    └── People/
                        β”œβ”€β”€ Commands/
                        β”‚   └── CreatePerson/
                        β”‚       β”œβ”€β”€ CreatePersonCommand.cs
                        β”‚       β”œβ”€β”€ CreatePersonCommandValidator.cs
                        β”‚       β”œβ”€β”€ CreatePersonCommandHandler.cs
                        β”‚       └── CreatePersonCommandResult.cs
                        └── Queries/
                            └── ...

쿼리(Queries)

μΏΌλ¦¬λŠ” λ„λ©”μΈμ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  데이터λ₯Ό μ‘°νšŒν•˜λ €λŠ” μ˜λ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μΏΌλ¦¬λŠ” 읽기 νš¨μœ¨μ„±μ„ μœ„ν•΄ μ„€κ³„λ˜μ—ˆμœΌλ©°, μš”μ²­λ˜μ§€ μ•Šμ€ 경우 전체 μ—”ν‹°ν‹°λ₯Ό λ‘œλ“œν•˜μ§€ μ•Šκ³  ν•„μš”ν•œ ν•„λ“œλ§Œ μ •ν™•νžˆ λ°˜ν™˜ν•©λ‹ˆλ‹€.

쿼리의 νŠΉμ§•

  • λΆˆλ³€μ„± β€” μ»€λ§¨λ“œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, μΏΌλ¦¬λŠ” μƒμ„±λœ ν›„ λ³€κ²½λ˜μ–΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.
  • μ„€λͺ…적인 이름 β€” 예: GetCustomerById, ListOrdersByDateRange λ“±κ³Ό 같이 μš”μ²­ν•˜λŠ” 정보λ₯Ό 잘 μ„€λͺ…ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • ν•„ν„° 및 νŽ˜μ΄μ§• β€” λ‚ μ§œ, μƒνƒœ, νŽ˜μ΄μ§€, μ •λ ¬ λ“± νŠΉμ • 쑰건에 λ§žλŠ” 검색을 μœ„ν•œ νŒŒλΌλ―Έν„°λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œμ μ…˜ β€” 도메인 객체 전체λ₯Ό λ‘œλ“œν•˜μ§€ μ•Šκ³ , ν•„μš”ν•œ ν•„λ“œλ§Œ ν¬ν•¨λœ DTO λ˜λŠ” λ·° λͺ¨λΈμ„ λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

쿼리 μœ νš¨μ„± 검사기

쿼리 μœ νš¨μ„± κ²€μ‚¬κΈ°λŠ” ν•„ν„°, νŽ˜μ΄μ§• κ°’(page, pageSize), λ³΄μ•ˆ κ·œμΉ™(μ‚¬μš©μž κΆŒν•œ, 데이터 κ°€μ‹œμ„±) λ“±μ˜ μž…λ ₯ νŒŒλΌλ―Έν„°λ₯Ό κ²€μ¦ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. λ˜ν•œ FluentValidation으둜 κ΅¬ν˜„λ©λ‹ˆλ‹€.

μΏΌλ¦¬μ—μ„œμ˜ 일반적인 μœ νš¨μ„± 검사 κ·œμΉ™

  • GreaterThanOrEqualTo λ˜λŠ” LessThanOrEqualTo β€” λ‚ μ§œ λ“±μ˜ λ²”μœ„ 필터에 μ‚¬μš©λ©λ‹ˆλ‹€.
  • Length β€” μ΄λ¦„μ΄λ‚˜ 이메일 λ“± ν…μŠ€νŠΈ 필터에 μ‚¬μš©λ©λ‹ˆλ‹€.
  • InclusiveBetween β€” νŽ˜μ΄μ§€λ‹Ή ν•­λͺ© μˆ˜μ™€ 같은 νŽ˜μ΄μ§• νŒŒλΌλ―Έν„°μ— μ‚¬μš©λ©λ‹ˆλ‹€.

쿼리 ν•Έλ“€λŸ¬

쿼리 ν•Έλ“€λŸ¬λŠ” λ¦¬ν¬μ§€ν„°λ¦¬λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ μ»¨ν…μŠ€νŠΈλ₯Ό μ‘°νšŒν•˜κ³  μ΅œμ ν™”λœ ν”„λ‘œμ μ…˜μ„ λ°˜ν™˜ν•˜λŠ” 역할을 ν•˜λ©°, 도메인 μ—”ν‹°ν‹° 전체λ₯Ό λ‘œλ“œν•˜λŠ” 것을 ν”Όν•΄μ•Ό ν•©λ‹ˆλ‹€. Linoμ—μ„œλŠ” .Select()와 같은 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ›ν•˜λŠ” DTO ν˜•μ‹μœΌλ‘œ 직접 λ§€ν•‘ν•˜λŠ” ν”„λ‘œμ μ…˜ 방식을 ꢌμž₯ν•©λ‹ˆλ‹€. μ΄λŠ” νš¨μœ¨μ„±κ³Ό μ„±λŠ₯ ν–₯상에 도움이 λ©λ‹ˆλ‹€.

쿼리 결과

Linoμ—μ„œλŠ” 쿼리 κ²°κ³Όκ°€ 항상 QueryResult 접미사가 뢙은 record둜 ν‘œν˜„λ©λ‹ˆλ‹€. 이 κ·œμΉ™μ€ 응닡 μœ ν˜•μ΄ λͺ©λ‘(νŽ˜μ΄μ§• 포함 여뢀와 관계없이)이든, 단일 상세 ν•­λͺ©μ΄λ“  상관없이 μ μš©λ©λ‹ˆλ‹€.

CLI둜 쿼리 μƒμ„±ν•˜κΈ°

μ»€λ§¨λ“œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, LinoλŠ” λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

lino query new

λ§ˆλ²•μ‚¬λŠ” λ‹€μŒ 정보λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ β€” 쿼리λ₯Ό 생성할 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.
  • λͺ¨λ“ˆ β€” ν•΄λ‹Ήλ˜λŠ” 경우 도메인 λͺ¨λ“ˆμ„ μ§€μ •ν•©λ‹ˆλ‹€.
  • μ—”ν‹°ν‹° β€” 쿼리가 연결될 μ—”ν‹°ν‹° λ˜λŠ” μ• κ·Έλ¦¬κ²Œμ΄νŠΈ (선택 사항).
  • 쿼리 이름 β€” 예: GetOrderById λ˜λŠ” ListProductsByCategory.

LinoλŠ” λ‹€μŒ νŒŒμΌλ“€μ„ μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€:

  • GetOrderByIdQuery.cs
  • GetOrderByIdQueryValidator.cs
  • GetOrderByIdQueryHandler.cs
  • GetOrderByIdQueryResult.cs

쿼리에 λŒ€ν•œ μƒμ„±λœ ꡬ쑰 μ˜ˆμ‹œ

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Application/
                β”œβ”€β”€ MyApp.MyService.Application.csproj
                └── UseCases/
                    └── Orders/
                        β”œβ”€β”€ Commands/
                        |   └── ...
                        └── Queries/
                            └── GetOrderById/
                                β”œβ”€β”€ GetOrderByIdQuery.cs
                                β”œβ”€β”€ GetOrderByIdQueryValidator.cs
                                β”œβ”€β”€ GetOrderByIdQueryHandler.cs
                                └── GetOrderByIdQueryResult.cs

κ²°λ‘ 

Linoμ—μ„œ Use Cases(Commands 및 Queries)λ₯Ό μ •μ˜ν•˜κ³  κ΅¬μ‘°ν™”ν•˜λŠ” 방법을 μ΄ν•΄ν•œ ν›„, 쓰기와 읽기 λ‘œμ§μ„ λͺ…ν™•ν•˜κ²Œ λΆ„λ¦¬ν•˜μ—¬ κ²¬κ³ ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό λ§Œλ“€ μ€€λΉ„κ°€ 된 κ²ƒμž…λ‹ˆλ‹€. 개발 속도λ₯Ό 높이기 μœ„ν•΄ CLIλ₯Ό μ‚¬μš©ν•˜λ˜, λ„λ©”μΈμ˜ νŠΉμ • μš”κ΅¬ 사항에 따라 κ΅¬ν˜„μ„ 항상 κ²€ν† ν•˜κ³  μ‘°μ •ν•˜μ„Έμš”.

λ‹€μŒμœΌλ‘œλŠ” 데이터 지속성, 도메인 이벀트 및 인프라 μ„œλΉ„μŠ€ 처리 방법을 νƒκ΅¬ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•„ν‚€ν…μ²˜ 전체λ₯Ό κ΅¬μ„±ν•˜μ„Έμš”.

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