AI와 빈약한 도메인 모델(Anemic Domain Models) 문제
AI and the problem of Anemic Domain Models
핵심 요약
AI가 코드를 짤 때 비즈니스 로직이 도메인 객체가 아닌 UI에 흩어지는 '빈약한 도메인 모델' 안티패턴을 반복하는 문제에 대한 고찰.
- 빈약한 도메인 모델 — 비즈니스 로직이 객체에 없고 UI 계층에 흩어져 기술 부채를 유발함.
- AI의 코드 생성 — Claude가 문맥을 좁게 파악하여 재사용성보다는 당장 작동하는 코드 위주로 작성함.
- 아키텍처 리팩토링 — AI가 짠 코드를 그대로 쓰지 않고 별도의 아키텍처 개선 세션을 거쳐야 함.
- 컨텍스트 주입 — AI에게 아키텍처 원칙을 주입하려 해도 무시당하기 일쑤라 운영자의 깊은 이해가 필수적임.
수년 전, 마틴 파울러는 빈약한 객체 안티패턴에 관한 훌륭한 글을 썼습니다: https://martinfowler.com/bliki/AnemicDomainModel.html
그의 관점에 동의한다고 가정하면(글에 대한 논쟁은 하지 맙시다, OK?), AI가 거의 예외 없이 이 안티패턴을 따른다는 것은 분명하며, CLAUDE.md나 다른 지침으로 이를 제어하기란 상당히 어렵습니다.
다음과 같이 코드를 작성하는 대신:
- Object1과 Object2가 모든 비즈니스 로직을 가짐
- 모든 UI 구현체는 모델 데이터를 조작하기 위해 Object1과 Object2를 사용하며, 오직 화면 표시와 사용자 상호작용에만 집중함
결국 이런 결과가 나옵니다:
- Object1과 Object2는 동작이 없는 구조체에 불과함
- UI 구현체 A는 사용자가 원하는 작업을 수행하는 데 필요한 모든 비즈니스 로직을 내장함
- UI 구현체 B는 중복되거나 불필요한 추가 비즈니스 로직을 가짐
- UI 구현체 C는 A와 B에도 존재하는 비즈니스 로직을 중복하거나 재발명함
이는 시간이 지남에 따라 엄청난 기술 부채를 만듭니다. 비즈니스 로직이 여러 UI 구현체에 산탄총처럼 흩어져 있기 때문에, 새로운 기능을 구현할 때 재사용 가능한 코드를 활용할 수 없고 기존 비즈니스 로직을 복사/붙여넣기하거나 변형을 만들어야 합니다. 또한 비즈니스 로직이 Object1과 Object2 내부에 캡슐화되지 않고 노출되어, 시스템을 다루는 모든 사람이 해당 객체의 내부 구조를 이해해야 함을 의미합니다.
이 문제를 다루는 제 방식은 완벽하지는 않지만... 저는 다음과 같이 합니다:
- 제가 작성한 사양을 바탕으로 Claude가 기능을 코딩하게 합니다. 저는 아키텍처 원칙을 강요하지 않습니다. Claude.md에 아키텍처 목표("객체는 동작을 가져야 하며, 빈약한 모델을 만들지 말 것")를 포함하지만, Claude는 보통 그 조언을 무시하고 안티패턴을 따릅니다.
- 기능을 작동하게 만듭니다.
- 그런 다음 항상 아키텍처 리팩토링 세션을 가집니다. 이는 새로운 코드에는 항상 필요하지만, 버그 수정이나 기능 개선에는 거의 필요하지 않습니다.
하지만, 지루한 작업입니다.
이 문제를 어떻게 해결하시는지 궁금합니다. 의견 있으신가요?

