본문 바로가기

Book

(20)
명령-질의 책임 분리(CQRS) 논란의 여지가 없는 부분, 읽기(질의)와 쓰기(명령) 은 다르다. 다르게 취급해야 함. 근데 왜 이렇게 해야 하나? 이전에 짧게 봤던 개념인데 여기서 구체적으로 구현하는 방식 중 하나를 소개한다. 하지만 책에서 소개하는 방법은 같은 프로세스, 같은 DB 내에서 구현하는 방식을 소개함. 거기서 테이블 정도만 달라지는 방식. 12.1 쓰기 위해 존재하는 도메인 모델 지금까지 했던, 작업단위, 애그리게이트, 이벤트 패턴등은 상태를 변경할 때 규칙 적용을 강화하기 위해 존재한다. 즉 데이터를 유연하게 쓰기 위해서 도구를 만들었던 것임. 그런데 읽기는 좀 다름 12.2 가구를 구매하지 않는 사용자 결론적으로 무엇을 해도 현실은 소프트웨어 시스템과 일관성이 없다고 함. 그래서 비즈니스 프로세스가 모든 경우를 처리할..
커맨드와 커맨드 핸들러 가존에 애플리케이션의 유스케이스들을 전부 이벤트 핸들러로 변경하면서 새로운 배치 만드는 함수 같은 것들도 이벤트를 만들어서 처리함. 이게 직관적으로 보면 약간 어색해 보임. 배치가 생성도 안 됐는데 api를 호출하는 것도 이상함. 이벤트와 같은 메시지 버스를 다루지만 약간 다른 규칙으로 처리하는 커맨드를 도입함 대략 보니까 기존에 이벤트로 하던걸 커맨드라고 따로 빼서 원래 필요한 서비스작업들을 커맨드로 실제 이벤트로 처리하려 했던 것들을 이벤트로 남김. 커맨드도 메시지의 일종임. 다만 중요한점은 커맨드는 한 행위자로부터 다른 구체적인 행위자에게 전달됨. 명령형 동사구를 사용함. 커맨드는 의도를 잡아냄. 그래서 커맨드를 보내는 행위자는 커맨드 수신자가 커맨드 처리에 실패했을 때 오류 정보를 돌려받길 원함...
메시지 버스로 통합하기 이번 장에서 하려는 목표 9.2 서비스 함수를 메시지 핸들러로 리팩터링하기 그전 섹션에서 설명이 나와있지만 기존에 서비스에서 하던걸 전부 핸들러로 바꾼다 어차피 내부적으로 이벤트발생으로 처리하는 거나 엔드포인트에서 핸들러로 처리하는 거나 로직이 차이가 없음. 그리고 여기서 보면 엔드포인트에서 원시값으로 서비스 함수를 호출하던 게 핸들러로 바뀌면서 이벤트 객체로 묶여서 넘김. 그럼 저번에 언급했던 부분이 생각이 남. 객체로 보내던걸 원시 타입으로 바꿨는데 그걸 다시 객체로 묶으면 의존성이 생기는 거 아니냐? 그거에 대한 답변을 책에서 해줌 > 도메인 객체에서 기본 타입에 대한 집착을 거쳐 인터페이스로 이벤트를 사용하기까지 > OO사이클에서 사람들은 기본 타입에 대한 집착을 안티패턴으로 간주한다. 공개 AP..
오브젝트. Chapter 01 객체,설계 이전에 오브젝트 책 읽은 거 복습하면서 정리를 하는데 1장 부분의 코드나 설명들이 책의 전반적인 내용이 담겨있어서 정리해 봤다. 개념보다는 실무가 더 중요하다. 유지보수와, 설계에 관한 한 지금까지는 그러하다. 그리고 소프트웨어 규모가 커지면 커질수록 소프트웨어 설계 분야에서 이론이 실무를 추월할 가능성은 희박해 보임. 아무튼 저자는 이 책에서 좀 더 '코드'에 대해서 더 다룰 거임 01. 티겟 판매 애플리케이션 구현하기 전체적인 첫 구조는 다음과 같음 예제 코드 따로 자바로 올려져 있어서 나는 파이썬으로 작성함. 필요하다면 나중에 자바로 적긴 할 거임. class Audience: def __init__(self, bag): self.bag = bag def getBag(self): return sel..
애그리게이트와 일관성 경계 여기서는 도메인 모델을 다시 살펴보면서 불변조건과 제약에 대해 살펴보고, 도메인 모델 객체가 개념적으로나 영속적 저장소 안에서나 내부적인 일관성을 유지하는 방법을 살펴본다. 그리고 일관성 경계를 설명하고, 일관성 경계가 어떻게 유지보수 편의를 해치지 않으면서 고성능 소프트웨어를 만들 수 있게 해 주는지 살펴본다 스프레드 시트로 처리하면 안돼? 스프레드 시트 사용하면 여러 조건들을 즉 시스템의 복잡한 제약을 유지하기 어려워 규모 확장이 힘듦. 제약, 불변조건 그래서 도메인 로직의 일부는 이런 제약을 강제로 지키게 해서 시스템의 불변조건을 유지하려는 목적으로 작성됨. 불변조건을 보니까 실용주의 프로그래머가 떠올랐다. 아무튼. 제약과 불변조건은 비슷해 보이지만 비교해 보자면 제약은 모델이 취할 수 있는 상태의..
작업 단위 패턴 저장소 패턴이 영속적 저장소 개념에 대한 추상화라면 작업 단위 패턴은 원자적 연산이라는 개념에 대한 추상화. 서비스 계층에서 직접 세션과, 저장소를 불러서 작업하지 않게 해 줌으로써, 서비스 계층과 각 계층을 분리시켜줌. 책에서는 컨텐스트 매니저를 통해 구현했다. 근데 이게 뒤에서도 나오는데 기존에 세션이 하는 걸 한번 wrapping 한 느낌이다. 왜 그런지 밑에서 설명하고 그 차이와 트레이드오프를 말해준다. 밑에 예제만 봐도 알겠지만 서비스 로직를 트랜잭션 처리했다. 그 과정에서 uow는 필요한 모든 걸 갖고 있고 외부에서 호출하는 caller는 그냥 얘만 인자로 넘기면서 서비스를 호출하면 된다. 책 예제 class SqlAlchemyUnitOfWork(AbstractUnitOfWork): def _..
MySQL 퍼포먼스 최적화 (1~3장) 1.MySQL의 특징 1.1 MySQL은 전체적으로 어떻게 생겼나 1.1.1 서버엔진 DB가 SQL을 이해할 수 있도록 쿼리를 재구성하는 ‘쿼리 파싱’ 과 디스크나 메모리 같은 물리적인 저장장치와 통신하는 스토리지 엔진에 데이터를 요청하는 업무를 담당 또한 스토리지 엔진에서 받아온 데이터를 사용자 요청에 맞게 처리하거나 접근 제어, 쿼리 캐시, 옵티마이저 등의 역할을 수행한다. 즉, 물리적인 저장장치와 직접적으로 통신하는 역할을 제외하고 사용자와 MySQL 사이에서 발생하는 데이터 처리 프로세스의 대부분을 담당한다 스토리지 엔진이 물리적인 저장장치에서 데이터를 읽어오는 역할을 수행한다면, 서버엔진은 스토리지 엔진에서 가져온 데이터를 처리하는 역할을 담당한다. Table join Group By Order..
실용주의 프로그래머(7장 ~마지막) 코딩하는 동안 7장에서는 제목처럼 코딩하는 동안 우리가 신경 써야 하는 부분들을 말해준다. Topic 37 파중류의 뇌에 귀 기울이기 여기서는 변연계에서 수행되는 감정에 관한 이야기를 한다. 일반적으로 본능적인 부분에 대해서 무시하라고 많이들 얘기한다. 하지만 본능은 우리가 경험하면서 학습한 패턴에 대한 반응으로도 만들어진다. 따라서 단순히 무시할 수 없다고 한다. 감정이 왜 들었는지 우리가 흔히 하는 메타인지처럼 메타감정도 중요하다고 하는 거 같다. 나도 이 부분을 요즘에서야 중요하게 생각하는데, 내가 하는 습관이나 여러 생각들이 생각보다 감정에서 유발된다고 생각한다. 나심 탈렙이 쓴 ‘Fooled by randomness’에서도 비슷한 얘길 하는데, 아무리 잘 학습된 사람도 극한의 상황에선 결국 감정..