LLM 호출을 도메인 경계 안에 두지 않는 이유
모델을 바꾸는 일이 주문 도메인을 건드리는 일이 되면 안 된다.
목차
LLM 호출을 도메인 서비스 안에 직접 넣으면 처음에는 편하다. 바꿀 때 드러난다.
무엇이 자주 바뀌는가
- 모델 이름과 파라미터 — 몇 달에 한 번
- 프롬프트 — 몇 주에 한 번
- 주문 규칙 — 사업이 바뀔 때
셋의 주기가 다르다. 같은 클래스에 두면 가장 자주 바뀌는 것의 주기로 전체가 움직인다.
포트를 사이에 둔다
public interface SummaryPort {
Summary summarize(OrderSnapshot order);
}도메인은 SummaryPort 만 안다. 그 구현이 LLM 인지, 규칙 기반인지, 사람인지는 모른다.
이 경계 덕에 얻는 것이 셋이다.
- 테스트에서 모델을 부르지 않는다
- 모델 장애 시 대체 구현으로 바꿀 수 있다
- 프롬프트를 고치는 커밋이 주문 도메인을 건드리지 않는다
경계를 어디에 그을지는 되돌림 가능성으로 정한다
되돌릴 수 없는 조작(발송·결제·삭제)은 포트 바깥에 둔다. 모델이 결정하고 사람이 실행하는 구조가 되어야, 모델이 틀렸을 때 멈출 자리가 남는다.