전체 글 45

11장 CQRS

11.1 단일 모델의 단점 조회 화면 특성상 조회 속도가 빠를수록 좋은데 여러 애그리거트의 데이터가 필요하면 구현 방법을 고민해야 한다. 이런 구현 복잡도를 낮추는 간단한 방법이 있는데 그것은 바로 상태 변경을 위한 모델과 조회를 위한 모델을 분리하는 것이다. 11.2 CQRS 시스템이 제공하는 기능은 크게 두 가지로 나눌 수 있다. 1. 상태를 변경하는 기능 2. 사용자 입장에서 상태 정보를 조회하는 기능. 도메인 모델 관점에서 상태 변경 기능은 주로 한 애그리거트의 상태를 변경한다. 상태를 변경하는 범위와 상태를 조회하는 범위가 정확하게 일치하지 않기 때문에 단일 모델로 두 종류의 기능을 구현하면 모델이 불필요하게 복잡해진다. 단일 모델을 사용할 때 발생하는 복잡도를 해결하기 위해 사용하는 방법이 있..

10장 이벤트

10.1 시스템 간 강결합 문제 바운디드 컨텍스트간의 강결합을 이벤트를 사용하면 해결 할 수 있다. 특히 비동기 이벤트를 사용하면 두 시스템 간의 결합을 크게 낮출 수 있다. 한번 익숙해지면 모든 연동을 이벤트와 비동기로 처리하고 싶을 정도로 강력하고 매력적인 것이 이벤트다. 10.2 이벤트 개요 이벤트라는 용어는 '과거에 벌어진 어떤 것'을 의미한다. 이벤트는 발생하는 것에서 끝나지 않는다. 이벤트가 발생하면 그 이벤트에 반응하여 원하는 동작을 수행하는 기능을 구현한다. 도메인 모델에 이벤트를 도입하려면 네 개의 구성요소인 이벤트, 이벤트 생성 주체, 이벤트 디스패처(퍼블리셔), 이벤트 핸들러(구독자) 를 구현해야 한다. 이벤트는 발생한 이벤트의 정보를 담는다. 이벤트 종류 : 클래스 이름으로 종류를 ..

8장 애그리거트 트랜잭션 관리

한 애그리거트를 두 사용자가 동시에 변경할 때 트랜잭션이 필요하다. 대표적인 트랜잭션 처리 방식에는 선점 잔금과 비선점 잠금의 두가지 방식이 있다. ( 비관적 잠금과 낙관적 잠금 이라는 용어로 표현하기도 한다.) 8.2 선점 잠금 먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하지 못하게 막는 방식이다. 애그리 거트에 접근 시 다른 스레드에서 접근을 블로킹 하고 트랜잭션 커밋 잠금 해제 후 접근을 허용한다. 선점 잠근은 보통 DBMS가 제공하는 행단위 잠금을 사용해서 구현한다. DBMS가 for updated와 같은 쿼리를 사용해서 특정 레코드에 한 커넥션만 접근할 수 있는 잠금 장치를 제공한다. JPA EntityManager는 LockModeType..

9장 도메인 모델과 바운디드 컨텍스트

9.1 도메인 모델과 경계 도메인을 완벽하게 표현하는 단일 모델을 만들려고 하면 오히려 모든 하위 도메인에 맞지 않는 모델을 만들게 된다. 하위 도메인마다 사용하는 용어와 의마가 다르다. 올바른 도메인 모델을 개발하려면 하위 도메인마다 모델을 만들어야 한다. 각 모델은 명시적으로 구분되는 경계를 가져서 섞이지 않도록 해야 한다. 같은 제품이라도 카탈로그 컨텍스트와 재고 컨텍스트에서 의미가 서로 다르다. 이렇게 구분되는 경계를 갖는 컨텍스트를 바운디드 컨텍스트라고 부른다. 9.2 바운디드 컨텍스트 바운디드 컨텍스트는 모델의 경계를 결정하며, 한 개의 바운디드 컨텍스트는 논리적으로 한 개의 모델을 갖는다. 이상적으로 하위 도메인과 바운디드 컨텍스트가 일대일 관계를 가지면 좋겠지만 현실은 그렇지 않을 때가 많..

7장 도메인 서비스

7.1 여러 애그리거트가 필요한 기능. 도메인 영역을 구분하다보면 하나의 에거리거트로 기능을 구현할 수 없을 때가 있다. 예) 결제 금액 계산 로직의 경우 ( 상품, 주문, 할인 쿠폰, 회원 ) 같은 내용이 필요하다. 한 애그리거트에 넣기 애매한 도메인 기능을 억지로 특정 애거리거트에 구현하면 안된다. 억지로 구현하면 자신의 책임 범위를 넘어서는 기능을 구현하기 때문에 코드가 길어지고, 외부에 대한 의존이 높아지게 되며 코드를 복잡하게 만들어 수정을 어렵게 만드는 요인이 된다. => 애그리거트의 범위를 넘어서는 도메인 개념이 애그리거트에 숨어들어 명시적으로 드러나지 않게 됨. 7.2 도메인 서비스 도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용. ( 계산 로직, 외부시스템 연동이 필요..

6장 응용 서비스와 표현 영역

6.1 표현 영역과 응용 영역 응용 영역과 표현 영역이 사용자와 도메인을 연결해주는 매개체 역활을 한다. 표현영역 - 사용자의 요청을 해석한다. 사용자가 HTTP 요청을 표현 영역에 전달. 요청받은 표현영역은 사용자가 실행하고 싶은 기능을 판별하여 응용 서비스를 실행. 응용영역 - 사용자가 원하는 기능을 제공하는 서비스. 기능을 실행하는데 필요한 입력 값을 메서드 인자로 받고 실행 결과를 리턴. 응용 서비스 메서드가 요구하는 파라미터와 표현영역이 사용자로 전달받은 데이터 형식이 일치하지 않기 때문에 표현 영역은 응용 서비스가 요구하는 형식으로 사용자 요청을 변환한다. 사용자와 상호작용은 표현영역이 처리하기 때문에, 응용 서비스는 표현 영역에 의존하지 않는다 - > 단지 기능 실행에 필요한 입력 값을 받고..

도메인 주도 개발하기 - 2장. 아키텍처 개요

1. 네 개의 영역 - 아키텍처를 설계할 때 출현하는 전형적인 네 가지 영역 : 표현, 응용, 도메인, 인프라스트럭처 표현 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할 응용 시스템이 사용자에게 제공해야 할 기능을 구현한다. ex) 주문 등록, 주문 취소, 상품 상세 조회 등 기능을 구현하기 위해 도메인 영역의 도메인 모델을 사용 로직을 직접 수행하기 보다는 도메인 모델에 로직 수행을 위임한다. 도메인 도메인의 핵심 로직을 구현 ex) 배송지 변경, 결제 완료, 주문 총액 계산 등 인프라스트럭처 구현 기술에 대한 것을 다룸. DB연결, 메시징 큐 구현, SMTP를 이용한 메일 발송 기능, REST API 호출 등 논리적인 개념 보다는 실제 구현을 다룸 ..

도메인 주도 개발하기 - 1장. 도메인 모델 시작하기

1.1 도메인이란? 개발자 입장에서 온라인 서점을 구현해야 할 소프트웨어 대상이라고 봤을 때, 온라인 서점은 상품 조회, 구매, 결제, 배송 추적 등의 기능을 제공해야 한다. 이때 온라인 서점은 소프트웨어로 해결하고자 하는 도메인에 해당한다. 그리고 한 도메인은 다시 하위 도메인으로 나눌 수 있다. 예) 상위 - 온라인 서점 하위 - 주문, 결제, 배송, 회원, 카탈로그 등 특정 도메인을 위한 소프트웨어라도 모든 기능을 직접 구현하지 않는 경우가 있다. 결제 대행업체를 이용하는게 그 예시 이다. 그리고 하위 도메인을 어떻게 구성할지 여부는 상황에 따라 달라진다. 고객의 대상이나 규모에 따라서 필요없는 기능과 별도의 수작업으로 처리할 수 있기 때문이다. 1.2 도메인 전문가와 개발자 간 지식 공유 각 도메..

OSI 7계층

OSI 7 계층이란? 네트워크에서 통신이 일어나는 과정. 1. 물리 계층 전기적, 기계적, 기능적인 특성을 이용해서 통신 케이블로 데이터를 전송 통신 단위는 비트이며 이것은 1과 0으로 나타냄 데이터가 무엇인지, 어떤 에러가 있는지 등에는 전혀 신경 쓰지 않음. 예 ) 통신 케이블, 리피터, 허브 2. 데이터 링크 계층 물리계층을 통해 송수신되는 정보의 오류와 흐름을 관리 통신에서의 오류도 찾아주고 재전송도 하는 기능 맥 주소 통신 전송되는 단위를 프레임 예) 브리지, 스위치 ** 맥 주소 통신하기 위한 랜카드에 가지고 있는 고유 넘버, 즉 하드웨어 주소. 아이피 주소에서 맥 주소로 변경되는 과정 ARP(Address resolution protocal) https://m.blog.naver.com/wo..

CS 2022.06.16

Connection.setNetworkTimeout(com.zaxxer.hikari.pool.PoolBase$

결론 DB 커넥션 값과 Spring hikari 의 커넥션 유지 설정값이 맞지 않아서 발생하는 문제. Spring 세팅 값을 db값 보다 1~2초 빠르게 설정해서 해결. SHOW variables LIKE '%time%' DB HikariCP wait_timeout max-lifetime connect_timeout connection-timeout max-lifetime : 커넨션의 최대 유지 시간 설정. 사용중인 커넥션은 maxLifetime에 상관없이 제거되지않고, 사용중이지 않을 때만 제거된다. 0으로 설정하면 무한 lifetime이 적용되지만, idle-timeout 설정되어 있는 경우에는 적용되지 않는다. (default: 1800000 (30분)) connection-timeout : poo..

JAVA/Spring 2022.06.02