기능은 빨리 만들었는데, 왜 점점 고치기 어려워질까?
AI 덕분에 기능을 만드는 속도는 정말 빨라졌습니다.
예전에는 하루 종일 만들어야 했던 기능도
이제는 몇 분 만에 만들어집니다.
문제는 그다음입니다.
기능 하나 추가하려고 하는데, 예상보다 훨씬 많은 곳을 수정해야 합니다.
할인 기능을 추가했는데 결제가 영향을 받고,
배송 정책을 바꿨는데 주문 조회가 망가지고,
포인트 정책을 수정했는데 테스트 수십 개가 실패합니다.
분명 기능은 빨리 만들었는데,
왜 시스템은 점점 고치기 어려워질까요?
함께 바뀌지 않아도 될 것까지 함께 바뀝니다
코드가 많아져서 벌어지는 일이 아닙니다.
코드는 예전부터 꾸준히 늘어 왔지만,
고치기 어려워진 건 최근입니다.
진짜 원인은 하나를 바꿀 때 함께 바뀌어야 하는
범위입니다.
주문과 결제, 배송과 조회, 포인트와 테스트.
이것들이 원래 하나였다면 함께 바뀌는 게 맞습니다.
문제는 원래 독립적이어도 되는 것들까지
함께 바뀐다는 데 있습니다.
기능 하나를 수정하는데 다섯 개의 객체를 수정해야 하고,
비즈니스 규칙이 여기저기 흩어지고,
시스템 트랜잭션 범위는 점점 커집니다.
결국 개발자는 코드를 고치는 것이 아니라 영향 범위를 추적하는 데 시간을 쓰게 됩니다.
경계가 없으면 객체가 스스로를 지키지 못합니다
이 경계가 없으면 비즈니스 로직은 한곳에 모이지 못하고
여기저기 흩어집니다.
할인 규칙 일부는 주문 객체에, 일부는 결제 서비스에,
일부는 어딘가의 헬퍼 클래스에 있다면,
그건 응집도가 낮다는 신호입니다.
하나의 객체 안에서만 지켜지는 규칙이 아니라,
할인율이 바뀌면 결제 금액도 함께 바뀌어야 한다는
식으로 여러 객체가 함께 지켜야 하는 비즈니스 규칙도
있습니다.
DDD에서는 이걸 불변식(Invariant)이라고 부릅니다.
응집도가 낮으면 이 불변식을 지킬 책임을 진 곳이
어디에도 없습니다.
할인율을 바꾸는 코드와 결제 금액을 바꾸는 코드가
서로 다른 곳에 흩어져 있으면,
누구도 두 값이 같은 순간에 함께 바뀐다는 걸
보장하지 못합니다.
할인율은 바뀌었는데 결제 금액은 그대로인
반쪽짜리 상태,
즉 일관성이 깨진 상태를 아무도 막지 못합니다.
이렇게 스스로를 지키지 못하는 객체는 결국
유지보수 비용으로 돌아옵니다.
버그를 하나 고치려면 관련된 곳을 전부 찾아
같이 고쳐야 하고,
어디까지가 관련된 곳인지도 코드를 읽어야만
알 수 있습니다.
AI에게 맡기면 왜 이런 구조가 나올까
AI에게 주문 기능을 만들어 달라고 하면
필요한 코드를 알아서 다 만들어 줍니다.
동작만 보면 문제가 없습니다.
그런데 아무 설명 없이 맡기면,
유지보수 작업할 때 여러 곳을 함께 고쳐야 하는
코드가 만들어집니다.
왜일까요.
AI는 눈앞의 요구사항을 구현하는 데는 뛰어납니다.
하지만 이 비즈니스에서 무엇이 함께 바뀌어야 하고
무엇이 따로 바뀌어도 되는지는 코드만 봐서는 알 수
없습니다.
그 경계는 코드가 아니라 도메인 지식에서 나오기
때문입니다.
AI는 일단 관련 있어 보이는
것들을 한 덩어리로 엮습니다.
당장은 잘 돌아갑니다.
문제는 다음 기능이 추가될 때 드러납니다.
경계를 정하는 건 여전히 사람의 몫입니다
할인 정책이 바뀔 때 결제 로직까지 건드려야 한다면,
그건 두 개념이 원래 하나여서가 아니라
누군가 처음 설계할 때 경계를 잘못 그었기 때문입니다.
이 경계는 “객체를 어떻게 나눌까”로 정해지는 게
아닙니다.
“이 규칙이 바뀔 때 다른 무엇이 함께
바뀌어야 하는가”라는 질문에 먼저 답해야 정해집니다.
이 질문에 답하려면 도메인을 알아야 합니다.
할인과 결제가 왜 지금처럼 얽혀 있는지,
포인트 정책이 왜 자주 바뀌는지,
그 이유는 코드가 아니라 비즈니스 안에 있습니다.
AI는 이 질문에 답하지 않습니다.
답할 수 있는 재료를 갖고 있지 않기 때문입니다.
그래서 AI가 코드를 더 많이 작성할수록,
이 경계를 판단하고 지시할 수 있는 사람이
더 필요해집니다.
이렇게 변경의 경계를 설계하는 방법,
DDD에서는 이걸 Aggregate라고 부릅니다.
이름이 낯설어도 괜찮습니다.
중요한 건 이름이 아니라,
현재 시스템에서 무엇이 함께 바뀌고
무엇이 따로 바뀌어야 하는지
스스로 판단할 수 있는 능력입니다.
지금 이 판단, 얼마나 자신 있으신가요
이번 스프린트에 추가한 기능이,
다음 스프린트에 추가할 기능의 발목을 잡을지 아닐지.
지금 여러분은 이 질문에 답할 수 있나요?
답할 수 없다면, 그건 실력이 부족해서가 아닙니다.
누구도 가르쳐 준 적이 없어서일 가능성이 큽니다.
AI가 코드를 아무리 빨리 작성해 줘도,
이 판단은 대신해 주지 않습니다.
그리고 이 판단을 못 하는 채로 AI에게 계속 기능을
맡기면, 시스템은 점점 더 손대기 무서운 곳이 됩니다.
와일드 백엔드에서 이 판단력을 기릅니다.