"왜 Spring을 사용해야 할까?"
Java로 웹 애플리케이션을 개발할 때, Spring Framework는 거의 표준처럼 사용된다. 하지만 이 강력한 도구가 처음부터 당연하게 존재했던 것은 아니다. Spring이 등장하기 이전의 엔터프라이즈 개발 환경은 지금과 매우 달랐으며, 심각한 문제들을 안고 있었다.
Spring의 탄생 배경과 이로 인해 정립된 '프레임워크'와 '라이브러리'의 근본적인 차이점을 이해하는 것은 Java 개발자에게 필수적인 기초 역량이다.
Spring의 등장은 EJB(Enterprise JavaBeans)라는 기술이 주도하던 2000년대 초반의 Java 엔터프라이즈 환경에 대한 반작용에서 시작되었다. 당시 EJB는 트랜잭션, 보안, 분산 처리 등 기업용 애플리케이션에 필요한 복잡한 기능들을 제공했지만, 개발자들에게 감당하기 힘든 문제점들을 안겨주었다.
2002년, 로드 존슨(Rod Johnson)은 이러한 EJB의 문제점들을 비판하며 더 나은 대안을 제시했다. 이것이 Spring Framework의 시작이었다.
Spring이 해결하고자 한 핵심 문제는 "개발자가 비즈니스 로직이라는 본질에만 집중할 수 있게 하자"는 것이었다.
결국 Spring은 EJB의 복잡성을 걷어내고, 낮은 결합도(Decoupling)와 높은 테스트 용이성(Testability)을 가진 유연한 애플리케이션을 만들 수 있는 환경을 제공했다.
Spring을 '프레임워크'라고 부르는 이유는 '라이브러리'와 근본적인 차이점이 있기 때문이다. 이 차이를 구분하는 핵심 기준은 "제어 흐름의 주체가 누구인가?"이다.
라이브러리는 개발자가 제어 흐름의 주체가 된다.
마치 '도구 상자'와 같다. 개발자는 필요할 때마다 도구(라이브러리)를 가져와서 사용하고, 언제 사용할지, 어떻게 사용할지를 직접 결정한다.
ArrayList):// 개발자가 직접 'ArrayList' 라이브러리를 생성하고 호출한다.
// 제어의 흐름은 개발자의 코드에 있다.
List<String> myList = new ArrayList<>();
myList.add("Data1"); // 필요할 때 호출
myList.add("Data2"); // 필요할 때 호출
// 라이브러리는 호출되었을 때만 동작한다.
System.out.println(myList.get(0));
프레임워크는 프레임워크가 제어 흐름의 주체가 된다. '잘 지어진 뼈대'나 '설계도'와 같다. 프레임워크는 전체적인 구조와 동작 흐름을 이미 가지고 있으며, 개발자는 그 뼈대 속의 비어 있는 공간에 자신의 코드를 작성해 끼워 넣는다.
사용 방식: 프레임워크의 코드가 내 코드(개발자가 작성한 코드)를 호출(Call)한다.
이를 제어의 역전 (IoC, Inversion of Control)이라고 부른다. "Don't call us, we'll call you." (우리를 부르지 마세요, 우리가 당신을 부를 겁니다.)라는 할리우드 원칙으로도 유명하다.
예시 (Spring Framework의 @RestController):
// 개발자는 'MyController' 클래스와 'hello()' 메서드를 정의할 뿐,
// 이 코드를 언제, 어떻게 실행할지 결정하지 않는다.
@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
// 이 메서드는 개발자가 직접 호출하지 않는다.
return "Hello, Spring!";
}
}
// 웹 브라우저에서 "/hello" 요청이 들어오면,
// Spring Framework(의 DispatcherServlet)가 이 'hello()' 메서드를
// 대신 찾아서 실행(호출)하고 응답을 처리한다.
Spring Framework는 EJB의 복잡성을 해결하기 위해 '제어의 역전(IoC)'이라는 개념을 도입하여 개발자가 비즈니스 로직에만 집중할 수 있도록 만들었다. 라이브러리가 개발자의 코드에 의해 호출되는 수동적인 '도구'라면, 프레임워크는 개발자의 코드를 호출하는 능동적인 '뼈대'다.
이러한 도구들의 철학적 차이를 이해하는 것은, 우리가 특정 기술을 '왜' 그리고 '어떻게' 사용해야 하는지에 대한 명확한 기준을 제시해 준다.