C#, .NET Core, React - Project [3]

yoneeki·2024년 4월 29일

dotNetReact

목록 보기
3/7

Clean Architecture Pattern

  • Independent from frameworks
  • Testable
  • Independent from the interface
  • Independent from the database

CQRS Pattern

CQRS는 Command Query Responsibility Segregation의 약자로, 명령(Command)과 조회(Query)를 위한 책임을 분리하는 패턴입니다. 이 패턴은 소프트웨어 시스템의 구조를 단순화하고 유연성을 높이는 데 도움이 됩니다.
CQRS 패턴에서는 데이터를 조회하는 것과 데이터를 변경하는 것을 별도의 모델로 다룹니다. 간단히 말해, 읽기 모델(Query 모델)과 쓰기 모델(Command 모델)을 분리하여 관리합니다.
CQRS 패턴은 복잡한 도메인 모델과 대규모 시스템에서 특히 유용합니다. 그러나 이 패턴을 도입할 때에는 추가적인 복잡성과 오버헤드를 고려해야 합니다. 따라서 각 프로젝트나 상황에 맞게 적절히 판단하여 도입하는 것이 중요합니다.

  • 명령(Command) 모델: 데이터 변경을 처리하는 모델로, 시스템의 상태를 변경하는 작업을 수행합니다. 보통 이 모델은 상태 변경에 대한 도메인 로직을 포함하고, 데이터 저장소에 쓰기 작업을 수행합니다.
  • 조회(Query) 모델: 데이터를 조회하는 모델로, 시스템의 상태를 읽는 작업을 수행합니다. 이 모델은 쓰기 모델과 분리되어 있으며, 보통 읽기 최적화를 위해 데이터를 다양한 방식으로 구조화합니다.
  • 분리된 저장소: CQRS 패턴에서는 명령 모델과 조회 모델을 위한 별도의 데이터 저장소를 사용하는 것이 일반적입니다. 이를 통해 쓰기 작업과 읽기 작업의 성능 및 확장성을 개선할 수 있습니다.
  • 비동기 통신: 명령 모델과 조회 모델 간의 통신은 일반적으로 동기적이 아니라 비동기적으로 이루어집니다. 이를 통해 시스템의 응답 시간을 최적화하고 확장성을 향상시킬 수 있습니다.

Command And Query

Command

  • Does Something
  • Modifies State
  • Should not return a value

Query

  • Answers a question
  • Does not modify State
  • Should return a value

Single Database

  • CQRS가 싱글 데이터베이스의 문제점을 개선할 수 있다. (Scalability 제한 혹은 병목 현상, 데이터 일관성 유지의 어려움 등)

CQRS Read/Write Database

  • Red Hat 문서 참조


  • 말하자면, 쓰고 읽는 것이 둘 다 중요하고 복잡한 일이니, 리딩에 최적화 된 데이터베이스, 작성에 최적화 된 데이터베이스를 따로 각각 만들어서 효율적으로 잘 관리하자는 것이다.

Query

MediatR 설치

  • MediatR은 닷넷 개발에서 사용되는 CQRS (Command Query Responsibility Segregation) 패턴을 구현하는 데 도움이 되는 라이브러리입니다. 이 라이브러리는 Mediator 디자인 패턴을 기반으로 하며, 의사소통을 추상화하고 요청과 처리를 분리하여 코드의 의존성을 줄이는 데 사용됩니다.
  • Mediator 디자인 패턴은 객체 간의 상호 작용을 중재하는 데 사용되는 행동 패턴입니다. 이 패턴은 객체 간의 직접적인 통신을 방지하고, 중재자를 통해 통신할 수 있도록 합니다. 이를 통해 시스템의 결합도를 낮추고 유지 보수성을 향상시킬 수 있습니다.
  • Application 폴더에 설치

Query Handler

  • 위 코드는 CQRS(Command Query Responsibility Segregation) 패턴을 사용하여 구현된 기능입니다. 이 코드는 MediatR 라이브러리를 사용하여 Query Handler를 구현하고 있습니다.
  • Query 클래스: 이 클래스는 MediatR의 IRequest 인터페이스를 구현합니다. 이는 MediatR 라이브러리에서 요청을 나타내는 데 사용됩니다. 이 클래스는 데이터베이스에서 활동을 가져오기 위한 요청을 나타냅니다.
  • Handler 클래스: IRequestHandler<Query, List> 인터페이스를 구현하는 클래스입니다. 이 인터페이스는 MediatR에서 요청을 처리하는 데 사용됩니다. 요청이 들어오면 Handler 클래스는 해당 요청을 처리하고 결과를 반환합니다. 이 경우에는 데이터베이스에서 모든 활동을 가져와서 반환합니다.
  • Handle 메서드 내에서는 주어진 쿼리에 대한 처리 로직이 구현되어 있습니다.
  • DataContext를 주입받아 사용하여 데이터베이스에 액세스합니다.
    • Handle 메서드는 비동기로 작성되어 있으며, 요청을 처리하고 결과를 반환합니다.

AutoMapper

HTTP Methods & .NET 의존성 주입

  • List는 dataContext를 주입받아 데이터베이스와 소통하고 있음

profile
Working Abroad ...

0개의 댓글