CQRS(Command and Query Responsibility Segregation, 명령과 쿼리의 역할 분리) 패턴은 데이터 저장소에 대한 읽기 및 업데이트 작업을 분리하여 구현하는 것으로 이렇게 하면 성능, 확장성 및 보안을 최대화할 수 있는 장점이 있다1.
CQRS는 정보를 업데이트할 때와 조회할 때 다른 모델을 사용하는 것이 핵심이다. 다만, 일부 경우에는 이점이 있지만, 대부분의 경우에는 CQRS를 적용하면 복잡성이 높아지는 위험성이 있다. CQRS는 시스템의 Bounded Context2에서만 사용돼야 하고, 시스템 전체에서 사용해서는 안 된다. 이러한 사고방식은 각 Bounded Context는 개별적으로 모델링을 해야 한다는 의미다3.
아래의 예제는 닷넷 API 프로젝트에 MediatR 패키지를 사용하여 CQRS를 구현한 간단한 예제이다. ‘Jonathan Williams’의 강좌4 를 참고하였으며 자세한 전체 예제는 GitHub(CQRSInDotnetCore)5에서 볼 수 있다.
템플릿 메타프로그래밍(template metaprogramming)은 템플릿을 사용하는 프로그래밍 기법으로, 컴파일러에게 프로그램 코드를 생성하도록 하는 방식이다. 이러한 기법은 컴파일 시점에 많은 것을 결정하도록 하여, 실행 시점의 계산을 줄여준다. 이 기법은 C++ 프로그래밍 언어에서 주로 사용된다1.
TMP는 버그를 찾기 쉽지도 않고 구현도 어렵지만, 사용하는 이유는 많은 C++ 라이브러리들이 TMP 를 이용해서 구현되었고, TMP 를 통해서 컴파일 타임에 여러 오류들을 잡아낼 수도 있으며 속도가 매우 중요한 프로그램의 경우 TMP 를 통해서 런타임 속도도 향상2 시킬 수 있기 때문이다.
TMP에 대한 살펴볼 만한 실제 사례는 C++Builder의 template 버그 문제로 볼랜드포럼의 글 <아래 컴파일 에러는 엠바에서 템플릿코드를 엉터리로 구현해 놨기 때문>3에서 볼 수 있다.
아래의 예제는 콜라츠 추측(Collatz)을 C#과 C++ 언어로 각각 구현한 예제4를 보여주고 TMP를 사용한 C++의 소스가 컴파일 타임에서 C#과 어떠한 차이가 있는지 보여준다.
마이크로소프트(MS)가 Rust에서 영감을 받은 신규 프로그래밍 언어 개발(Verona Project)에 매진하고 있다. 프로젝트 베로나는 메모리 관리, 구획화 및 보안 샌드박스를 통해 안전한 시스템을 구축하기 위한 프로젝트다1. Rust는 최근에 스택오버플로우에서 좋아하는 개발언어 순위 1위에 오르기도 하였다2. Rust는 C++의 성능과 더불어 메모리 안정성을 확보한 언어이다.
Rust 컴파일러는 변수의 소유권을 컴파일 단계에서 모두 추적할 수 있다. 이를 이용해 메모리 할당과 해제를 오버헤드 없이 암묵적으로(Implicit) 수행함으로써, Rust는 런타임 오버헤드가 없는 안전한 메모리 관리를 이루어낸다3.
Microsoft 공식 웹사이트에서는 Project Verona를 ‘a programming language for the modern cloud’로 소개하고 있다4.