본문 바로가기

Design Patterns5

Memoization Pattern 메모이제이션(Memoization)은 동일한 계산을 반복해야 할 경우, 결괏값을 메모리에 저장해 두었다가 꺼내어 씀으로써 중복 계산을 방지하는 기법입니다. 딱 들어도 캐싱과 유사한 건가? 생각이 드는데, 메모이제이션은 넓게 말해서 캐싱의 일종으로 볼 수 있습니다. 좀 더 엄밀히 말하면, 최적화의 특정 사례라고 할 수 있습니다. 순수한 함수형 프로그래밍에서는 메모이제이션을 강력한 최적화 기법으로 소개하며, 내부적으로 자동으로 메모이제이션이 수행됩니다. 일반적으로 함수 레벨에서 캐시하는 것을 지칭하는 경우가 많습니다. 메모이제이션 vs 동적 계획법 vs 타뷸레이션 메모이제이션 : 계산이 필요한 순간 계산해서 저장하는 방식(Lazy-Evaluation) 동적 계획법 : 저장했던 값을 재활용해서 사용하는 방식 .. 2020. 11. 15.
[CQRS] CQRS 어떻게 사용할까? 어떻게 사용할까? 앞선 글에서 다루었듯, CQRS & Event Sourcing의 구조는 아래와 같았습니다. 이러한 구조로 이루어진 아주 간단한 애플리케이션을 작성해 보도록 하겠습니다. 구현을 위한 환경은 아래와 같습니다. Web Application - Spring Boot Database - MongoDB Event Broker - Kafka 게시물을 삽입하기 위한 Board Command Service와 게시물 조회를 위한 Board Query Service, 두 가지 프로젝트를 만들겠습니다. (매우 간단한 예제이므로 Command Event Subscriber는 별도로 서비스를 만들지 않고 Query Service에서 함께 처리하도록 하겠습니다. ) 먼저 Board Command Applicati.. 2020. 10. 12.
[CQRS] CQRS는 어떻게 적용할까? 어떻게 적용할까? 전통적인 CRUD 시스템은 아래와 같이 계층 구조로 구성되어 있습니다. 이러한 시스템 구조에 CQRS를 적용하기 위한 방법은 크게 3가지가 있습니다. (1) Simple CQRS Architecture 데이터베이스는 분리하지 않고 모델 계층만 커맨드와 쿼리로 분리합니다. 분리된 모델은 각자의 도메인 계층에 대해서만 모델링하기 때문에 단순하게 구현할 수 있습니다. 그러나 여전히 DB 사용에 대한 성능상의 문제는 개선이 되지 않습니다. (2) CQRS with separated persistence mechanisms Simple 구조와 비교하여, 커맨드용 디비와 쿼리용 디비를 분리하여 별도의 브로커를 두어 두 디비 간의 데이터를 동기화합니다. 이렇게 구성하면 데이터를 조회하고자 하는 서비.. 2020. 10. 12.
[CQRS] CQRS는 언제/어디서 사용할까? 언제/어디서 사용할까? 여느 패턴과 마찬가지로, CQRS 역시 모든 시스템에서 항상 유용한 것은 아닙니다. 시스템을 작고 집중된 부분으로 분리하여 구조화하고 설계한 방식이 아니라면, 즉시 CQRS를 도입하는 것은 눈에 띄는 이점 없이 복잡성을 증가시킬 수 있습니다. 이 경우, 문제가 명확하고 작은 부분으로 분리될 수 있는 명확한 Boundary를 찾는 것부터 시작해야 하며, 보통의 경우 이런 Boundary를 찾아 관리하는 가장 좋은 방법은 DDD라고 이야기합니다. 즉, 시스템의 특정 부분에서만 CQRS를 적용하는 것이 좋으며 시스템 전체에서 사용하는 것은 권장하지 않습니다. DDD에서는 이런 시스템 특정 부분을 BoundedContext라고 이야기하며, 각 Bounded Context가 어떻게 모델링 .. 2020. 8. 6.
[CQRS] CQRS(Command and Query Responsibility Segregation)란? CQRS란? CQRS란 Command and Query Responsibility Segregation의 줄임말로, Command(Create, Update, Delete)와 Query(Read)의 책임을 분리하자는 패턴입니다. 대부분 DB 트랜잭션은 DB로부터 데이터를 읽어 들여 화면에 뿌려주는 것입니다. 이 과정에서 DB에서 데이터를 읽는 시점과 화면에 렌더링 되는 시점은 반드시 차이가 생기기 마련입니다. 즉, 렌더링 하는 데이터는 이미 실제 데이터와 차이가 생기게 되는 것입니다. CQRS 패턴은 이 점을 인지하고, 굳이 하나의 DB안에서 CRUD의 Read 기능과 나머지 CUD(Create, Update, Delete) 기능을 공존시키는 거의 의미가 없다고 말합니다. 어차피 Read의 결과물은 정도.. 2020. 8. 5.