CQRS 패턴을 Redux 와 비교

CQRS 패턴을 Redux 와 비교

CQRS 패턴과 Redux 패턴의 플로우를 비교해 보면 크게 다르지 않다라는걸 알 수 있다.

CQRS Redux

커맨드 모델:

Mutation(변이) 위한 Request (동작을 수행하고 상태 변경을 일으킴)

  • 리덕스에서는 액션 디스패치 개념과 동일 (액션을 디스패치 하게 되다면 새로운 커맨드를 서브밋 하게 된다.)

CQRS (Commands)

1
2
3
4
addPost({
title: string,
body: string
});

Redux (Action)

1
2
3
4
5
6
7
const addPost = {
type: 'ADD_POST',
payload: {
title: string,
body: string
}
};

쿼리 모델:

실제 데이터를 fetch 를 하는 동작

  • 리덕스에서는 셀렉터 역할과 동일

CQRS (Query)

1
listPost(): Array<Post>

Redux (Selector)

1
const listPost = useSelector((state) => state.posts);

도메인 이벤트:

변화를 일으키는 행위의 자체

  • 리덕스에서는 액션과 동일하나 리듀서에서 처리된 이후의 이벤트라고 불릴 수 있다.

CQRS (Domain Events)

1
2
3
4
5
6
7
8
Event({
type: PostAdded,
data: {
id: string,
title: string,
body: string
}
});

Redux (Action)

1
2
3
4
5
6
7
const addPost = {
type: 'ADD_POST',
payload: {
title: string,
body: string
}
};

어그리게이션:

DDD 에서 메인 패턴, 모델의 작은 조각을 표현

  • 리덕스에서는 리듀서의 역할이라고 볼 수 있다.

CQRS (Aggregate)

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstact class Aggregate
{
public Guid Id { get; protected set; }
public void ApplyEvent(Event e)
{
var eventType = e.GetType();
var handler = GetType()
.GetMethod(“Apply”, new[] {eventType});
handler.Invoke(this, new object[] {e});
}
protected List<Event> NewEvents { get; private set; }
public Event[] GetNewEvents() => NewEvents.ToArray();
}

Redux (Reducer)

1
2
3
4
5
6
7
8
9
10
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}

참조

공유하기