라이브러리&프레임워크/Spring

Spring Framework가 탄생하게 된 배경/ 웹 변천사 및 동작 원리

youngble 2025. 10. 30. 23:05

스프링 탄생에 앞서 웹 역사..

웹 초기 정적페이지 기반 사이트

초기 인터넷 보급이 크지않았고 발달할 당시에는 간단한 HTML 방식의 정적페이지에서 이미 만들어져있는 css, image 등을 통해 정보를 제공하였다.

동적 페이지 기반 사이트

그런데 인터넷과 Web이라는 시장이 커지면서 2000년 초 HTML을 통해 정적인 파일들을 화면에 표시하는 정적 페이지 떠나 사용자의 반응에 동작(인터렉션)하는 동적 페이지가 필요했다.

CGI


이러한 동적페이지를 만들기위해 CGI(Common Gateway Interface)이라는 개념이 등장했다. CGI는 외부 프로그램과 연결해주는 인터페이스(API) 표준 방법 개념이고 이걸 바탕으로 만든 프로그램을 CGI 프로그램 이라한다. 사용자 요청에 웹서버가 파라미터를 통해 CGI로된 프로그램 애플리케이션(c,Perl, pyhton 등)에 요청을 보내고, 요청한 정보 바탕으로 동적인 컨텐츠를 완성된 정적페이지(HTML)생성후에 webserver에 전달하여 정보를 제공하였다.

Servlet

하지만 CGI의 경우 매 요청마다 CGI프로그램(프로세스)를 새롭게 생성하기때문에 다수의 요청이 발생하면 서버 과부하가 생기는 단점이 있었다. 이러한 한계를 해결하기 위해, 외부프로그램 실행 방식이 아닌 Java언어 기반으로 JVM내부에서 쓰레드를 재사용으로 동작하는 Servlet이라는 표준기술이 등장하였다. 이 Servlet 기술을 기반으로 WAS가 발전했으며, 이를 통해 동적페이지 생성뿐 아니라 비즈니스로직 처리, 데이터베이스 연동, 트랜잭션 관리 등의 기능을 수행할 수 있게 되었다. 이렇게 웹시장과 기술/사용자 요구사항이 거대해지고 복잡해지면서 높은 이해도와 작성이 필요했다.

EJB(Enterprise Java Bean) 등장

Servlet 시절 예시 코드

// 트랜잭션 직접 처리
Connection conn = dataSource.getConnection();
conn.setAutoCommit(false);
try {
    orderDao.save(order);
    paymentDao.process(order);
    conn.commit();
} catch (Exception e) {
    conn.rollback();
}

이러한 상황에서 기업 규모의 프로젝트를 만들고 유지한다는것은 Servlet/JSP만으론 트랜잭션, 보안, 동시성, 세션 관리 코드를 직접 구현하고 관리하기엔 너무 복잡하고 거대하여 유지보수가 쉽지않았다.

그래서 생상선과 유지보수를 높이기 위해, 개발자가 저수준(low-level) 코드(DB연결, 트랙잰션, 스레드 관리 등)를 직접 구현하지않고 고수준(high-level) 추상화 API만 사용하도록 등장한 것이 EJB(Enterprise JavaBeans)이다.

EJB 이후 코드

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class OrderService {
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void processOrder(Order order) {
        orderDao.save(order);
        paymentDao.process(order);
    }
}

내부구조 및 흐름

EJB는 Micro System 사에서 개발한 엔터프라이즈용 서버 컴포넌트 모델이다.
비즈니스 로직을 객체(Bean)단위로 분리하고, 트랜잭션, 보안, 분산등은 컨테이너가 대신 처리하도록하는 구조.

<enterprise-beans>
  <session>
    <ejb-name>OrderServiceBean</ejb-name>
    <home>com.example.OrderServiceHome</home>
    <remote>com.example.OrderService</remote>
    <ejb-class>com.example.OrderServiceBean</ejb-class>
  </session>
</enterprise-beans>

EJB를 사용하면 단지 작은 규모의 역할/기능을 초기 세팅이 방대(XML)하고 보일러플레이트가 매우 번거롭고 컸다. 이렇기 때문에 매우 무겁다라고 말이 많았다.

또한 Java 그자체로 작성한다기보단 EJB라는 기술에 의존성이 강하여 응집도는 낮고 결합도는 커지게되었다.

상속강제(POJO 아님)

public class OrderServiceBean implements SessionBean {
    public void ejbCreate() { ... } // 컨테이너가 호출
    public void ejbRemove() { ... }
    public void ejbActivate() { ... }
    public void ejbPassivate() { ... }
}

객체지향이라는 패러다임을 실제로 반영할수없는 구조가 되어버리다보니 유연하지 못하고 유지보수가 매우 번거러워지게됨. 또한 EJB 자체 규모가 크다보니 테스트나 배포를 위한 소요시간도 매우 길었다.

스프링

이러한 복잡함에 한계를 느낀 로드존슨 EJB 없이도 충분히 객체지향을 만들 수있다는 철학을 바탕으로 POJO(Plain Old Java Object)기반 확장가능하도록 설계한것이 경량 프레임워크를 제안하게되었다. 2002년 Expert-One-on-One J2EE Design and Development라는 책을 출간하면서 EJB문제점과 대안을 제시하였다. 이를 공감한 '유겐 휠러', '얀 카로프'가 오픈소스 프로젝트를 제안하고 발전시키며 이제는 겨울(EJB)이지나 봄이 왔다라고 해서 Spring이라고 이름을 만들었다.

J2EE : Java 2 Enterprise Editio으로 기업용 자바 어플리케이션 개발을 위한 표준 플랫폼/표준 기술 집합을 말한다.

...

스프링은 EJB를 그대로 사용하는 대신, EJB에서 사용된 핵심 개념(Bean 컨테이너, DI, AOP, 트랜잭션 관리 등)은 계승하고, 복잡한 설정과 무거운 런타임 의존성을 제거하여 POJO 기반으로 단순화한 경량 프레임워크이다.

dispatcherServlet : 스프링 진입점, 스프링 컨텍스트 로딩, 요청 URL에 맞는 컨트롤러 찾아서 호출,서블릿 컨테이너에 등록되어 관리 실행