분류 전체보기 121

안정 해시 설계

가상 면접 사례로 배우는 대규모 시스템 설계 기초 "안정 해시 설계"을 요약한 내용입니다. 수평적 규모 확장을 달성하기 위해서는 요청 또는 데이터를 서버에 균등하게 나누는 것이 중요 해시 기술이 풀려고 하는 문제부터 좀더 자세히 살펴보기 해시 키 재배치 문제 N개의 캐시 서버가 균등하게 부하를 나누는 방법으로 해시 함수를 사용한다. serverIndex = hash(key) % N 특정 키가 보관된 서버를 알아내기 위해, 나머지연산을 적용 hash(key0) % 4 == 1 서버 1에 접속하여 보관된 데이터를 가져올 수 있다. n번 서버가 장애가 발생할 경우 서버 풀의 크기는 3으로 변한다 모듈러 연산에 의해 서버의 인덱스가 달라지는 문제가 발생 대부분 캐시 클라이언트가 데이터가 없는 서버에 접속하게 되..

처리율 제한 장치의 설계

가상 면접 사례로 배우는 대규모 시스템 설계 기초 "처리율 제한 장치의 설계"을 요약한 내용입니다. 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하기 위한 장치 특정 기간 내에 전송되는 클라이언트의 요청 횟수를 제한 정의된 임계치를 넘어서면 추가로 도달한 모든 호출은 처리가 중단됨 ex) 초당 2회 이상 새 글을 올릴 수 없다.ex) 같은 디바이스로는 주당 2회 이상 리워드 요청을 할 수 없다. ex) 같은 IP 주소로 하루에 10개 이상의 계정을 생성할 수 없다. 처리율 제한 장치를 두면 좋은 점 처리율 제한 장치를 두면 DoS 공격에 대한 자원 고갈을 방지 할 수 있음 대형 IT 기업들이 공개한 API에는 대부분 처리율 제한 장치를 가지고 있음 트위터는 3시간 동안 300개의 트윗만 올릴 수..

사용자 수에 따른 규모 확장성

가상 면접 사례로 배우는 대규모 시스템 설계 기초 "사용자 수에 따른 규모 확장성"을 요약한 내용입니다. 이번 장에서는 한 명의 사용자를 지원하는 시스템에서 시작하여 최종적으로는 몇백만 사용자를 지원하는 시스템을 설계해볼 것이다. 규모 확장성와 관계된 설계 문제를 푸는 데 쓰일 유용한 지식들을 마스터할 수 있을 것이다. 단일 서버 모든 컴포넌트가 단 한대의 서버에서 실행되는 간단한 시스템부터 설계해 보자 [그림 1-1] 웹, 앱, 데이터베이스, 캐시 등이 전부 서버 한 대에서 실행된다. 사용자 요청 처리 흐름부터 살펴보자 [그림 1-2] 사용자는 도메인 이름을 이용하여 웹사이트에 접속한다. DNS 조회 결과로 IP 주소가 반환된다. 해당 IP 주소로 HTTP 요청이 전달 된다. 요청을 받은 웹 서버는 H..

Chapter 11 CQRS

도메인 주도 개발 시작하기 11장을 요약한 내용입니다. 11.1 단일 모델의 단점 주문 내역 조회 기능을 구현하려면 여러 애그리거트에서 데이터를 가져와야 한다. Order에서 주문 정보 Product에서 상품 정보 Member에서 회원 이름과 ID 정보 조회 화면 특성상 조회 속도가 빠를수록 좋은데 여러 애그리거트의 데이터가 필요하면 구현 방법을 고민 해야함 애그리거트 간 연관의 식별자가 아니라 직접 참조하는 방식으로 연결해도 고민거리가 생긴다. 조회 화면 특성에 따라 같은 연관도 즉시 로딩이나 지연 로딩으로 처리 해야하기 때문 조회 기능을 구현할 때 DBMS가 제공하는 전용 기능이 필요하면 JPA의 네이티브 쿼리를 사용해야할 수 있다. 고민이 발생하는 이유는 시스템 상태를 변경할 때와 조회할 때 단일 ..

Chapter 10 이벤트

도메인 주도 개발 시작하기 10장을 요약한 내용입니다. 10.1 시스템 간 강결합 문제 쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. 환불 기능을 실행하는 주체는 주문 도메인 엔티티가 될 수 있다. 도메인 객체에서 환불 기능을 실행하려면 환불 기능을 제공하는 도메인 서비스를 파라미터로 전달 받고 도메인 서비스를 실행하게 된다. public class Order { // 외부 서비스를 실행하기 위해 도메인 서비스를 파라미터로 전달받음 public void cancel(RefundService refundService) { verifyNotYetShipped(); this.state = OrderState.CANCELED; this.refundStatus = State.REFUND_STARTED; try..

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

도메인 주도 개발 시작하기 9장을 요약한 내용입니다. 9.1 도메인 모델과 경계 도메인 모델을 만들 때 빠지기 쉬운 함정이 도메인을 완벽하게 표현하는 단일 모델을 만드는 시도를 하는 것 한 도메인은 여러 하위 도메인으로 구분되기 때문에 한 개의 모델로 여러 하위 도메인을 모두 표현하려고 시도하면 오히려 모든 하위 도메인에 맞지 않는 모델을 만들게 된다. 상품이라는 모델을 생각 해보자. 카달로그에서 상품, 재고 관리에서 상품, 주문에서 상품, 배송에서 상품은 이름만 같지 실제로 의미하는 것은 다름 카달로그에서의 상품은 상품 이미지, 상품명, 상품 가격 등과 같은 상품 위주의 정보 재고 관리에서의 상품은 실존하는 개별 객체를 추적관리하기 위한 목적 논리적으로는 같은 존재처럼 보이지만 하위 도메인에 따라 다른..

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

create table locks ( 'type' varchar(255), id varchar(255), lockid varchar(255), expiration_time datetime, primary key ('type', id) ) character set utf8; create unique index locks_idx ON locks (lockid); // Order 타입의 1번 식별자를 갖는 애그리거트에 대한 잠금 쿼리 insert into locks values ('Order', '1', '생성한 lockid', '2016-03-28 09:10:00'); 도메인 주도 개발 시작하기 8장을 요약한 내용입니다. 8.1 애그리거트와 트랜잭션 주문 애그리거트에 대해 운영자는 배송 상태로 변경할 때 고..

Chapter 7 도메인 서비스

도메인 주도 개발 시작하기 7장을 요약한 내용입니다. 7.1 여러 애그리거트가 필요한 기능 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 결제 금액을 계산할 때 필요한 내용 상품 애그리거트: 구매하는 상품의 가격이 필요하다. 상품에 따라 배송비가 추가되기도 한다. 주문 애그리거트: 상품별로 구매 개수가 필요하다. 할인 쿠폰 애그리거트: 쿠폰별로 지정한 할인 금액이나 비율에 따라 주문 총 금액을 할인한다. 할인 쿠폰을 조건에 따라 중복 사용할 수 있다거나 지정한 카테고리의 상품에만 적용할 수 있다는 제약 조건이 있다면 할인 계산이 복잡해지낟. 회원 애그리거트: 회원 등급에 따라 추가 할인이 가능하다. 결제 금액을 계산해야 하는 주체는 어떤 애그리거트일까? 총 주문 금액에서 할인 금액을 계산해야 하는데..

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

도메인 주도 개발 시작하기 6장을 요약한 내용입니다. 6.1 표현 영역과 응용 영역 도메인이 제 기능을 하려면 사용자와 도메인을 연결해주는 매개체가 필요하다 표현 영역은 사용자의 요청을 해석 웹 브라우저에서 ID와 암호를 입력한 뒤에 전송 버튼을 클릭하면 요청 파라미터를 포함함 HTTP 요청을 표현 영역에 전달 사용자가 실행하고 싶은 기능을 판별하고 기능을 제공하는 응용 서비스를 실행 사용자가 원하는 기느을 제공하는 것은 응용 영역에 위치한 서비스 회원 가입을 요청했다면 실제 그 요청을 위한 기능을 제공하는 주체는 응용 서비스 응용 서비스의 메서드가 요구하는 파라미터와 표현 영역이 사용자로부터 전달받은 데이터는 형식이 일치하지 않음 표현 영역은 응용 서비스가 요구하는 현식으로 사용자 요청을 변환 @Pos..

Chapter 5 스프링 데이터 JPA를 이용한 조회 기능

도메인 주도 개발 시작하기 5장을 요약한 내용입니다. 5.1 시작에 앞서 CQRS는 명령 모델과 조화 모델을 분리하는 패턴 명령 모델은 상태를 변경하는 기능을 구현할 때 사용 회원가입, 암호변경, 주문취소 등 조회 모델은 데이터를 조회하는 기능을 구현할 때 사용 주문목록, 주문 상세 등 엔티티, 애그리거트, 리포지터리 등은 주로 상태를 변경할 때 사용이 된다 도메인 모델은 명령 모델로 주로 사용됨 정렬, 페이징, 검색 조건 같은 기능은 조회 기능에 사용됨 5.2 검색을 위한 스펙 검색 조건이 고정되어 있고 단순하면 특정 조건으로 조회하는 기능을 만들면 된다. public interface OrderDataDao { Optional findById(OrderNo id); List findByOrderer(..