← 블로그

도메인 경계를 지키는 Django: interface.py를 강제하는 설계

모듈러 모놀리스를 말할 때 사람들은 종종 폴더 구조에만 집중한다. 하지만 진짜 중요한 건 폴더 이름이 아니라 경계를 어떻게 강제하느냐다.

내가 Django에서 interface.py를 두는 이유도 여기에 있다.

왜 직접 import를 막으려 하나

처음에는 다른 도메인의 모델이나 서비스 함수를 그냥 import하는 것이 빨라 보인다. 하지만 그 습관이 쌓이면 금방 이런 일이 생긴다.

  • 도메인 간 의존 방향이 흐려진다
  • 내부 구현이 바뀔 때 파급 범위가 커진다
  • 순환 의존이 생긴다
  • 어느 도메인이 어떤 데이터를 소유하는지 모호해진다

즉 코드가 한 저장소 안에 있더라도, 경계가 무너지면 사실상 스파게티 모놀리스가 된다.

interface.py가 하는 일

interface.py는 거창한 패턴이 아니다. 단순히 외부 도메인이 호출할 유일한 입구를 두는 것이다.

  • 외부에 공개할 함수만 노출한다
  • 입출력 계약을 고정한다
  • 내부 구현은 숨긴다

이렇게 하면 도메인 내부에서는 자유롭게 바꾸더라도, 외부와의 합의는 상대적으로 안정적으로 유지된다.

Django에서도 충분히 의미가 있다

누군가는 “한 저장소인데 그렇게까지 해야 하나”라고 말할 수 있다. 내 경험상 바로 한 저장소이기 때문에 더 필요하다.

물리적으로 떨어진 마이크로서비스는 네트워크가 경계를 강제한다. 하지만 Django 모놀리스는 import 한 줄이면 모든 경계를 우회할 수 있다. 그래서 구조적 규율을 코드 레벨에서 의식적으로 만들어야 한다.

내가 얻는 것

interface.py를 강제하면 얻는 이익은 크다.

  • 도메인 소유권이 또렷해진다
  • 테스트 경계가 명확해진다
  • AI도 어떤 타입과 함수가 공개 계약인지 이해하기 쉬워진다
  • 리팩터링 시 영향 범위를 예측하기 쉬워진다

결국 이건 장식이 아니다. 모놀리스를 오래 건강하게 유지하기 위한 가장 값싼 통제 장치에 가깝다.