DI(Dependency Injection)도 디자인 패턴의 일종이다. A 클래스의 함수를 B 클래스에서 호출하기 위해서는 클래스 의존성을 가져야 한다. 하나의 클래스를 수정할 때 다른 하나의 클래스도 수정해야 하는 높은 결합도(coupling) 문제가 발생한다1. 이러한 의존성을 제거하기 위해 의존성 제거 후 다시 의존성을 주입해주는 것이다2.
클래스의 생성자, Interface를 사용하여 Interface에만 의존하게 하면 Interface만 있으면 된다. 이런 결과로 다른 개발자가 어떤 클래스를 완성할 때까지 기다릴 필요가 없음으로 개발속도가 빨라질 수 있다.
아래의 예제3는 C# Console Application이며 .NET 버전은 5.0을 사용했다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 필요한 객체를 받아서 사용하는 것이다.
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#과 어떠한 차이가 있는지 보여준다.