Spring Framework가 탄생하기 전, 개발자들은 EJB(Enterprise Java Bean)를 사용하였지만 이를 이용한 개발을 어려워 하였다. EJB는 분산 객체를 대규모로 처리하기 위한 기술로 잘 만들어졌지만 특정 기술에 의존적이고 사용하기 어려웠기 때문이다. 복잡성과 어려움 속에서, 기존의 단순한 자바 객체(POJO, Plain Old Java Object)를 활용하자는 움직임이 생겨났다.
이러한 상황에서 로드 존슨은 약 30,000줄에 달하는 코드인 Spring을 개발하였다. 2002년 로드 존슨은 EJB의 근본적인 문제점을 지적하며, EJB 없이도 충분히 확장 가능하고 고품질의 애플리케이션을 개발할 수 있음을 보여주는 책을 출간하였다.

Spring은 EJB의 문제를 해결하고자 경량화된 솔루션을 제공하였으며, 또한 의존성 주입(DI)과 제어의 역전(IoC) 개념을 도입하였다. 이러한 기능을 통해 개발자는 유연한 코드 작성과 재사용이 용이해졌으며, 프레임워크나 라이브러리에 종속되지 않고 순수 자바 객체 기반의 프로그래밍 모델로 애플리케이션 개발이 가능해졌다.
프레임워크는 소프트웨어 개발의 기본 구조와 흐름을 제공하는 틀(Framework)이다. 개발자는 이 틀 안에서 필요한 코드를 작성하여 프로그램을 완성한다. Spring Framework와 Django, React.js가 이에 해당한다.
라이브러리는 특정 기능을 수행하는 코드의 모음으로, 개발자가 필요할 때 직접 호출하여 사용한다. 예시로 Apache Commons, Numpy가 있다.
프레임워크와 라이브러리 모두 개발을 도와주는 코드의 집합이지만, 주요한 차이점이 있다.
Spring Framework같은 경우 IoC 컨테이너를 기반으로 동작하여 개발자가 직접 객체를 생성하고 관리하는 것이 아니라, Spring이 객체의 생성과 초기화, 소멸, 의존성 주입을 관리한다. 예를 들어, @Component나 @Service와 같은 어노테이션을 사용하면, Spring이 해당 클래스를 자동으로 관리하고 필요한 곳에 주입을 해준다.
@Repository
public class JCFUserRepository{
... // Spring이 실행되면 Repository를 자동으로 초기화하고 필요한 곳에서 사용할 수 있도록 해줌.
}
Java Library같은 경우 개발자가 필요할 때 직접 호출하여 사용하는데, 예를 들어서 JSON을 다루기 위해 Jackson 라이브러리를 사용할 경우, ObjectMapper객체를 직접 생성하고 writeValueAsString()를 호출하여 JSON을 파싱한다.
import com.fasterxml.jackson.databind.ObjectMapper; // 라이브러리 호출
public class JSONEx{
...
ObjectMapper om = new ObjectMapper();
User user = new User("kim", 20);
String objectToJson = mapper.writeValueAsString(user);
}
<출처>
https://spring.io/blog/2006/11/09/spring-framework-the-origins-of-a-project-and-a-name
https://www.sencha.com/blog/difference-between-framework-vs-library-snc/