2025/06 10

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 10. 이벤트

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다. 1. 시스템 간 강결합 문제바운디드 컨텍스트들 간의 강결합✅ 외부 시스템을 호출하는 서비스가 도메인 로직에 결합하는 경우를 말함 문제점문제점설명트랜잭션 처리 애매함외부 서비스 실패 시 롤백 or 상태 변경 여부가 불명확함성능 병목외부 API 지연이 전체 시스템 응답 시간에 영향도메인-외부 로직 혼합도메인 객체가 외부 호출을 직접 다루면 유지보수 어려움 해결 방법비동기 이벤트 기반 처리로 결합도 낮추기 2. 이벤트과거에 일어난 일✅ 상태 변화의 후속 처리를 트리거하는 역할➡️ 도메인의 상태 변경과 관련된 요구사항을 이벤트를 이용해서 구현할 수 있음 구성종류: 클래스 이름으로 표현발생 시간추가 데이터..

Code 2025.06.20

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 9. 도메인 모델과 바운디드 컨텍스트

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다. 1. 도메인 모델과 경계같은 엔티티라도 각각 다른 상위 도메인에 속하게 되면, 의미가 달라짐✅ 각 도메인에서 역할과 책임, 속성, 용어가 달라짐. 예) 상품더보기카탈로그: 보여주기용 정보 (상품명, 이미지, 옵션 등)창고: 실물 재고 추적용 정보 (SKU, 수량 등) 예) 회원더보기주문: 주문자배송: 보내는 사람 2. 바운디드 컨텍스트하나의 도메인 모델에 일관되게 적용되는 경계✅ 모델은 특정한 컨텍스트 하에서 완전한 의미를 가짐➡️ 올바른 도메인 모델을 개발하려면 하위 도메인마다 모델을 만들어야 함내용설명필요성하위 도메인마다 요구사항/규칙/용어가 다름구분 기준사용하는 용어가 다른지, 조직의 팀 구..

Code 2025.06.20

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 8. 애그리거트 트랜잭션 관리

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다. 1. 애그리거트와 트랜잭션서로 다른 스레드/트랜잭션이 같은 애그리거트의 DB를 동시에 수정하면 충돌이 일어날 수 있음‼️ 두 스레드가 동시에 커밋하면 일관성 깨짐➡️ 해당 테이블의 행에 잠금을 걸어 동시 커밋을 막음 예시) 배송 정보 변경더보기시스템: 배송 상태를 배송으로 변경할 때사용자: 배송지 주소를 변경할 경우➡️ 시스템의 애그리거트 객체와 사용자의 애그리거트 객체는 서로 독립적 (개념적으로는 같지만 물리적으로는 서로 다름) 2. 선점 잠금먼저 들어온 트랜잭션이 커밋될 때까지 같은 행을 접근하는 다른 트랜잭션은 잠시 blocking됨 (대기)먼저 들어온 트랜잭션이 커밋되면 잠금이 해제됨➡️ ..

Code 2025.06.19

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 7. 도메인 서비스

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다. 1. 여러 애그리거트가 필요한 기능도메인 영역의 코드를 작성하다 보면, 한 애그리거트로 기능을 구현할 수 없을 때가 있음✅ 도메인 / 애플리케이션 서비스에서 처리하기❌ 여러 애그리거트의 데이터/규칙을 한 번에 써야하는 유스케이스는, 한 애그리거트에 집어넣지 말기 예) Order - 결제 금액 계산더보기주문을 확정하려면 주문 애그리거트는 외부 애그리거트 정보를 읽어와서 계산하고, 결과 스냅샷만 자기 내부에 기록함애그리거트주문 시 필요한 정보(읽기)소유/책임비고Product상품 가격, 판매 가능 여부, 카테고리상품 카탈로그/정책가격은 주문 시점 스냅샷으로 Order에 저장Coupon/Promotion..

Code 2025.06.19

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 4. 애그리거트

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다.1. JPA를 이용한 리포지터리 구현모듈 위치리포지토리 인터페이스는 도메인 영역에 속함리포지토리를 구현한 클래스는 인프라스트럭쳐 영역에 속함 2. 스프링 데이터 JPA를 이용한 리포지터리 구현3. 매핑 구현4. 애그리거트 로딩 전략1:N 관계가 여러 개 있을 경우Fetch Join 쿼리의 결과는 될 수 있는 모든 경우의 행을 반환함 (카테시안 곱)❌ 실제 필요한 행의 갯수보다 더 많은 행을 얻어옴Hibernate에서는 Fetch Join 시, distinct 처리함같은 엔티티가 중복 생성되지 않게 함⚠️ 성능 부하가 일어날 수 있음 (DB, JVM의 연산이 늘어남) 예시) Order - OrderL..

Code 2025.06.19

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 3. 애그리거트

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다. 0. 설계 관점구분개별 객체 수준상위 수준(모델 관점)관심 범위단일 클래스, 엔티티, 메서드 등여러 객체들의 관계와 구조 전체적용 시점세부 로직 구현 단계시스템 설계 초기 또는 리팩터링 단계장점✅ 구현 세부사항에 집중✅ 객체 내부 로직 이해에 유리✅ 도메인 전반의 흐름 파악✅ 책임, 경계, 협력 구조 설계에 유리단점❌ 객체 간 관계를 놓치기 쉬움❌ 구조 왜곡 위험❌ 직관적이지 않을 수 있음 (추상적 흐름부터 정의하므로)변경에 대한 민감도⚠️ 구조 고려 없이 변경하면 다른 객체에 영향 확산 됨✅ 경계 기반 변경 가능모델링 초점객체 내부 (필드, 메서드, 생성자 등)객체 간 관계, 애그리거트 경계, ..

Code 2025.06.18

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 2. 아키텍처 개요

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다. 1. 네 개의 영역표현 영역, 애플리케이션 영역, 도메인 영역, 인프라스트럭처 영역 2. 계층 구조 아키텍처단방향 의존성상위가 하위 의존 (하위는 상위 의존 안함)➡️ 도메인, 비즈니스 영역이 인프라스트럭처에 의존함 문제점❌ 테스트 어려움❌ 기능 확장 어려움 3. DIP (Dependency Inversion Principle)저수준 모듈이 고수준 모듈에 의존하도록 바꿈컴파일 시점에 해당 고수준 모듈 타입(인터페이스)에 의존함 DIP와 아키텍처애플리케이션 영역과 도메인 영역에 영향을 최소화하면서 구현체를 변경하거나 추가할 수 있음항목도메인 서비스애플리케이션 서비스책임여러 도메인에 걸친 순수한 도메..

Code 2025.06.18

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 1. 도메인 모델 시작하기

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다. 1. 도메인이란?소프트웨어로 해결하고자 하는 문제의 영역✅ 여러 하위 도메인으로 구성될 수 있음✅ 외부 서비스로 대체될 수 있음 (ex. 배송 - 택배사 시스템) 예) 온라인 서점더보기주문: 정산, 배송, 결제, 회원, 혜택(->할인,쿠폰), 카탈로그(-> 리뷰)조회 2. 도메인 전문가와 개발자 간 지식 공유도메인 별 전문가들은 각 도메인 시스템에게 원하는 요구사항이 있음✅ 요구사항을 올바르게 이해하는것이 첫번째 단계✅ 개발자는 이런 요구사항을 분석하고 설계하여 개발함➡️ 직접 전문가와 개발자가 대화하는것이 가장 효과적 예시) 온라인 쇼핑몰더보기주문상품 선택배송지 입력결제 (결제 수단 선택)opt..

Code 2025.06.16

[Real MySQL] 4-2. 아키텍쳐: InnoDB 스토리지 엔진 아키텍쳐 (2)

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다. 6. InnoDB Buffer Pool디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두는 공간 버퍼링쓰기 작업을 메모리에 먼저 저장 후, 일괄 처리로 디스크에 기록 시스템 변수변수명설명innodb_buffer_pool_size버퍼 풀 전체 사이즈를 설정함. (동적으로 조정 가능)innodb_buffer_pool_instances버퍼 풀을 여러 인스턴스로 나누어 병렬 처리- 기본 8개 (버퍼 크기가 1GB 이하면 1개만 사용) 구성 요소페이지InnoDB가 디스크에서 데이터를 읽거나 메모리에 저장할 때 사용하는 기본 단위(블록)하나의 페이지 안에는 여러 개의 레코드(행) 또는 인덱스 정보가 들어갈 수 있음기본값은 16KB..

Database/Mysql 2025.06.08

[Redis] 3-4. Introduction to Redis: Pub/Sub

1. Pub/Sub메시지를 채널을 통해 발행자와 구독자가 느슨하게 연결하는 구조발행자는 단순히 메시지를 채널에 발행구독자는 관심 있는 채널을 구독하여 해당 메시지를 수신서로 존재를 몰라도 메시지 통신이 가능하여 확장성과 유연성이 높음 2. 메시지형식message: [message, 채널명, 메시지 내용]pmessage: [pmessage, 패턴, 채널명, 메시지 내용] 특징메시지는 최대 한번만 전송됨일반적인 key-value 공간과는 무관함 (db 상관 없음)수신 실패 시 재전송 없음 (내구성이 필요한 경우 Redis Streams를 고려할 것) 3. 명령어더보기SUBSCRIBE ch1 ch2PSUBSCRIBE patternUNSUBSCRIBE chPUNSUBSCRIBE patternPUBLISH ch ..

Database/Redis 2025.06.04