SOLID 재검토 — 포스트 패턴 관점

발행: (2025년 12월 23일 오전 02:55 GMT+9)
8 min read
원문: Dev.to

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

원칙만으로는 시스템을 확장할 수 없습니다. 힘을 이해하는 것이 시스템을 확장합니다.

Back to Blog

관련 글

더 보기 »

SOLID 원칙 + 디자인 패턴

!Forem 로고 https://media2.dev.to/dynamic/image/width=65,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%...