왜 나는 Vertical Slice를 고집하는가
한 줄 결론
나는 Vertical Slice를 폴더 미학으로 쓰지 않는다. 기능의 응집도를 지키고, 변경 범위를 국소화하고, AI가 스파게티 코드를 만들지 못하게 하기 위한 구조적 선택으로 쓴다.
왜 문제인가
프로젝트가 조금만 커지면 보통 이런 구조가 생긴다.
- models/
- services/
- serializers/
- views/
- utils/
처음엔 깔끔해 보인다. 하지만 기능 하나를 수정하려면 여러 폴더를 계속 왕복해야 한다.
예를 들어 “보충제 비교 기능”을 바꾸려면,
- model 수정
- service 수정
- serializer 수정
- api 수정
- test 수정
이렇게 흩어진다.
문제는 파일 수가 아니라 기능이 수평으로 분해되어 응집력을 잃는 것이다.
Vertical Slice는 무엇을 바꾸나
Vertical Slice는 구조를 이렇게 본다.
- 인증 기능
- 결제 기능
- 뉴스 수집 기능
- 사건 그룹핑 기능
- 보충제 비교 기능
즉 “레이어별로 묶지 말고, 기능별로 묶는다”는 것이다.
그 안에서 필요한 model, api, schema, service, test가 같이 붙어 있는 구조가 된다.
이렇게 하면 한 기능의 변경 범위가 훨씬 분명해진다.
내가 이 구조를 선호하는 이유
1. 변경 범위가 좁다
기능 하나를 수정할 때 같은 슬라이스 안에서 대부분 해결된다.
즉,
- 어디를 봐야 하는지 빠르게 안다
- 관련 코드가 가까이 있다
- 사이드 이펙트가 줄어든다
2. 기능의 책임이 명확하다
수평 구조에서는 service 폴더가 점점 잡탕이 되기 쉽다.
Vertical Slice는 기능 단위 경계를 강하게 만들기 때문에 “이건 어디에 속하는가”가 명확해진다.
3. AI-assisted coding에 유리하다
이건 내가 특히 중요하게 보는 부분이다.
AI는 코드를 빨리 만들 수 있지만, 구조적 감각은 사람보다 쉽게 흐트러진다.
Vertical Slice는 AI에게도 좋은 제약을 준다.
- 이 기능은 이 폴더 안에서 다룬다
- 관련 로직은 여기 있다
- 새 코드를 넣을 위치가 예측 가능하다
즉 AI가 여기저기 흩뿌리는 코드를 덜 만들게 된다.
Layered Architecture를 완전히 버리라는 뜻은 아니다
오해하면 안 되는 점이 있다.
Vertical Slice는 레이어 개념을 없애는 것이 아니다. 기능 안에서 레이어를 로컬하게 유지하는 것이다.
예를 들면 한 슬라이스 안에 이런 식으로 있을 수 있다.
- api.py
- service.py
- schema.py
- models.py
- tests/
중요한 건 레이어를 전역으로 펼치지 않는 것이다.
언제 특히 강한가
내가 보기엔 다음 같은 프로젝트에서 매우 강하다.
- 개인 제품
- 작은 팀 제품
- 빠른 반복 개발이 필요한 서비스
- 도메인 로직이 기능별로 명확한 시스템
- AI-assisted coding을 적극 활용하는 프로젝트
반대로 아주 강한 플랫폼 공통 계층이 먼저 필요한 조직에서는 전역 레이어 구조가 더 자연스러운 경우도 있다. 하지만 대부분의 초기 제품은 거기까지 가지 않는다.
DAEMON에서의 의미
내가 DAEMON 계열 구조에서 Vertical Slice를 중요하게 보는 이유는, 속도와 유지보수성을 같이 가져가고 싶기 때문이다.
빠르게 만들수록 구조가 더 중요하다.
느리게 만들면 망가질 기회가 적지만, 빠르게 만들면 구조가 없을 때 바로 무너진다. 그래서 빠른 개발일수록 오히려 슬라이스 단위의 응집이 더 필요하다.
마무리
Vertical Slice는 예쁜 구조가 아니다. 변경 비용을 줄이고, 기능 응집도를 지키고, AI 시대에도 사람이 통제권을 유지하기 위한 실용 구조다.
내가 이 구조를 고집하는 이유는 단순하다. 실제로 덜 망가지기 때문이다.