"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

★철학으로 보는 코딩

마틴 파울러와 도메인 주도 개발(DDD)의 함정

허민영 2025. 6. 8. 13:52

프로그래밍 설계 원칙에 대한 균형잡힌 관점

프로그래밍의 근본적 어려움은 복잡한 현실을 코드로 옮기는 과정에서 발생한다. 현재 널리 받아들여지는 설계 원칙들과 아키텍처 패턴들이 많은 도움을 주고 있지만, 때로는 맥락을 고려하지 않은 채 획일적으로 적용될 때 예상치 못한 복잡성을 만들어낼 수 있다.

SOLID 원칙의 맥락적 한계

SOLID 원칙은 분명히 좋은 지침이지만, 모든 상황에 동일하게 적용하기에는 한계가 있다. 특히 의존성 역전 원칙(DIP)의 경우, 시스템 규모에 따른 적절한 결합 메커니즘을 고려해야 한다. 클래스 내부에서는 직접 호출이 효율적이고, 작은 규모에서는 구체 클래스 주입이 더 적합할 수 있다. 무조건적인 추상화는 때로는 불필요한 복잡성을 초래할 수 있다.

리스코프 치환 원칙(LSP) 역시 이론적으로는 타당하지만, 실제 비즈니스 도메인에서는 맥락에 따라 다르게 동작해야 하는 경우가 빈번하다. 완벽한 치환 관계보다는 실용적인 해결책이 더 나은 선택일 수 있다.

설계 패턴의 양면성

현대적인 설계 패턴을 따르는 코드는 확실히 개별 컴포넌트 단위에서 깔끔하고 이해하기 쉬워 보인다. 각 클래스와 메서드가 단일 책임을 가지고 명확한 역할을 수행하기 때문이다. 하지만 시스템 전체적으로 보면 더 많은 연결점과 추상화 계층이 생겨나게 된다.

예를 들어, 단순한 호출 관계를 인터페이스, 팩토리, 의존성 주입 등으로 감싸게 되면 개별 구성 요소는 깔끔해지지만 전체적인 복잡도는 증가할 수 있다. 이는 국소적 단순성과 전역적 복잡성 사이의 트레이드오프 문제라고 볼 수 있다.

DDD의 이상과 현실 사이의 간극

도메인 주도 설계(DDD)는 마틴 파울러의 기술 중심적 접근과는 대조적으로 비즈니스 도메인을 중심에 둔다는 점에서 분명한 가치가 있다. 유비쿼터스 언어를 통해 개발자와 도메인 전문가 간의 소통을 개선하고, 비즈니스 로직을 명확하게 표현하려는 시도는 매우 의미 있다.

그러나 DDD 역시 실무에 적용할 때 몇 가지 한계가 드러난다. 애그리거트, 바운디드 컨텍스트, 도메인 서비스 등의 개념들은 이론적으로는 명확해 보이지만, 실제 복잡한 비즈니스 상황에서는 경계가 모호해지는 경우가 많다. 특히 기존 레거시 시스템과의 통합이나 빠르게 변화하는 스타트업 환경에서는 완벽한 DDD 구조를 구축하기보다는 점진적이고 실용적인 접근이 더 효과적일 수 있다.

또한 DDD를 엄격하게 적용하려다 보면 도메인 모델링에 과도한 시간을 투자하게 되거나, 오히려 단순한 CRUD 작업까지도 복잡한 도메인 계층으로 감싸게 되는 오버엔지니어링 문제가 발생할 수 있다.

기술 중심과 도메인 중심 접근의 조화

마틴 파울러의 기술적 설계 원칙과 DDD의 도메인 중심 접근 사이에서 균형을 찾는 것이 중요하다. 기술적 품질(코드의 깔끔함, 유지보수성, 테스트 용이성)과 비즈니스 가치(도메인 지식의 정확한 구현, 변화하는 요구사항에 대한 대응) 모두 고려해야 한다.

이를 위해서는 프로젝트의 성격과 규모, 팀의 역량, 비즈니스 도메인의 복잡성 등을 종합적으로 고려해야 한다. 단순한 CRUD 위주의 시스템에서는 과도한 도메인 모델링보다는 실용적인 접근이 적합할 수 있고, 복잡한 비즈니스 로직을 다루는 시스템에서는 DDD의 개념들이 큰 도움이 될 수 있다.

확장성과 유연성의 맥락적 적용

확장성과 유연성은 정말로 필요한 부분에 집중되어야 한다. 이를 판단하기 위해서는 기술적 지식만큼이나 도메인에 대한 깊은 이해가 중요하다. 비즈니스 요구사항 중 어떤 부분이 자주 변경되고, 어떤 부분이 안정적인지 파악할 수 있어야 한다.

도메인 이해가 부족한 상태에서는 "나중에 바뀔 수도 있다"는 막연한 우려로 모든 곳에 유연성을 적용하게 된다. 결과적으로 정말 유연해야 할 곳의 중요성이 희석되고, 단순해도 되는 곳이 불필요하게 복잡해질 수 있다.

이론과 실무의 균형

널리 알려진 설계 원칙들과 도메인 주도 설계 모두 분명히 가치 있는 지침이지만, 실제 성공한 대규모 시스템들을 살펴보면 반드시 이론적 완결성보다는 실용적 접근을 택한 경우가 많다. 중요한 것은 이론과 실무 사이에서 적절한 균형점을 찾는 것이다.

소프트웨어 개발팀은 자신들의 도메인과 환경에 가장 적합한 접근 방식을 스스로 찾아가야 한다. 때로는 마틴 파울러의 기술적 원칙이, 때로는 DDD의 도메인 중심 사고가, 때로는 두 접근을 적절히 조합한 방식이 최선의 선택이 될 수 있다.

패러다임의 다양성과 실용적 접근

프로그래밍 패러다임을 선택할 때도 "어떤 것이 절대적으로 좋은가"보다는 "어떤 상황에서 어떤 것이 적합한가"를 고려해야 한다. 기능 구현에는 객체지향이, 성능이 중요한 부분에는 함수형이, 빠른 프로토타이핑에는 절차형이 더 효과적일 수 있다.

결국 중요한 것은 이론적 완결성보다는 주어진 문제를 효과적으로 해결하는 것이다. 기술적 품질과 비즈니스 가치를 모두 고려하고, 경험과 맥락을 바탕으로 한 실용적 판단을 통해 진정으로 가치 있는 소프트웨어를 만들어가는 것이 중요하다. 현실의 복잡성을 인정하고, 상황에 맞는 유연한 접근을 추구할 때 비로소 지속 가능한 소프트웨어 개발이 가능해진다.