전체 글
-
part 11. CQRS책 정리/도메인 주도 개발 시작하기 2023. 9. 24. 00:01
CQRS 명령모델과 조회모델 명령모델과 조회모델로 나누는 이유 명령의 경우 행위에 대한 요구사항이며 조회의 경우 데이터를 확인하고 보여주기위한 방식으로 서로의 요구사항이 다름에서 발생하는 구현의 어려움을 해결하고자 나누게 됨 명령모델을 잘 사용하려면? controller에서 DAO를 바로 호출해서 사용해도 무방함 CQRS의 다양한 종류들 DB를 하나만 사용하며 조회와 CUD를 패키지 단위로 나눠서 작업하는 방법 DB를 RDBMS, NoSQL로 나눠서 사용하고 코드를 분리 하여 사용하는 방법 (RDBMS → NoSQL 은 이벤트로 통신한다) 사용전에 고려해야할 사항들은? 장점 조회 성능을 향상 시키는데 유리함 도메인이 집중해서 개발이 가능함 단점 구현해야할 코드가 더 많아짐 더 많은 구현 기술이 필요해짐
-
part 9. 도메인 모델과 바운디드 컨택스트책 정리/도메인 주도 개발 시작하기 2023. 9. 2. 13:59
도메인 모델과 바운디드 컨택스트 바운디드 컨넥스트란? 도메인 내부에서 모델을 공유하게 될때 도메인 모델을 결정할 수 있는 범위를 정의한것 하나의 바운디드 컨텍스트는 하나의 프로젝트를 일반적으로 의미함 도메인 모델과 경계 유사한 요구사항에 의해 여러 도메인에서 하나의 물리적 모델을 공유 하고자 할때가 있는데 이 경우 서로의 개념이 섞이지 않도록 명시적으로 구분되는 경계를 가져서 섞이지 않도록 하는 범위 바운디드 컨텍스트 서로 다른 요구사항을 원하기 때문에 같은 도메인이더라도 달라 질 수 있음 하나의 컨택스트 내부에서는 고유한 의미로 사용됨 해당 역할만 충실하게 수행할 수 있는 데이터로 활용 바운디드 컨텍스트의 구현 조회전용 DB와 domain을 분리해서 사용하라. pagination 에 의한 니즈가 필요하..
-
part 8. 애그리거트 트랜잭션 관리책 정리/도메인 주도 개발 시작하기 2023. 8. 26. 19:05
애그리거트 트랜잭션 관리 애그리거트 트랜잭션 발생원인 애그리거트라는 개념은 개념적으로 동일한 애그리거트를 이용할때 발생할 수 있다. 2개 이상의 호출에서 동일한 개념적인 애그리거트에서 서로 다른 기능을 수행하고 저장하는 경우에 어떤 호출이 먼저 저장되는지에 따라 최종적인 쓰기가 승리하는 방향으로 가게된다. 배송과 배송지 수정을 예로 들어보면 배송이 출발한 후 배송지 수정이 가능하게 되는 문제가 있다. DB 격리수준과는 무관한가? read uncommited : 그냥 무관 read commited : 커밋전 결과를 읽는것이 아니라서 dirty read 와는 무관 repeatable Read : tx 버전과는 무관함 serializable : row lock을 사용하면 해결이 가능함. 어떻게 serializ..
-
part 7. 도메인 서비스책 정리/도메인 주도 개발 시작하기 2023. 8. 20. 01:24
도메인 서비스 도메인 서비스가 나오게된 배경 한 애그리거트로 기능을 구현할 수 없을 때 사용하는 기법 한 애그리거트에 넣기 애매한 도메인 기능을 억지로 특정 애그리거트에 구현하면 안된다. 외부에 대한 의존성이 높아짐 도메인 서비스 하나 이상의 애그리거트가 연관 관계를 통해서 하나의 비즈니스를 처리할때 사용된다. Domain Service 를 Domain에 주입해서 처리하자! public class Order{ public void calculateAmounts( DiscountCalculationService disCalSvc, MemberGrade grade ){ Money totalAmounts = getTotalAmount(); Money discountAmounts = disCalSvc/calcu..
-
part 6. 응용 서비스와 표현 영역책 정리/도메인 주도 개발 시작하기 2023. 8. 13. 02:34
응용 서비스와 표현 영역 응용 서비스 구현 응용 서비스의 역할 도메인 객체간 흐름제어 트랜젝션 접근제어 이밴트 처리 주의사항 도메인로직이 응용서비스에 분산하면 안된다. 코드의 응집성이 떨어짐 여러 응용 서비스에서 동일한 도메인 로직을 구현할 가능성이 높아진다 응용서비스의 크기 2가지 방법 한 응용 서비스 클래스에 회원 도메인의 모든 기능 구현하기 장점 - 동일한 로직을 위한 코드 중복을 제거하기 쉬움 단점 - 코드 크기가 커지면 연관성이 적은 코드가 한 클래스에 함께 위치할 가능성이 높아지게 되는데 결과적으로 관련없는 코드가 뒤섞여 코드를 이해하는 데 방해가 됨 구분되는 기능별로 응용 서비스 클래스를 따로 구현하기 공통로직을 service helper로 분리해서 여러 service코드에서 사용하도록 만듬..
-
part 5. 스프링 데이터 JPA를 이용한 조회 기능책 정리/도메인 주도 개발 시작하기 2023. 8. 6. 00:56
스프링 데이터 JPA를 이용한 조회 기능 CQRS란? DDD를 진행하는데 있어서 왜 CQRS가 필요한가? CQRS를 활용한 high level architecture https://www.codeproject.com/Articles/991648/CQRS-A-Cross-Examination-Of-How-It-Works 중에서 !https://www.codeproject.com/KB/cs/991648/BuildingBlocksSmall.png 왜 분리하는가? Read>>>>>>>write 책에서 의도한 내용은? 간단한 형태의 CQRS구현 https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2F..
-
Database 격리 수준에 관하여카테고리 없음 2023. 7. 31. 01:40
데이터베이스를 학습하면서 다양한 격리수준과 관련하여 발표하는 시간이 있었는데 자료를 만들지 못해 이번을 기회로 작성하고자 한다. Read uncommited 데이터 베이스에서 트랜잭션이 적용되지 않은 단계?라고 할수 있지 않을까? 다른 트랜잭션의 commit되지 않은 데이터를 읽을 수 있다(dirty read)는 문제가 존재한다. 간단한 예시를 살펴보자 일단 User A가 point를 2회 연속으로 발급받는 transaction 을 생각해보자. 일간 출석체크와 주간 출석체크가 동시에 완료되면 이런경우가 생기겠지? 만약 격리수준이 Read Uncommited 라면 다른 트랜잭션의 데이터를 읽을수 있기에 아래와 같은 상황에서 문제가 생길 수 있다. 이럼 어떤문제가 생기는지 Error를 가정해보자 홀리몰리....
-
part 4. 리포지터리와 모델 구현책 정리/도메인 주도 개발 시작하기 2023. 7. 29. 19:19
리포지터리와 모델 구현 JPA를 이용한 리포지터리 구현 리포지터리 인터페이스는 다음과 같은 형식을 가져야한다. public interface OrderRepository{ Order findById(OrderNo no); void save(Order order); } 엔티티와 벨류 매핑 get 과 find 함수의 차이 get: 찾고자 하는 데이터가 없다면 throw find : 찾고자 하는 데이터가 없다면 return null 밸류 컬렉션 매핑 p 140 - table PURCHASE_ORDER 부분에서 ORDERER_ID를 가지고 있음에도 불구하고 왜 ORDER_NAME을 가지는가? Order_Name은 Orderer_Name을 의미한다면 : 주문자 명을 변경하는 요구사항이 있을수 있기 때문 Order..