CQRS가 과도하게 엔지니어링되지 않습니까?


15

나는 아직도 좋은 옛날 저장소를 기억합니다. 그러나 저장소는 시간이 지남에 따라 못 생겼습니다. 그런 다음 CQRS가 주류를 얻었습니다. 그들은 좋았고, 신선한 공기를 마셨다. 그러나 최근에 나는 컨트롤러의 Action 메소드 (특히 액션이 자체적으로 일종의 명령 / 쿼리 처리기 인 Web Api)에서 로직을 유지하지 않는 이유를 반복해서 묻고 있습니다.

이전에는 그에 대한 명확한 답을 얻었습니다. 모든 단일 한 싱글 톤과 전체적으로 추악한 ASP.NET 인프라로 Controller를 테스트하기가 어렵 기 때문에 테스트를 위해 수행합니다. 그러나 시간이 바뀌었고 현재 ASP.NET 인프라 클래스는 훨씬 더 단위 테스트에 익숙합니다 (특히 ASP.NET Core에서).

일반적인 WebApi 호출은 다음과 같습니다. 명령이 추가되고 이에 대한 SignalR 클라이언트에 알림이 표시됩니다.

public void AddClient(string clientName)
{
    using (var dataContext = new DataContext())
    {
        var client = new Client() { Name = clientName };

        dataContext.Clients.Add(client);

        dataContext.SaveChanges();

        GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client);
    }
}

쉽게 단위 테스트 / 모의 할 수 있습니다. 또한 OWIN 덕분에 로컬 WebApi 및 SignalR 서버를 설정하고 통합 테스트를 할 수 있습니다 (그리고 매우 빠릅니다).

최근에는 성가신 Commands / Queries 핸들러를 작성하려는 동기가 점점 줄어들었고 웹 API 작업에서 코드를 유지하는 경향이 있습니다. 논리가 반복되거나 실제로 복잡하고 분리하려는 경우에만 예외를 만듭니다. 그러나 내가 옳은 일을하고 있는지 확실하지 않습니다.

일반적인 최신 ASP.NET 응용 프로그램에서 논리를 관리하는 가장 합리적인 방법은 무엇입니까? 코드를 명령 및 쿼리 처리기로 옮기는 것이 합리적입니까? 더 나은 패턴이 있습니까?

최신 정보. DDD-lite 방식에 대한 이 기사 를 찾았습니다 . 따라서 코드의 복잡한 부분을 명령 / 쿼리 처리기로 옮기는 접근법을 CQRS-lite라고 할 수 있습니다.


1
CQRS가 어떻게 더 많은 테스트를 할 수 있는지 / 싱글 톤 / 컨트롤러 등의 도움이되는지는 알지 못합니다. 그들은 크게 관련이 없습니다. 또한 (카운터?) 예제에서 여전히 명령을 작성하고 있습니다.
illa 31

코드를 인프라 코드로 유지하면 (예 : 클라이언트 IP 주소 얻기) 테스트하기가 어렵습니다. 논리를 쿼리 / 명령으로 분리하면 훨씬 쉽습니다. 코드 샘플은 약간 혼란 스러웠으므로 업데이트했습니다.
SiberianGuy

1
쿼리와 명령에는 논리가 없습니다. 그들은 바보 같은 DTO입니다. 그런 다음 명령 / 쿼리 처리기 가 있지만 응용 프로그램 서비스, 인터랙 터, 비즈니스 서비스와 정확히 동일합니다. 비 CQRS 컨텍스트에서 이름을 지정합니다. 응용 프로그램 / 사용 사례 논리를 컨트롤러와 별도의 개체에 배치하는 것은 CQRS에 특정한 것이 아닙니다.
guillaume31

또한 Singleton vs 주입 된 의존성 문제는 CQRS와 완전히 직교합니다. 리포지토리 싱글 톤을 호출하는 CommandHandler 싱글 톤을 호출하는 컨트롤러를 가질 수 있습니다.
guillaume31

1
@ guillaume31에서 CQRS는 리포지토리 / 애플리케이션 서비스 호출보다 성가신 경향이 있습니다. 그들은 보통 2-3 개의 클래스 (쿼리, queryhandler, queryresult), 인프라 등을 필요로합니다.
SiberianGuy

답변:


17

CQRS는 비교적 복잡하고 비용이 많이 드는 패턴입니까? 예.

과잉 엔지니어링인가? 절대적으로하지.

Martin Fowler가 CQRS에 대해 이야기 하는 원본 기사에서 CQRS가 적용되지 않는 곳에서 CQRS를 사용하지 않는 것에 대한 많은 경고를 볼 수 있습니다.

다른 패턴과 마찬가지로 CQRS는 일부 지역에서는 유용하지만 다른 지역에서는 유용하지 않습니다.

CQRS는 모든 관련자들에게 상당한 정신적 도약이므로 혜택이 가치가없는 한 해결되지 않아야합니다 .

CQRS를 성공적으로 사용했지만 지금까지 내가 본 대부분의 사례는 그리 좋지 않았습니다 ...

이러한 이점에도 불구하고 CQRS 사용에 매우 신중해야합니다 .

... 그런 시스템에 CQRS를 추가하면 상당히 복잡 해질 수 있습니다 .

위의 강조.

응용 프로그램이 오버 엔지니어링 된 CQRS가 아닌 CQRS를 모든 용도로 사용하는 경우 응용 프로그램입니다. 이는 쓰기 동시성이 중요한 문제 일 수있는 고성능 / 대용량 응용 프로그램과 같은 특정 문제를 해결하기위한 훌륭한 패턴입니다.

전체 응용 프로그램이 아니라 응용 프로그램의 일부일 수도 있습니다.

내 작업의 실제 사례 인 주문 입력 시스템에서 CQRS를 사용하여 주문을 잃을 수 없으며 특정 시간에 다른 소스에서 동시에 수천 개의 주문이 나오는 스파이크가 발생합니다. CQRS는 우리가 시스템을 활기차고 반응 적으로 유지하는 데 도움을 주면서 백엔드 시스템을 확장하여 필요할 때 더 빠르게 (더 많은 백엔드 서버) 처리하고 필요하지 않을 때 더 느리게 / 저렴하게 처리 할 수 ​​있도록했습니다.

CQRS는 여러 액터가 동일한 데이터 세트에서 협업하거나 동일한 자원에 쓰는 문제에 적합합니다.

그 외에는 단일 문제를 해결하기 위해 만든 패턴을 모든 문제에 전파하면 더 많은 문제가 발생합니다.


다른 유용한 링크들 :

http://udidahan.com/2011/04/22/when-to-avoid-cqrs/

http://codebetter.com/gregyoung/2012/09/09/cqrs-is-not-an-architecture-2/


3
"상대적으로 복잡하고 비용이 많이 드는 패턴"부분을 제외한 모든 것에 동의하십시오. CQRS는 단지 읽기와 쓰기를 분리합니다. 덕트 테이프, 미들웨어 / 복잡한 툴링을 사용하고 이전과 동일한 데이터베이스를 유지하여 모든 것을 처리 할 수 ​​있습니다.
illa 31

@ guillaume31, 그것은 공정한 포인트입니다. 나는 그것이 원래의 질문에서 나온 아이디어와 상당히 관련이 있다고 생각한다. 그러나 명령과 쿼리에 별도의 클래스를 사용하지 않는 작동하는 CQRS 샘플 (github이 바람직 함)을 보셨습니까? 그것이 다른 사람들이 .NET에서 CQRS를 구현하는 방법을 보려고 할 때 찾은 것입니다.
SiberianGuy

예,하지만 과도하게 엔지니어링되지는 않습니다. 패턴의 기본 전제입니다. 쿼리를 쓰기에서 분리하고 도메인에서 모델을 읽습니다.
guillaume31

CQRS 접근 방식은 많은 상황에서 과도하게 죽일 수 있지만 완전히 다른 이야기입니다. Q에서 CQRS로 잘못 지적한 모든 작은 기술적 세부 사항 때문에 과잉하지는 않습니다. CQRS가 제공하는 것을 항상 필요로하지 않기 때문에 과잉입니다.
guillaume31

Fowler의 요점은 특정 요점에만 유효하다고 생각합니다. SQL Views는 CQRS의 한 유형이며 오랜 세월 동안 우리와 함께 있으며 아무도 매우 복잡하다고 말합니다. CQRS에는 이벤트 소싱 프로젝션과 같은 여러 가지 풍미가 있기 때문에 일부 영역에서는 복잡해 보일 수 있지만 다른 영역에서는 사소한 것일 수 있습니다.
Alexey Zimarev

3

CQRS는 리포지토리를 일대일로 대체하는 것이 아니라 복잡하고 비용이 많이 드는 패턴이기 때문에 일부 경우에만 유용합니다.

Udi Dahan의 장점은 다음과 같습니다.

CQRS (및 이벤트 소싱도)를 사용하는 대부분의 사람들은 그렇게하지 않아야합니다.

[...]

CQRS를 보여주는 온라인에서 볼 수있는 대부분의 샘플 응용 프로그램이 구조적으로 잘못되었다고 말해서 죄송합니다. 또한 엔터티 스타일의 집계 루트 CQRS 모델로 안내하는 프레임 워크에 매우주의해야합니다.

( 소스 )

마틴 파울러 :

[...] CQRS 사용에 대해 매우 신중해야합니다 . 많은 정보 시스템은 읽는 것과 동일한 방식으로 업데이트되는 정보베이스의 개념에 잘 맞으며, 그러한 시스템에 CQRS를 추가하면 상당한 복잡성이 발생할 수 있습니다.

( 소스 )

마지막으로 Greg Young은

CQRS는 아키텍처 패턴이라고 할 수 있습니다.

[...]

대부분의 건축 패턴이 모든 곳에 적용하기에는 좋지 않다는 것을 이해하는 것이 매우 중요합니다. 건축 지침에 건축 패턴이 보이면 문제가있을 수 있습니다

[...]

이벤트 소싱을 사용하는 사람들에게 가장 큰 실패는 어디에서나 사용하려고 시도한다는 것입니다.

( 소스 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.