Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
3562127
feat: 회원가입 기능 구현
SukheeChoi Feb 2, 2026
f47a7d9
feat: 내 정보 조회 기능 구현
SukheeChoi Feb 2, 2026
eeb137c
feat: 비밀번호 수정 기능 구현
SukheeChoi Feb 2, 2026
23fa221
Merge feature/change-password into week1
SukheeChoi Feb 2, 2026
533790c
feat: DDD 리팩토링 + Value Object 도입 + 포인트 조회 구현
SukheeChoi Feb 5, 2026
e6ba4dd
Merge feature/ddd-refactoring into week1
SukheeChoi Feb 5, 2026
24c7c17
refactor: 불필요한 Gender, 포인트 조회 기능 제거
SukheeChoi Feb 5, 2026
4e2522f
refactor: Example 패키지 및 관련 파일 전체 삭제
SukheeChoi Feb 5, 2026
a0bba79
fix: MemberService에 @Transactional 추가
SukheeChoi Feb 5, 2026
7959cdc
docs: 이커머스 도메인 설계 문서 작성
SukheeChoi Feb 13, 2026
0fd169a
docs: 스냅샷 범위 설명 개선
SukheeChoi Feb 13, 2026
59a2d19
fix: 설계 문서 간 정합성 수정
SukheeChoi Feb 13, 2026
26e5522
fix: 요구사항에 없는 기능 제거
SukheeChoi Feb 13, 2026
e6165e5
docs: CLAUDE.md에 도메인/아키텍처 규칙 추가, DIP 인사이트 기록
SukheeChoi Feb 24, 2026
2a7be8f
refactor: MemberService를 application 레이어로 이동
SukheeChoi Feb 24, 2026
391b65c
feat: Brand, Product, Like, Order 도메인 구현
SukheeChoi Feb 24, 2026
ca1b57b
test: 도메인 단위 테스트 및 Facade 테스트 추가
SukheeChoi Feb 24, 2026
abcfc87
chore: 이전 주차 가이드 파일 정리
SukheeChoi Feb 24, 2026
bc64b47
fix: 요구사항 명세 대비 누락/불일치 수정 및 설계 고도화
SukheeChoi Feb 24, 2026
d1eebba
refactor: Order Aggregate가 OrderItem 라이프사이클을 통제하도록 개선
SukheeChoi Feb 24, 2026
508e780
docs: 클래스 다이어그램을 현재 구현에 맞게 갱신
SukheeChoi Feb 25, 2026
b46e527
refactor: 상품 단건 조회를 Facade 조합 방식으로 변경
SukheeChoi Feb 26, 2026
e01d607
refactor: Aggregate Root 불변식 강화 및 VO 의미론 보완
SukheeChoi Feb 26, 2026
fdb0a65
feat: 쿠폰 도메인 구현 및 주문 통합, 비관적 락 동시성 제어 적용
SukheeChoi Mar 5, 2026
f4b7c84
refactor: 동시성 제어 강화 및 Facade 책임 분리
SukheeChoi Mar 5, 2026
4812712
refactor: 도메인 특성 기반 동시성 전략 분화
SukheeChoi Mar 5, 2026
d85a8a1
refactor: N+1 쿼리 최적화 (배치 DELETE + 배치 COUNT)
SukheeChoi Mar 5, 2026
1c510d6
docs: 설계 문서를 현재 구현(쿠폰, 동시성, N+1 최적화)에 맞게 갱신
SukheeChoi Mar 5, 2026
0e13993
fix: 주문 취소 시 만료된 쿠폰은 EXPIRED로 전이하도록 수정
SukheeChoi Mar 5, 2026
4825bb1
refactor: Product 재고를 조건부 UPDATE로 변경하여 read-modify-write 제거
SukheeChoi Mar 5, 2026
c8521d2
refactor: 재고 차감을 비관적 락 + 도메인 엔티티 방식으로 복원
SukheeChoi Mar 5, 2026
c5d4202
feat: 주문 이중 취소 방지 — @Version 낙관적 락 적용
SukheeChoi Mar 6, 2026
96e3829
chore: remove .coderabbit.yaml
loopers-len Mar 7, 2026
359b774
Merge pull request #27 from SukheeChoi/week1
SukheeChoi Mar 13, 2026
5cd7742
Merge pull request #83 from SukheeChoi/volume-2
SukheeChoi Mar 13, 2026
0015c3d
Merge pull request #128 from SukheeChoi/volume-3
SukheeChoi Mar 13, 2026
bac3184
Merge pull request #151 from SukheeChoi/volume-4
SukheeChoi Mar 13, 2026
c9d1387
feat: 읽기 최적화 — 인덱스·비정규화·Redis 캐시·MV 시뮬레이션 적용
SukheeChoi Mar 12, 2026
ede254e
docs: Grafana 성능 비교 대시보드 스크린샷 추가
SukheeChoi Mar 12, 2026
ecfb84a
docs: 1000만 건 프로덕션급 부하 테스트 결과 추가
SukheeChoi Mar 12, 2026
d9b81ad
refactor: 캐시를 DIP 기반 멀티 레이어(L1 Caffeine + L2 Redis)로 분리
SukheeChoi Mar 12, 2026
d328279
docs: L1+L2 멀티 레이어 캐시 리팩토링 후 Grafana 성능 모니터링 캡처 추가
SukheeChoi Mar 12, 2026
913fede
docs: 4단계 벤치마크 비교 결과 및 읽기 최적화 기술 블로그 추가
SukheeChoi Mar 13, 2026
fb1e69f
refactor: 블로그 파일을 docs/ → blog/로 이동
SukheeChoi Mar 13, 2026
768da3d
docs: Grafana 4단계 비교 대시보드 스크린샷 3장 추가
SukheeChoi Mar 13, 2026
869f4b2
docs: 블로그 톤 개선 + Grafana Total Requests 패널 수정
SukheeChoi Mar 13, 2026
7a7116a
docs: 벤치마크 맥락 명확화 — 1000만 건 전량 조회가 아닌 페이지네이션 조회
SukheeChoi Mar 13, 2026
59b3cc8
docs: 블로그 제목 변경
SukheeChoi Mar 13, 2026
70fd465
Merge pull request #210 from SukheeChoi/volume-5
SukheeChoi Mar 16, 2026
6a1ff86
feat: 결제 도메인 및 PG 연동 인프라 구현 (WIP)
SukheeChoi Mar 20, 2026
04ae25c
feat: 콜백 수신 + Callback Inbox(DLQ) + 상태 복구 구현
SukheeChoi Mar 20, 2026
c968546
feat: Transactional Outbox + 배치 복구 + 대사 배치 구현
SukheeChoi Mar 20, 2026
625396b
feat: Toss Sandbox Multi-PG 연동 + PgRouter Fallback 강화
SukheeChoi Mar 20, 2026
5ec4261
docs: 콜백·Outbox·Multi-PG 구현 기록 — 설계 문서 업데이트
SukheeChoi Mar 20, 2026
7f4f578
test: 종합 테스트 — Fault Injection + E2E + Batch E2E
SukheeChoi Mar 20, 2026
c7a0c68
docs: 종합 테스트 구현 기록 — 설계 문서 업데이트
SukheeChoi Mar 20, 2026
4de2c26
fix: CodeRabbit 리뷰 반영 — Rate Limiter 429, backoff overflow, KEYS→SCAN…
SukheeChoi Mar 20, 2026
a20da60
docs: 설계 문서 업데이트 — Payment 도메인 클래스/ERD/시퀀스 다이어그램 추가
SukheeChoi Mar 20, 2026
25f1114
Merge pull request #260 from SukheeChoi/volume-6
SukheeChoi Mar 26, 2026
9e9493e
feat: ApplicationEvent 기반 이벤트 분리
SukheeChoi Mar 27, 2026
61ac85a
feat: Kafka 인프라 설정 보완 + Debezium CDC 구성
SukheeChoi Mar 27, 2026
df5fb13
feat: Metrics Consumer + 조회수/주문 이벤트 발행
SukheeChoi Mar 27, 2026
196bce9
feat: 선착순 쿠폰 비동기 발급
SukheeChoi Mar 27, 2026
dafedc1
feat: 배치 진화 — MetricsReconcile + Outbox/EventHandled Cleanup
SukheeChoi Mar 27, 2026
10c99ed
refactor: 미사용 코드 제거 + 테스트 작성 및 수정
SukheeChoi Mar 27, 2026
539bc02
docs: 이벤트 파이프라인 설계 문서 추가
SukheeChoi Mar 27, 2026
2c7cb6a
feat: Kafka 리밸런싱 전략 보강 — CooperativeSticky + Static Membership
SukheeChoi Mar 27, 2026
541233f
fix: 오프셋 관리 전략 수정 — auto.offset.reset 충돌 제거 + DLQ 활성화
SukheeChoi Mar 27, 2026
5791dda
feat: DomainEventPublisher 추상화로 이벤트 발행 보일러플레이트 제거
SukheeChoi Mar 27, 2026
723a328
feat: ProductFacade.restoreStock() 추가
SukheeChoi Mar 27, 2026
213ca06
feat: PaymentStatusHistory 감사 로그 도입 — 결제 상태 전이 추적
SukheeChoi Mar 27, 2026
204542c
feat: 5-layer recovery 경로에 PaymentStatusHistory 기록 적용
SukheeChoi Mar 27, 2026
b9c4b7e
docs: Decomposition + Data Management 패턴 분석 블로그 추가
SukheeChoi Mar 27, 2026
5409266
Merge pull request #299 from SukheeChoi/volume-7
SukheeChoi Apr 1, 2026
432b331
refactor: Redis TTL 요청 추적 + 메트릭스 메모리 집계 + 파티션 전략 문서화
SukheeChoi Apr 1, 2026
f2daad4
feat: Redis 기반 주문 대기열 시스템 구현
SukheeChoi Apr 1, 2026
4ad0d9b
feat: 대기열 한계(48,000) 및 타임아웃(600초) 안전장치 추가
SukheeChoi Apr 2, 2026
7feb292
feat: 토큰 TTL 외부화 (300→900초, 설정값으로 분리)
SukheeChoi Apr 2, 2026
e4d3f14
docs: 대기열 설계 문서 갱신 — 역산 체인, Queuing Theory, 운영 가이드
SukheeChoi Apr 2, 2026
03d7d95
feat: ZPOPMIN+토큰 발급 Lua 스크립트 원자화 — POP 후 유실 방지
SukheeChoi Apr 2, 2026
e0e4bf5
feat: 동적 Polling 주기 구현 — 순번별 1/3/5초 차등 제공
SukheeChoi Apr 3, 2026
f34d6bc
feat: 커스텀 메트릭 + Grafana 대시보드 구현
SukheeChoi Apr 3, 2026
5ea194f
feat: Redis 장애 시 Graceful Degradation (로컬 Rate Limiter fallback)
SukheeChoi Apr 3, 2026
4e15b38
feat: SSE 실시간 순번 Push (Delta 기반 브로드캐스트)
SukheeChoi Apr 3, 2026
bd6cf0b
test: BF 부하 테스트 스크립트 + 시드 데이터 스크립트
SukheeChoi Apr 3, 2026
c0391a5
docs: 대기열 설계 문서 갱신 — SSE, 동적 Polling, Graceful Degradation, QUEUE_FUL…
SukheeChoi Apr 3, 2026
d1ef903
test: SSE 통합 테스트 추가 — Controller+Registry+Scheduler 실제 연동 검증
SukheeChoi Apr 3, 2026
38e41a3
Merge upstream/SukheeChoi into volume-8
SukheeChoi Apr 9, 2026
aa23e7c
Merge pull request #334 from SukheeChoi/volume-8
SukheeChoi Apr 9, 2026
37d524d
feat: Ranking Score 계산 + Carry-Over (commerce-streamer 쓰기 인프라)
SukheeChoi Apr 10, 2026
2008e9b
feat: product_metrics 스키마 재설계 + MetricsConsumer 수정
SukheeChoi Apr 10, 2026
102fbfc
feat: Ranking 읽기 경로 — API + Facade + Repository (commerce-api)
SukheeChoi Apr 10, 2026
937a5d7
docs: 랭킹 시스템 설계 문서 + 구현 기록
SukheeChoi Apr 10, 2026
bfe8f44
feat: Late-Arriving Fact 이중 기록 — 인식일+발생일 cancel UPSERT
SukheeChoi Apr 10, 2026
84db674
feat: Lambda Architecture 배치 보정 잡 — DB 원장 기준 Redis 랭킹 덮어쓰기
SukheeChoi Apr 10, 2026
92ac2ea
fix: CouponDto 중복 record 정의 제거 — 미사용 CouponIssueRequestResponse 삭제
SukheeChoi Apr 10, 2026
a737e63
docs: 랭킹 설계 문서 갱신 — Late-Arriving Fact, Lambda Architecture 구현 기록
SukheeChoi Apr 10, 2026
a1a4e89
feat: 신상품 API — GET /api/v1/products/new 구현
SukheeChoi Apr 10, 2026
fc980b6
fix: 기존 테스트 컴파일 오류 수정 — 생성자 불일치 해소
SukheeChoi Apr 10, 2026
41f61ba
style: ProductController 와일드카드 import를 명시적 import로 변경
SukheeChoi Apr 10, 2026
6c3cdcb
feat: Product categoryId 필드 추가 — 카테고리 우선순위 인코딩 기반
SukheeChoi Apr 10, 2026
e4b1cf1
feat: Composite Score v2 + A/B 테스트 — 0~1 정규화, lastEventAt tiebreaker,…
SukheeChoi Apr 10, 2026
4e04bcd
feat: 주간/월간 랭킹 + Carry-Over Trim — ZUNIONSTORE 확장, ZSET 크기 관리
SukheeChoi Apr 10, 2026
b44bd33
fix: OrderFacadeTest NPE — DomainEventPublisher null을 no-op 람다로 대체
SukheeChoi Apr 10, 2026
4aae031
docs: 랭킹 설계 문서 갱신 — Score v2, A/B, 주간/월간, Trim 구현 기록
SukheeChoi Apr 10, 2026
92fe45c
Merge pull request #377 from SukheeChoi/volume-9
SukheeChoi Apr 14, 2026
8181ea4
docs: 과제 문서, 학습 로드맵 추가
SukheeChoi Apr 14, 2026
f0d3df0
docs: 배치 어플리케이션 분석 보고서 — MV Score 전략 확정
Apr 15, 2026
9c1764c
docs: 배치 코드 참고 스니펫 — 구현 시 패턴 레퍼런스
Apr 16, 2026
75de902
docs: 배치 코드 참고 스니펫 보강 + MV 랭킹 시스템 설계 문서
Apr 16, 2026
f6de522
docs: MV 랭킹 설계 — 슬라이딩 윈도우 확정, 지수 감쇠 분석, 요구사항 대조
Apr 16, 2026
65183a8
docs: 테크니컬 라이팅 소재 모음 — Score 전략 트레이드오프 5개 주제
Apr 16, 2026
739d492
docs: 테크니컬 라이팅 소재 — 실운영 관점으로 판단 근거 재작성
Apr 16, 2026
b1f4b16
docs: 블로그 소재 — Score/TOP-N을 SQL에서 처리하는 판단 근거
Apr 16, 2026
458c4de
docs: 블로그 소재 — Tasklet 전환 시 트레이드오프 분석
Apr 16, 2026
6b5eb12
docs: 블로그 소재 — Chunk vs Tasklet 본질 분석, 출제 의도 해석
Apr 16, 2026
016aff4
docs: Chunk vs Tasklet 트레이드오프 전면 재작성 + 설계 문서 갱신
Apr 16, 2026
3753d9c
docs: 블로그 소재 — Chunk/Tasklet 코드 예시 + 배치 운영 기능 분석
Apr 16, 2026
1c3b219
docs: Best Practice 대조 분석 + 설계 문서 운영 기능 반영
Apr 16, 2026
39fcaec
docs: CursorReader vs PagingReader 트레이드오프 분석
Apr 16, 2026
05635d6
docs: Partitioning 기반 대규모 집계 설계 확정
Apr 16, 2026
5e30b71
docs: 멱등성 시나리오 + Job Instance 동일성 설계 확정
Apr 16, 2026
ac79004
docs: 블로그 소재 전체에 '이 고민이 시작된 맥락' 도입부 추가
Apr 16, 2026
c814ce7
docs: Redis fallback 제거, MV 단일 소스 원칙 확정
Apr 16, 2026
4c9fbef
docs: 전체 재계산 vs 증분 계산 트레이드오프 + 전일 MV fallback 설계
Apr 16, 2026
1dfb514
feat: MV 랭킹 배치 Job 구현 — Partitioning + Map-Reduce 3-Step 구조
Apr 16, 2026
1babb5b
feat: MV 기반 주간/월간 랭킹 API 확장 — 단일 소스 + 전일 fallback
Apr 16, 2026
ea6d7d5
test: MV 랭킹 Job 통합 테스트 — 정상/멱등성/엣지케이스/취소 반영
Apr 16, 2026
fa7d840
docs: Phase 상태 갱신 + 다른 세션용 실행 가이드/PR/블로그 구조 추가
Apr 16, 2026
00bfc99
test: MV 랭킹 Job E2E 테스트 보강 및 실환경 검증 문서화
SukheeChoi Apr 16, 2026
f1563d7
docs: Round 10 테크니컬 라이팅 기획 + 블로그 초안 작성
SukheeChoi Apr 16, 2026
e27b47e
fix: Partitioner를 실제 행 수 기반 분할로 변경 — 데이터 skew 대응
Apr 17, 2026
8bd971b
docs: PR 초안 수정 + 10만 건 대규모 테스트 프롬프트 + 블로그 참고자료 정리
Apr 17, 2026
c41e85e
test: 10만 상품 × 30일 메트릭 대규모 배치 성능 테스트 추가
SukheeChoi Apr 17, 2026
21b50c8
docs: 배치 앱 분석 문서 production 브랜치 기준으로 갱신
Apr 17, 2026
49253de
refactor: ProductRankingMvJobConfig 코드 정리
Apr 17, 2026
9071dc6
docs: Partitioning 벤치마크 프롬프트 + PR 테스트 시나리오 갱신
Apr 17, 2026
191e618
docs: PR 초안 양식 재구성 — Summary/Context/Design/Flow 구조
Apr 17, 2026
12dd3c9
docs: PR 선택지 순서 변경 + Score 계산 방식 설명 보강
Apr 17, 2026
e01c742
test: Partitioning 벤치마크 추가 — gridSize=1(3,740ms) vs gridSize=4(1,763m…
SukheeChoi Apr 17, 2026
79774da
docs: 블로그 성능 섹션을 10만 건 대규모 테스트 기준으로 갱신
SukheeChoi Apr 17, 2026
d1e358c
docs: 성능 비교표 규모 네이밍 정리 — 소규모/대규모 2단계로 간소화
SukheeChoi Apr 17, 2026
97e1613
refactor: Score 공식 중앙화 — ScoreFormula 추출 (modules/jpa)
SukheeChoi Apr 17, 2026
202d244
refactor: ScoreFormula Javadoc 중복 제거 + 블로그 ScoreFormula 반영
SukheeChoi Apr 17, 2026
6ab7011
refactor: Redis weekly/monthly carry-over 제거 + 블로그/PR 정합성 수정
SukheeChoi Apr 17, 2026
cb451ac
docs: 설계 소재 문서에서 테크니컬 라이팅/블로그 용어 제거
SukheeChoi Apr 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
82 changes: 82 additions & 0 deletions .codeguide/dip-insights.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# DIP & 아키텍처 인사이트

> 3주차 학습 과정에서 수집한 실무적 인사이트 정리

---

## 1. DIP 정석 vs 실무 타협

### DIP 정석 구조 (이미지: [Kev] DIP정석)

```
[Domain Layer] [Infrastructure Layer]
Order (순수 도메인 객체) OrderEntity (@Entity, JPA)
OrderRepository (interface) ◀── OrderJpaRepositoryImpl (구현체)
```

- Domain Entity와 JPA Entity를 **완전 분리**
- Infrastructure에서 Entity 간 변환 처리

### 실무 타협 (이미지: [Kev] 장바구니 도메인 구현 사례)

**장바구니 사례**: Cart(Domain) / CartEntity(JPA) / CartRedisEntity(Redis)

- 다중 저장소(JPA + Redis) 지원 시 분리가 의미 있음
- CartRepository 인터페이스 하나로 JPA/Redis 모두 지원 가능

### 수강생 채팅에서 나온 분리의 비용

| 비용 | 내용 |
|------|------|
| 보일러플레이트 | Entity ↔ Domain 변환 로직(매퍼) 필요 |
| 더티체킹 포기 | JPA의 강력한 기능 못 씀, 명시적 save() 필요 |
| 클래스 폭발 | Order, OrderEntity 둘 다 관리 |
| 기능 제약 | JPA가 지원하는 편의 기능 활용 불가 |

---

## 2. DDD 저자의 실무 타협 (최범균, 도메인 주도 개발 시작하기)

### 명언 1: 변경이 거의 없는 상황에서 미리 대비하는 것은 과하다

> "DIP를 적용하는 주된 이유는 저수준 구현이 변경되더라도 고수준이 영향을 받지 않도록 하기 위함이다.
> 하지만, 리포지터리와 도메인 모델의 구현 기술은 거의 바뀌지 않는다.
> JPA로 구현한 리포지터리를 마이바티스나 다른 기술로 변경한 적이 없고,
> RDBMS를 사용하다 몽고DB로 변경한 적도 없다.
> 변경이 거의 없는 상황에서 변경을 미리 대비하는 것은 과하다고 생각한다."

### 명언 2: 복잡도를 높이지 않으면서 구조적 유연함 유지

> "JPA 전용 애너테이션을 사용하긴 했지만 도메인 모델을 단위 테스트하는 데 문제는 없다.
> 리포지터리도 마찬가지다. 스프링 데이터 JPA가 제공하는 Repository 인터페이스를 상속하고 있지만
> 리포지터리 자체는 인터페이스이고 테스트 가능성을 해치지 않는다.
> DIP를 완벽하게 지키면 좋겠지만 개발 편의성과 실용성을 가져가면서 구조적인 유연함은 어느정도 유지했다.
> 복잡도를 높이지 않으면서 기술에 따른 구현 제약이 낮다면 합리적인 선택이라고 생각한다."

---

## 3. 우리 과제에 적용할 인사이트

### 타협하는 부분 (실용성 우선)

| 항목 | 정석 | 우리의 타협 | 이유 |
|------|------|-----------|------|
| Domain Entity | 순수 POJO | @Entity 사용 | 더티체킹 활용, 보일러플레이트 감소 |
| VO | JPA 무관 | @Embeddable 사용 | 테스트에 영향 없음 |

### 지키는 부분 (구조적 유연함)

| 항목 | 적용 방식 | 이유 |
|------|----------|------|
| Repository Interface | Domain Layer에 정의 | 테스트 가능성 확보 (Fake 구현체 교체) |
| Repository 구현체 | Infrastructure Layer에 위치 | 의존 방향: Domain ← Infrastructure |
| Application Layer | Facade로 도메인 조합 | 유스케이스 조율과 비즈니스 로직 분리 |

### 판단 기준 (한 줄 요약)

```
"테스트 가능성을 해치지 않는 범위에서 타협한다"
```

- @Entity 사용해도 단위 테스트 가능? → ✅ 타협 OK
- Repository를 Infrastructure에서 직접 사용하면 테스트 어려움? → ❌ Interface 분리 필요
45 changes: 0 additions & 45 deletions .codeguide/loopers-1-week.md

This file was deleted.

185 changes: 0 additions & 185 deletions .coderabbit.yaml

This file was deleted.

5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,8 @@ out/

### Kotlin ###
.kotlin

### Claude Code ###
*.md
!docs/**/*.md
!blog/**/*.md
Loading