본문 바로가기
정보모음

CQRS 패턴: 간단하게 알아보기

by coori-info 2023. 6. 2.

1. CQRS 패턴이란?

 

 

 

CQRS는 Command Query Responsibility Segregation의 약자로, 명령과 조회의 책임을 분리하는 디자인 패턴입니다. 이 패턴은 데이터베이스를 조회하는 부분과 수정하는 부분을 분리함으로써 응용프로그램의 성능과 확장성을 높일 수 있습니다.

 

CQRS 패턴에서는 명령(Command)과 조회(Query)를 분리하여 처리합니다. 명령은 Create, Update, Delete와 같이 데이터를 변경하는 요청을 처리하고, 조회는 그렇지 않은 요청을 처리합니다. 이 방식으로 데이터를 처리하는 것은 데이터가 변경될 때마다 저장소에서 조회하는 것이 아니라, 변경된 데이터를 직접 사용하기 때문에 성능이 개선됩니다.

 

또한, CQRS 패턴은 확장성 문제에서도 큰 장점을 가지고 있습니다. 명령 부분과 조회 부분의 서비스를 분리함으로써, 각각의 서비스를 별도로 확장할 수 있습니다. 이러한 방식으로, 데이터베이스의 부하를 분산하여 성능 문제를 해결할 수 있습니다.

 

하지만 CQRS 패턴은 단순한 CRUD 애플리케이션에서는 적용하기 어려울 수 있습니다. 이 패턴은 복잡한 도메인 모델과 복잡한 사용자 인터페이스와 함께 사용할 때 가장 효과적이며, 데이터 무결성이 중요한 경우에 적합합니다.

 

 

 

2. CQRS 패턴의 구조

 

 

CQRS 패턴은 Command와 Query를 분리하여 구현하는 패턴이다. 이러한 구조로 인해 두 영역의 책임과 역할을 명확히 결정할 수 있다.

 

Command 영역은 시스템의 상태를 변화시키기 위한 로직을 담당한다. 이 영역에서는 쓰기 작업(Create, Update, Delete)을 처리하며 해당 작업을 처리한 후, 이벤트(Event)를 발생시켜 Query 영역에게 상태의 변화를 알린다. Command 영역의 로직은 비즈니스 로직을 포함한다.

 

Query 영역은 시스템 상태의 조회 작업을 전담한다. 이러한 영역에서는 읽기 작업(Read)을 처리하며, 데이터를 반환하는 작업을 수행한다. 이때, 반환된 데이터는 사용자에게 보여지게 된다. Query 영역은 Command 영역에서 발생한 이벤트를 수신하여 해당 이벤트의 내용에 따라 자신의 데이터를 갱신하고 필요한 경우 사용자에게 변경된 상태를 보여준다.

 

이 두 영역은 각각의 역할에 맞게 분리하면 시스템의 확장성과 유연성을 높일 수 있다. Command와 Query를 분리한 형태로 구현하면, Command 작업과 Query 작업이 서로 영향을 주지 않기 때문에 설계가 더욱 단순해진다. 또한, 시스템의 응답 시간도 빨라진다.

 

 

 

3. CQRS 패턴의 장단점

 

 

 

[3. CQRS 패턴의 장단점]

 

장점:

 

1. 분리된 모델링: 명령과 조회를 분리함으로써 시스템의 모델링이 단순화되고 명확해진다. 또한 더 나은 가독성과 확장성을 제공하므로 유지보수 비용이 낮아진다.

 

2. 최적화: 조회와 명령을 분리함으로써 인덱싱, 캐싱, 분산 처리 및 비동기 처리를 수행하여 시스템이 더 빠르게 운영되도록 한다.

 

3. 높은 확장성: CQRS 패턴을 사용하면 시스템이 수평 확장을 쉽게 처리할 수 있기 때문에 큰 규모의 운영이 가능하다.

 

단점:

 

1. 보안: 분리된 조회 모델에 액세스하는 경우에만 적용되는 보안 및 권한 모델을 구현해야하므로 복잡성이 증가할 수 있다.

 

2. 구현 복잡성: 코드를 더 복잡하게 만들어 사용자를 혼동시킬 수 있으며, 추가적인 좌우간의 의사소통 비용이 필요할 수 있다.

 

3. 높은 초기 비용: 구현 초기에는 CQRS 패턴을 구현하기 위해 추가 비용이 발생할 수 있으므로 비즈니스 요구사항과 우선순위에 따라 판단해야 한다.

 

 

 

4. CQRS 패턴의 예제

 

 

 

CQRS 패턴은 간단한 예제를 통해 이해할 수 있습니다.

 

예를 들어, 온라인 쇼핑몰에서 상품 목록 페이지와 상세 페이지가 있다고 가정합니다. 상품 목록 페이지에서는 상품의 이미지, 이름, 가격 등과 같은 요약된 정보를 보여주고, 상세 페이지에서는 상품에 대한 자세한 정보와 구매 정보 등을 보여줍니다.

 

기존의 CRUD 모델에서는 상품 목록 페이지와 상세 페이지를 모두 조회(read)의 개념으로 처리합니다. 하지만 이를 CQRS 패턴으로 변경하면 두 페이지를 각각 다른 명령과 쿼리로 처리할 수 있습니다. 즉, 조회(read)의 방식과 처리를 명령(command)의 방식과 처리로 나누어 구현하는 것입니다.

 

이를 위해 우선 명령에 대한 인터페이스와 쿼리에 대한 인터페이스를 따로 작성해야 합니다. 이후 명령과 쿼리를 처리할 핸들러(handler)를 작성하고, 조회만 하는 경우에는 쿼리 핸들러만 사용하게 됩니다.

 

따라서 상품 목록은 쿼리를 사용하여 보여주고, 상세 페이지에서는 명령을 사용하여 예를 들어 상품을 구매하는 등의 기능을 처리합니다.

 

결과적으로 CQRS 패턴을 적용하면, 다음과 같은 이점을 얻을 수 있습니다.

 

- 읽기 쿼리와 쓰기 명령을 명확하게 구분하여 코드를 작성할 수 있습니다.

 

- 읽기 작업과 쓰기 작업에 대한 최적화가 가능합니다.

 

- 시스템의 확장성이 좋아집니다.

 

- 복잡한 비즈니스 로직의 처리가 용이해집니다.

 

 

 

5. CQRS 패턴 적용 시 고려할 사항

 

 

5.1. 복잡성 증가

 

CQRS 패턴은 단순한 CRUD(Create, Read, Update, Delete) 작업에서 벗어나 다른 패턴들과 복합적으로 적용될 수 있다는 특징이 있다. 이에 따라 시스템의 복잡도가 증가할 가능성이 있으므로, 적용 시 적절한 대안을 강구해야 한다.

 

5.2. 데이터 일관성 유지

 

CQRS 패턴은 데이터의 읽기, 쓰기, 갱신 단계를 분리하기 때문에, 데이터 일관성을 유지하는 것이 중요하다. 따라서, 적절한 코딩 기법과 테스트 방법을 사용하여 데이터 일관성을 보장할 수 있도록 할 필요가 있다.

 

5.3. 적합한 상황에서만 사용

 

CQRS 패턴은 모든 시스템에 적용되지는 않는다. 다른 패턴과의 결합 등 상황에 따라 적합성이 달라지므로, 현재 시스템의 상황과 요구 사항을 분석해 적합한 패턴을 선택해야 한다.

 

5.4. 성능 문제

 

CQRS 패턴은 시스템의 성능을 높일 수 있는 장점이 있지만, 적절한 인프라 및 설계를 하지 않으면 오히려 성능 문제를 야기할 수도 있다. 따라서, 적합한 하드웨어 및 소프트웨어 환경에서 CQRS 패턴을 적용해야 한다.

 

5.5. 개발자의 경험에 따른 유연한 적용

 

CQRS 패턴은 경험이 필요한 패턴 중 하나이다. 개발자가 CQRS 패턴을 정확하게 이해하고 경험한 경우, 유연하게 적용할 수 있다. 따라서, CQRS 패턴을 적용할 때는 주요 개발자의 경험 및 역량을 고려하여 설계해야 한다.

 

 

 

댓글