WeeklyPaper 주제: Spring Framework가 탄생하게 된 배경과 이를 통해 해결하고자 했던 문제점에 대해 설명하세요.
배경
전에는 EJB(Enterprise JavaBeans)를 사용했지만, EJB 기반의 Java 개발은 너무 복잡하고 무거워서 생산성이 낮았다.
크게 고르자면 이와 같은 문제점들이 있었다:
- 너무 복잡하고 과도함 - XML을 사용했고 단순한 로직에도 여러 파일을 만들어야 했다 (실수와 유지보수 비용이 높았음).
- 기술 종속성 - 예전 EJB 기반 시스템은 WebLogic, WebSphere 같은 특정 애플리케이션 서버에 종속되었기 때문에 이식성과 유지보수성이 크게 떨어졌다.
- 느린 베포 - 코드 변경이 연쇄적으로 발생해, 한 부분을 수정하면 다른 부분도 같이 수정해야 하는 경우가 대다수였다.
- 테스트의 어려움 - EJB는 특정 컨테이너 환경에서만 실행되며, 단위 테스트를 위해 EJB 클래스를 직접 다뤄야 했기 때문에 테스트 작성이 거의 불가능에 가까웠다.
- OOP 원칙 훼손 (강한 결합도) - 대표적인 예시는 의존 객체를 내부에서 직접 생성해서 결합도가 올라간다는 점이였다.
예시:
public class CustomerBean {
private CustomerRepository repo = new CustomerRepository(); // 결합도 ↑
}
- 이렇게 EJB 내부에서 직접 객체 생성을 함으로서 테스트나 재사용에 제약이 많았다.
- CustomerRepository의 생성자 시그니처가 변경되면, 이를 사용하는 모든 클래스에서 일일이 수정을 해야 함
- CustomerRepository를 Mock이나 다른 구현체로 대체할 수 없어, 단위 테스트 작성이 힘듦.
Spring의 등장
2002년, Rod Johnson은 『Expert One-on-One J2EE Design and Development』라는 책에서 EJB에 대한 비판과 함께, 경량 대안 프레임워크로서 Spring의 초기 아이디어를 제시했다.
Rod Johnson은 “필요한 건 기능이 아니라 자유로운 설계와 유연한 아키텍처”라고 강조했다.
- 너무 복잡하고 과도함 - XML 또는 어노테이션 기반 설정으로 간소화하고, 단순한 POJO 기반 개발을 가능하게 했다.
- 기술 종속성 - 의존성 주입 (Dependency Injection, DI)
- 테스트 어려움 - 객체를 쉽게 주입하여 단위 테스트를 쉽게할 수 있게 했다
- 설정의 번거로움 - XML 또는 어노테이션 기반 설정으로 간소화했다
- OOP 원칙 훼손 (강한 결합도) - DI(Dependency Injection)로 유연한 구조 설계가 가능하게 됐다
위의 예시를 변경하자면,
@Service
public class CustomerService {
private final CustomerRepository repo;
public CustomerService(CustomerRepository repo) {
this.repo = repo; // 외부에서 주입받음 → 테스트 용이
}
}
이런식으로 DI를 사용해서 외부에서 repo를 주입하게 만들고 결합도를 낮추었다.
이 예시에서 볼 수 있듯이, 의존성 주입(DI)은 객체가 필요한 의존 객체를 내부에서 직접 생성하지 않고, 외부에서 전달받도록 하는 설계 방식이다.
요약하자면,
Spring은 무겁고 비효율적인 EJB의 대안으로 등장해, 개발의 복잡성을 줄이고 유연하고 테스트 가능한 애플리케이션 개발을 가능하게 하기 위해 만들어졌다.
'Spring' 카테고리의 다른 글
| [SpringBoot] @Controller와 @RestController의 차이점과 요청 처리 흐름 (0) | 2025.07.03 |
|---|---|
| [Spring] Spring AOP 개념과 실제 활용 사례 (0) | 2025.07.01 |
| [SpringBoot] 웹 서버와 WAS의 차이, 그리고 스프링 부트 내장 톰캣 (1) | 2025.06.24 |
| [SpringBoot] Spring Boot의 다양한 Bean 등록 방법 (0) | 2025.06.23 |
| [Spring] 프레임워크 vs 라이브러리: 제어 흐름과 사용 방식 비교 (Spring 예시 포함) (1) | 2025.06.16 |