--- id: wiki-2026-0508-architecture-anti-patterns title: Architecture Anti-patterns category: 10_Wiki/Topics status: verified canonical_id: self aliases: [아키텍처 안티패턴, design anti-patterns, distributed monolith, big ball of mud] duplicate_of: none source_trust_level: B confidence_score: 0.9 verification_status: applied tags: [architecture, anti-patterns, distributed-systems, microservices, adr, code-smell, technical-debt] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: language-agnostic framework: any --- # Architecture Anti-patterns ## 📌 한 줄 통찰 > **"매 안 하면 좋은 것"**. 매 design 의 mistake catalog. 매 timeout misconfig, 매 distributed monolith, 매 big ball of mud. 매 anti-pattern 의 catalog 의 senior 의 첫 weapon. ## 📖 핵심 ### 매 카테고리 #### Distributed system - **Distributed monolith**: 매 microservice 가 sync coupling — 매 worst of both. - **Chatty service**: 매 N+1 inter-service call. - **Wrong timeout**: 매 too short = false fail / too long = bad UX. - **Shared database**: 매 service 가 같은 DB → 매 coupling. - **No circuit breaker**: 매 cascading failure. - **Synchronous chain**: 매 5 service hop = 매 latency 합. #### Decision-making - **Analysis paralysis**: 매 fear-driven indecision. - **Forgotten decision**: 매 email-only / 매 ADR 없음. - **Premature optimization**: 매 evidence X 의 optimize. - **Cargo cult**: 매 "Netflix 가 이렇게" 의 무비판 모방. #### Code structure - **Big ball of mud**: 매 boundary X. - **God object**: 매 single class 의 모든 logic. - **Anaemic model**: 매 entity 가 data 만 (case-by-case). - **Spaghetti**: 매 control flow tangled. - **Lava flow**: 매 dead code + commented-out. #### Microservice 특화 - **Nano-service**: 매 너무 작 — 매 communication 의 logic 의 dominate. - **Entity service**: 매 1 entity = 1 service (vs business capability). - **Sync everywhere**: 매 async 의 부재. - **No bounded context**: 매 model 의 leak. - **Versioning chaos**: 매 breaking change 의 coordination X. #### Data - **Data in flight**: 매 in-memory 의 single source of truth. - **Eventual consistency 의 ignore**: 매 user 의 see stale. - **Cache stampede**: 매 expire 시 동시 fetch. - **Read-modify-write race**: 매 lost update. ### Sequence problem - 매 anti-pattern 의 fix 가 매 다른 anti-pattern 의 generate. - 매 distributed monolith 의 fix → 매 chatty / 매 sync chain. - 매 god object 의 split → 매 nano-service. → 매 trade-off awareness 의 핵심. ### 매 detect 방법 - **Architecture test**: dependency-cruiser, ArchUnit. - **Dependency graph**: 매 cycle / 매 hub. - **Latency analysis**: 매 hop count. - **Code metric**: 매 cyclomatic / 매 LOC / 매 fan-out. - **Tracing**: 매 distributed trace 의 path. - **Postmortem catalog**: 매 incident pattern. ### 매 modern catalog - Mark Richards 의 "Software Architecture: The Hard Parts". - Sam Newman 의 "Building Microservices". - Vaughn Vernon "Implementing DDD". - AWS / Azure architecture pattern. ## 💻 패턴 (응용 — detection / fix) ### Architecture test ```js // .dependency-cruiser.js module.exports = { forbidden: [ { name: 'no-domain-to-infrastructure', severity: 'error', from: { path: '^src/domain' }, to: { path: '^src/infrastructure' }, }, { name: 'no-circular', severity: 'error', from: {}, to: { circular: true }, }, ], }; ``` ### ADR (Architecture Decision Record) template ```markdown # ADR-0042: Use Kafka for inter-service events ## Status Accepted (2026-05-10) ## Context 3 services (order, billing, inventory) need to coordinate. Sync HTTP creates cascading failure risk. ## Decision Adopt Kafka for async event-driven coordination. Use Avro for schema evolution. ## Consequences + Decoupling, scale, replay. - Operational complexity (Kafka cluster). - Debugging async harder. ## Alternatives considered 1. RabbitMQ — simpler but less throughput. 2. SQS — vendor lock-in. 3. Sync HTTP — original problem. ``` ### Circuit breaker (anti-pattern fix) ```ts class CircuitBreaker { state: 'closed' | 'open' | 'half-open' = 'closed'; failures = 0; lastFailure = 0; async call(fn: () => Promise): Promise { if (this.state === 'open') { if (Date.now() - this.lastFailure > 30_000) this.state = 'half-open'; else throw new CircuitOpen(); } try { const result = await fn(); if (this.state === 'half-open') this.state = 'closed'; this.failures = 0; return result; } catch (e) { this.failures++; this.lastFailure = Date.now(); if (this.failures > 5) this.state = 'open'; throw e; } } } ``` ### Detect distributed monolith ```python def detect_distributed_monolith(services, traces): """매 sync coupling chain 의 detect""" for trace in traces: sync_chain = [s for s in trace.spans if s.kind == 'sync'] if len(sync_chain) > 3: yield ('long sync chain', trace.id, sync_chain) # 매 deploy coupling deploy_pairs = collections.Counter() for incident in incidents: if len(incident.affected_services) > 1: for pair in combinations(incident.affected_services, 2): deploy_pairs[pair] += 1 return deploy_pairs.most_common(5) ``` ## 🤔 결정 기준 | 안티패턴 | 해결 | |---|---| | Distributed monolith | Async event + bounded context | | Wrong timeout | Tiered timeout + circuit breaker | | Forgotten decision | ADR + central wiki | | Analysis paralysis | Last responsible moment + spike | | God object | Refactor by responsibility | | Nano-service | Merge by business capability | | Cache stampede | Probabilistic refresh, lock | **기본값**: 매 ADR + architecture test + tracing + postmortem. ## 🔗 Graph - 부모: [[Software Architecture Styles]] - 변형: [[Big-Ball-of-Mud]] · [[Distributed-Monolith]] · [[Anaemic Domain Model]] · [[God-Object]] - 응용: [[Circuit-Breaker]] · [[ADR]] · [[Bounded Context]] - Adjacent: [[Technical_Debt|Technical-Debt]] · [[Code Smells]] · [[Refactoring_Best_Practices|Refactoring]] · [[Postmortem]] ## 🤖 LLM 활용 **언제**: 매 architecture review. 매 design decision. 매 incident 의 root cause analysis. **언제 X**: 매 simple project (대부분 의 anti-pattern 의 N/A). ## ❌ 안티패턴 (meta) - **모든 anti-pattern 의 fix**: 매 trade-off 의 ignore. - **Cargo cult**: 매 "최선" 의 context 의 ignore. - **No ADR**: 매 future-self 의 confusion. - **Architecture astronaut**: 매 over-design. - **YAGNI 의 무시**: 매 future hypothetical 의 design. ## 🧪 검증 / 중복 - Verified (Mark Richards, Sam Newman, AWS Well-Architected). - 신뢰도 B. - Related: [[Software Architecture Styles]] · [[Anaemic Domain Model]] · [[Circuit-Breaker]]. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — 카테고리 + 매 distributed / decision / data + ADR + circuit breaker |