일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 자바
- AWS
- 이팩티브 자바
- 인덱스
- 자바예외
- 네트워크
- java
- 자료구조
- jpa
- CleanCode
- AWS RDS
- 기술면접
- 자바스터디
- vue.js
- DDD
- 알고리즘분석
- MariaDB
- aop
- SQL쿡북
- 도메인 주도 개발 시작하기
- react
- 혼공SQL
- 인프런김영한
- 클린코드
- 스프링부트와AWS로혼자구현하는웹서비스
- mysql
- 이펙티브 자바
- 알고리즘
- 이펙티브자바
- 인프런백기선
- Today
- Total
목록IT서적 (37)
기록이 힘이다.

애그리거트와 트랜잭션 두 스레드는 각각 트랜잭션을 커밋할 때 수정한 내용을 DBMS에 반영한다. 즉, 배송 상태로 바뀌고 배송지 정보도 바뀌게 된다. 이 순서의 문제점은 운영자는 기존 배송지 정보를 이용해서 배송 상태로 변경했는데 그 사이 고객은 배송지 정보를 변경했다는 점이다. 즉, 애그리거트의 일관성이 깨지는 것이다. 이런 문제가 발생하지 않도록 하려면 두 가지 중 하나를 해야 한다. 운영자가 배송지 정보를 조회하고 상태를 변경하는 동안 고객이 애그리거트를 수정하지 못하게 막는다. 운영자가 배송지 정보를 조회한 이후에 고객이 정보를 변경하면 운영자가 에그리거트를 다시 조회한 뒤 수정하도록 한다. 애그리거트에 대해 사용할 수 있는 대표적인 트랜잭션 처리 방식에는 선점(Pressimistic) 잠금과 비..
여러 애그리거트가 필요한 기능 도메인 영역의 코드를 작성하다 보면 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 대표적인 예가 결제 금액 계산 로직이다. 실제 결제 금액을 계산할 때는 다음과 같은 내용이 필요하다. 상품 애그리거트 : 구매하는 상품의 가격이 필요하다. 또한 상품에 따라 배송비가 추가되기도 한다. 주문 애그리거트 : 상품별로 구매 개수가 필요하다. 할인 쿠폰 애그리거트 : 쿠폰별로 지정한 할인 금액이나 비율에 따라 주문 총금액을 할인한다. 회원 애그리거트 : 회원 등급에 따라 추가 할인이 가능하다 이 상황에서 실제 금액을 계산해야 하는 주체는 어떤 애그리거트일까? 이 할인 금액을 구하는 것은 누구 책임일까? 한 애그리거트에 넣기에 애매한 도메인 기능을 특정 애그리거트에서 억지로 구현하..

표현 영역과 응용 영역 표현 영역의 코드는 다음과 같이 폼에 입력한 요청 파라미터 값을 사용해서 응용 서비스가 요구하는 객체를 생성한 뒤, 응용 서비스의 메서드를 호출한다. @PostMapping("/member/join") public ModelAndView join(HttpServletRequest request){ String email = request.getParameter("email"); String password = request.getParameter("password"); //사용자 요청을 응용 서비스에 맞게 변환 JoinRequest joinReq = new JoinReqeust(email, password); //변환한 객체(데이터)를 이용해서 응용 서비스 실행 joinServic..
CORS는 명령 모델과 조회 모델을 분리하는 패턴이다. 명령 모델은 상태를 변경하는 기능을 구현(회원가입, 암호 변경, 주문 취소)할 때 사용하고 조회 모델은 데이터를 조회하는 기능을 구현(주문 목록, 주문 상세처럼 데이터를 보여주는 기능)할 때 사용한다. 이 장에서 살표볼 구현 방법은 조회 모델을 구현할 때 주로 사용한다. 검색을 위한 스펙 검색 조건을 다양하게 조합해야 할 때 사용할 수 있는 것이 스펙이다. 스펙은 애그리거트가 특정 조건을 충족하는지를 검사할 때 사용하는 인터페이스다. public interface Specification { public boolean isSatisfiedBy(T agg); } 스펙을 리포지터리에 사용하면 egg는 애그리거트 루트가 되고, 스펙을 DAO에 사용하면 a..

JPA를 이용한 리포지터리 구현 리포지터리 기본 기능 구현 -ID로 애그리거트 조회하기 -애그리거트 저장하기 public interface OrderRepository{ Order findById(OrderNo no); void save(Order order); } @Repository public class JpaOrderRepository implements OrderRepository { @PersistenceContext private EntityManager entityManager; @Override public Order findById(OrderNo id) { return entityManager.find(Order.class, id); } @Override public void save(..

애그리거트 도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고 전반적인 구조나 큰 수준에서 도메인 간의 관계를 파악하기 어려워진다. 주요 도메인 요소 간의 관계를 파악하기 어렵다는 것은 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면 상위 수준에서 모델을 조망할 수 있는 방법이 필요한데 , 그 방법이 바로 애그리거트다. 애그리거트는 모델을 이해하는 데 도움을 줄 뿐만 아니라 일관성을 관리하는 기준도 된다. 속한 구성요소는 대부분 함께 생성하고 함께 제거한다. 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다. 처음 도메인 모델을 만들기 시작하면 큰 애그리거트로 보이는 것들이 많지만, 도메인에 대한 경험이 생..

아키텍처 도메인 영역, 응용 영역, 표현 영역은 구현 기술을 사용한 코드를 직접 만들지 않는다. 대신 인프라스트럭처 영역에서 제공하는 기능을 사용해서 필요한 기능을 개발한다. 인트라 스트럭처에 의존하면 '테스트 어려움'과 '기능 확정의 어려움'이라는 두 가지 문제가 발생한다. 이 두 문제를 해소 할 수 있는 방법은 'DIP'에 있다. DIP 고수준 모듈이 저수준 모듈을 사용하면 앞서 계층 구조 아키텍처에서 언급했던 두 가지 문제, 즉 구현 변경과 테스트가 어렵다는 문제가 발생한다. DIP는 이 문제를 해결하기 위해 저수준 모듈이 고수준 모듈에 의존하도록 바꾼다. 비밀은 추상화한 인터페이스에 있다. public interface RuleDiscounter{ Money applyRules(Customer c..
1. 엔티티의 식별자 생성 특정 규칙에 따라 생성 UUID나 Nano ID와 같은 고유 식별자 생성기 사용 값을 직접 입력 일련번호 사용(시퀀스나 DB의 자동 증가 칼러 사용) UUID uuid = UUID.randomUUID(); String strUuid = uuid.toString(); //엔티티를 생성하기 전에 식별자 생성 String orderNumber = orderRepository.generateOrderNumber(); Order order = new Order(orderNumber, ...); orderRepository.save(order); 2. 밸류 타입 public class OrderLine{ private Product product; private int price; pri..