WAS를 구현하며 표준화된 플로우를 따라 개발 하도록 만들고 싶었다. 일관성과 확장 가능성을 확보하고, 흐름을 제어하기 위해 아래와 같은 제약을 두었다.
Filter, Dispatcher, Handler 인터페이스/추상클래스로 정해진 실행 순서와 시그니처를 강제.HandlerAdapter, Facade 로 일관된 호출 방식을 보장.DIContainer, @Singleton 등으로 객체 생명주기 관리와 주입 방식을 통제.HttpRequest, HttpResponse DTO를 사용해 소켓/저수준 IO 직접 접근 차단.initialize, doFilter 등 정해진 타이밍에서만 로직 실행Spring이 강한 제약을 두는 가장 큰 이유는 "일관성과 안정성" 을 확보하기 위함이다.
이 철학은 흔히 "Convention over Configuration (CoC)"으로 설명된다. 즉, 개발자가 모든 설정을 일일이 정의하지 않아도 표준화된 관습을 따르면 예측 가능한 동작을 얻을 수 있게 만드는 것이다.
Baeldung의 Why Choose Spring as Your Java Framework?에서는 Spring이 관습 기반 설계로 팀 단위 협업에서 코드 스타일과 동작의 일관성을 보장하며, DI 컨테이너와 계층화 구조로 혼선을 줄인다고 설명한다
Medium의 Why Spring is so cool에서는 Spring의 강한 제약이 안정성을 우선시하기 때문이라고 강조한다.
DI, AOP, 트랜잭션 관리 등 핵심 기능을 프레임워크 공급 방식으로 제한함으로써 런타임 오류 가능성을 줄인다.
Spring의 POJO 기반 설계와 IoC는 OCP와 같은 객체지향 원칙을 자연스럽게 따르게 만든다.
위 Medium 글에서도 “Spring이 강제하는 좋은 습관”이라고 표현하며 유지보수성과 확장성 향상을 이러한 제약 덕분이라고 설명한다.
Understanding Spring Boot: The Benefits of Opinionated Convention over Configuration에서는
자동 생성과 스타터 사용으로 생산성이 크게 향상되고 설정 실수를 줄이며 Mocking/단위 테스트도 쉬워진다고 말한다
Spring의 제약은 단순히 자유도를 제한하려는 것이 아니다. 표준화된 관습을 통한 협업 효율, 안정성과 유지보수성 확보, 객체지향 원칙 준수 유도가 목적이다.
자유도가 높은 프레임워크는 단기적으로 유연해 보이지만, Spring은 “강한 제약 = 장기적 안정성”을 선택했다.