일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 기술면접
- 클린코드
- 이펙티브자바
- DDD
- 인프런김영한
- 인프런백기선
- 자바예외
- CleanCode
- 이팩티브 자바
- AWS
- 인덱스
- 알고리즘
- 스프링부트와AWS로혼자구현하는웹서비스
- AWS RDS
- react
- 자바스터디
- 도메인 주도 개발 시작하기
- mysql
- java
- aop
- jpa
- 자바
- 자료구조
- MariaDB
- vue.js
- 네트워크
- 이펙티브 자바
- SQL쿡북
- 혼공SQL
- 알고리즘분석
- Today
- Total
목록분류 전체보기 (272)
기록이 힘이다.
애그리거트와 트랜잭션 두 스레드는 각각 트랜잭션을 커밋할 때 수정한 내용을 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..
가벼운 성능: t2.micro 인스턴스 유형은 낮은 CPU 성능과 제한된 메모리를 제공합니다. 이는 매우 가벼운 워크로드나 개발/테스트용으로 적합합니다. Burstable Performance: t2.micro 인스턴스는 "burstable" 성능을 제공합니다. 즉, 인스턴스가 일정 기준의 CPU를 사용하지 않을 때에는 CPU 크레딧을 모아둘 수 있고, 필요할 때 이 크레딧을 사용하여 잠깐의 고성능을 제공합니다. 그러나 크레딧이 다 소진되면 성능이 저하될 수 있습니다. 경제적: t2.micro 인스턴스 유형은 가장 경제적인 선택 중 하나입니다. 비교적 저렴한 가격으로 사용할 수 있기 때문에 저렴한 비용으로 가볍게 테스트나 개발 환경을 구성할 수 있습니다. 제한 사항: t2.micro 인스턴스는 낮은 리소..