안녕하세요? 클린 아키텍처 스터디 진행을 맡은 조영록입니다. 2주차에는 클린 아키텍처의 7장~11장을 읽고 이야기를 나누었습니다.
소프트웨어 시스템이 거대해질수록, 개발 조직이 당면하는 가장 큰 문제는 '변경 비용의 급증'입니다. 초기에는 높은 생산성을 보이던 프로젝트도 시간이 지남에 따라 사소한 기능 추가조차 조적인 결합도로 인해 큰 비용을 초래하게 됩니다.
최근 스터디를 통해 소프트웨어 설계의 근간이 되는 SOLID 원칙과 클린 아키텍처, 그리고 생성형 AI 시대에 이러한 아키텍처 원칙이 가지는 새로운 의미에 대해 심도 있게 논의했습니다. 핵심 내용을 아래와 같이 정리합니다.
1. 변경 비용을 낮추기 위한 SOLID 원칙의 재해석
SOLID 원칙을 단순한 객체지향의 암기 요소가 아닌, 아키텍처 관점에서 '비용을 줄이는 수단'으로 접근해야 합니다.
SRP (단일 책임 원칙): 흔히 '하나의 클래스는 하나의 일만 해야 한다'로 오해받지만, 본질은 '하나의 모듈은 오직 하나의 변경 이유만 가져야 한다'는 것입니다. 서로 다른 목적을 가진 액터(Actor)가 동일한 코드를 공유할 때 발생하는 '우발적 중복'을 물리적으로 분리함으로써, 변경으로 인한 부수 효과(Side Effect)와 유지보수 비용을 최소화할 수 있습니다.
OCP (개방-폐쇄 원칙): 새로운 코드를 추가하는 것만으로 기능을 확장할 수 있어야 하며, 기존 코드는 변경에 닫혀 있어야 합니다. 이는 플러그인(Plugin) 아키텍처의 근간이 되며, 하위 계층의 변경으로부터 상위 계층의 비즈니스 규칙을 보호하는 역할을 합니다.
LSP (리스코프 치환 원칙) & ISP (인터페이스 분리 원칙): 하위 타입은 상위 타입을 완벽히 대체할 수 있어야 합니다. 무분별한 상속은 추상화 누수(Leaky Abstraction)와 불필요한 의존성을 유발하므로, 인터페이스를 세밀하게 분리(ISP)하고 상속보다는 합성(Composition)을 활용하여 상호 치환이 가능한 유연한 구조를 만들어야 합니다.
DIP (의존성 역전 원칙): 소스 코드의 제어 흐름을 역전시켜, 변동성이 큰 구체적인 구현체 대신 안정적인 추상화(인터페이스)에 의존하게 만듭니다.
2. 실무에서의 아키텍처 적용과 DDD (도메인 주도 설계)
아키텍처 원칙은 실무에서 도메인과 조직의 형태에 따라 다양하게 적용됩니다.
바운디드 컨텍스트(Bounded Context)와 SRP: DDD에서 강조하는 바운디드 컨텍스트는 SRP의 거시적 확장판으로 볼 수 있습니다. 도메인의 경계를 명확히 구분하는 것은 코드의 응집도를 높일 뿐만 아니라, 개발 조직 간의 커뮤니케이션 비용을 줄이는 핵심 요소입니다
의존성의 물리적/논리적 격리: 단순히 계층(Layer)을 나누는 것을 넘어, 패키지 간의 의존성을 엄격하게 관리하는 것이 중요합니다. Spring Modulith와 같은 도구를 활용해 모듈 간의 임포트(Import)를 강제 차단하거나, 도메인 이벤트(Domain Event) 및 Facade를 통해 외부 시스템과의 결합도를 낮추는 전략이 유효합니다.
최근 LLM을 활용한 코딩 보조 도구(Claude Code 등)가 발전하면서, 이른바 '바이브 코딩(Vibe Coding, 결과물 위주의 빠른 구현)'이 유행하고 있습니다. 하지만 AI 기술의 발전이 소프트웨어 엔지니어링의 기본 원칙을 대체할 수는 없습니다.
하네스 엔지니어링(Harness Engineering)의 대두: AI는 높은 확률로 작동하는 코드를 만들어내지만, 동시에 치명적인 오류를 누적시킬 위험도 안고 있습니다. 이를 통제하기 위해서는 CI/CD, TDD, 명확한 코드 컨벤션 등 AI를 올바른 방향으로 이끄는 엄격한 제어 환경(Harness)이 필수적입니다.
프롬프트로서의 아키텍처: 기존의 스파게티 코드(Brownfield)에서는 AI조차 구조를 효과적으로 개선하지 못합니다. 반면, SOLID와 클린 아키텍처가 잘 적용된 코드베이스에서는 AI 에이전트에게 명확한 컨텍스트와 제약을 부여할 수 있습니다. 즉, 설계 원칙은 개발자 간의 소통 도구를 넘어 AI와의 효과적인 협업을 위한 거버넌스 도구로 진화하고 있습니다.
맺음말
소프트웨어(Software)는 그 이름처럼 요구사항 변화에 맞춰 '부드럽게' 변경될 수 있어야 합니다. 생성형 AI가 단순한 코딩 작업을 대체하는 시대가 오더라도, 복잡성을 제어하고 변경 비용을 최소화하는 시스템 구조를 설계하는 엔지니어의 핵심 역량은 변함없이 높은 가치를 지닐 것입니다.