SOLID 재검토 — 포스트 패턴 관점
Source: Dev.to
원칙이 중요한 이유보다 그 뒤에 있는 힘이 더 중요하다
SOLID는 체크리스트가 아니다.
그것은 더 깊은 힘들을 역사적으로 압축한 것이다.
이 글은 시리즈 5부이다:
- C# 클래스: 기본 원칙부터 아키텍처 마스터리까지
- 추상 클래스 vs 인터페이스 — 시스템 관점
- 컴포지션 vs 상속 — 변화의 물리학
- 캡슐화와 정보 은닉 — 무지를 설계한다
- SOLID 재조명 — 포스트 패턴 관점
이 글은 여러분이 이미 SOLID를 알고 있다고 가정한다.
우리의 목표는 왜 존재하는지, 언제 깨지는지, 그리고 패턴이 사라진 뒤에 무엇이 남는지를 이해하는 것이다.
SOLID를 규칙으로 가르치는 문제점
- Single Responsibility
- Open/Closed
- Liskov Substitution
- Interface Segregation
- Dependency Inversion
그들은 다음과 같이 가르쳐진다:
- 정적 규칙
- 로컬 코드 검사
- 리팩터링 휴리스틱
하지만 SOLID는 그런 방식으로 사용되도록 설계된 것이 아니다.
SOLID는 변화하는 시스템에 대한 emergent description이다.
SOLID는 코드가 아니라 변화에 관한 것이다
모든 SOLID 원칙은 한 가지 질문에 답하기 위해 존재한다:
“변화는 어디에 도달하고, 얼마나 퍼지는가?”
SOLID는 아름다움에 관한 것이 아니다.
그것은 피해 통제에 관한 것이다.
S — 단일 책임 원칙
(실제로는: 변경의 단일 이유)
SRP는 “작은 클래스”에 관한 것이 아닙니다.
변경 이유를 분리하는 것에 관한 것입니다.
public class ReportService
{
public void Generate() { }
public void SaveToDisk() { }
public void SendEmail() { }
}
이 클래스는 하나의 책임(보고서)을 가지고 있지만 변경 이유가 세 가지입니다.
조직 경계가 겹칠 때 SRP가 위배됩니다.
이는 클래스가 얼마나 큰가가 아니라 누가 변경을 요구하는가와 관련됩니다.
O — Open/Closed Principle
(확장성을 위한 설계, 협업 없이)
OCP는 협업 비용을 줄이기 위해 존재합니다.
public interface IDiscountPolicy
{
decimal Apply(decimal price);
}
새로운 동작은 새 코드로 나타나며, 기존 코드를 수정하지 않습니다.
실제 이점:
- 회의 없음
- 병합 충돌 없음
- 다른 코드를 깨뜨릴 위험 없음
OCP는 사회적 확장 원칙입니다.
L — 리스코프 치환 원칙
(시맨틱 드리프트 방지)
LSP는 상속 구문에 관한 것이 아니다.
그것은 의미 보존에 관한 것이다.
Stream s = new MemoryStream();
이것이 작동하는 이유는:
- 기대가 유효하게 유지된다
- 시맨틱이 보존된다
동작이 호출자를 놀라게 하면, 컴파일러가 만족해도 LSP가 깨진 것이다.
LSP는 추상화에 대한 신뢰를 보호한다.
I — 인터페이스 분리 원칙
(인지 부하 최소화)
ISP는 인간이 병목 현상이기 때문에 존재한다.
public interface IWorker
{
void Work();
void Eat();
}
모든 작업자가 먹는 것은 아니다.
ISP가 위배되는 경우:
- 구현자는 필요하지 않은 것에 신경 쓰도록 강요받는다
- 이해하려면 관련 없는 메서드를 읽어야 한다
ISP는 정신적 대역폭을 최적화하며, 런타임이 아니다.
D — Dependency Inversion Principle
(Reversing the Flow of Volatility)
DIP는 SOLID의 핵심이다.
고수준 정책은 저수준 세부 사항에 의존해서는 안 된다.
public class OrderService
{
public OrderService(IPaymentGateway gateway) { }
}
의존성 방향이 반전된다:
- 안정적인 코드는 안정적인 추상화에 의존한다
- 변동성이 큰 코드는 가장자리에 매달린다
DIP는 핵심을 보호하는 것이다.
SOLID를 힘 다이어그램으로
| 원칙 | 제어되는 주요 힘 |
|---|---|
| SRP | 조직 변화 |
| OCP | 조정 비용 |
| LSP | 의미 안정성 |
| ISP | 인지 부하 |
| DIP | 변동성 방향 |
이러한 힘이 중요할 때 SOLID가 작동합니다.
SOLID가 해로워질 때
SOLID가 실패하는 경우:
- 기계적으로 적용될 때
- 너무 일찍 강제될 때
- 시스템 전체가 아니라 국부적으로 최적화될 때
전형적인 증상:
- 클래스당 인터페이스 폭발
- 과도하게 추상화된 도메인
- “SOLID가 말했으니”라는 코드
이는 카고 컬트 아키텍처입니다.
Post‑Pattern Thinking
패턴과 원칙은 지도이며, 영토가 아니다.
성숙한 시스템에서는:
- 제약은 패턴보다 더 중요하다
- 힘은 규칙보다 더 중요하다
- 진화는 우아함보다 더 중요하다
SOLID는 배경으로 사라지고, 남는 것은 의도적인 설계이다.
통합 정신 모델
SOLID는 변화의 표면적을 최소화합니다.
디자인이 다음을 줄이면:
- 폭발 반경
- 조정
- 놀라움
- 두려움
그것은 SOLID입니다 — 교과서 규칙을 깨더라도.
최종 요약
주니어 개발자는 묻는다:
“이게 SOLID인가요?”
시니어 엔지니어는 묻는다:
“이것이 바뀔 때는 어떻게 되나요?”
그 질문에는 다섯 가지 원칙이 모두 포함되어 있습니다.
✍️ Cristian Sifuentes
.NET / C# • Architecture • Systems Thinking
원칙만으로는 시스템을 확장할 수 없습니다. 힘을 이해하는 것이 시스템을 확장합니다.