본문 바로가기
Spring Framework/Spring

Spring 등장 배경

by 도쿠니 2022. 6. 2.

Hello Spring!

Spring 등장 배경

1. CGI 의 등장

 현재 대부분의 웹페이지들이 동적 웹페이지일 정도로 동적으로 무언가를 보여준다는게 흔하디 흔한 기술이 되었지만, 과거 웹이 처음 등장했을 때는 HTML이나 이미지같은 정적인 데이터만을 처리해주는 웹서버 뿐이 없었기 때문에 HTTP 요청에 대해서 항상 동일한 정적인 페이지만을 보여줄 수 밖에 없었다. 

  • Apache HTTP Server가 이러한 정적 웹서버이다.

이러한 한계를 극복하고 사용자에 따라 혹은 상황에 따라 다르게 보여주기 위해 개발된 것이 CGI (Common Gateway Interface)이다. CGI는 아래와 같은 구조를 가지고 있다.

  1.  클라이언트가 웹서버로 요청
  2. 웹서버는 요청에 들어있는 주소가 CGI 프로그램에 대응하는지 확인
  3. 대응하는 프로그램이 있다면 그 프로그램에 요청을 환경 변수와 표준 입력의 형태로 전달
  4. 프로그램에서 처리된 결과물을 표준출력 그대로 클라이언트에게 응답

CGI 구조

즉, 간단하게 말해서 CGI는  동적으로 데이터를 처리하기 위해 서버와 외부 응용프로그램을 연결시켜주는 여러 언어로 구현 가능한 인터페이스라고 보면된다. 획기적이고 확장성이 좋은 기술이었지만 문제점이 존재했다.

  • 요청이 들어올 때 마다 CGI 프로그램이 웹서버 내에서 프로세스 단위로 실행이 되기 때문에 사용자가 증가함에 따라 서버에 과부하가 걸린다.

이러한 문제로 인해 현재에는 거의 사용되지 않고 있다.

 

2. Servlet 의 등장

프로세스 단위로 실행되는 CGI의 문제점을 해결하고자 스레드 단위로 실행되게끔 개발한 것이 바로 Java Servlet이다.

서블릿은 CGI처럼 프로세스를 생성해서 처리하는 것이 아닌, 1개의 프로세스 내부에 스레드 풀이라는 스레드들이 생성될 수 있는 공간을 만들어 멀티스레드로 처리한다. 서블릿은 CGI와 완전히 다른 개념이 아닌 CGI에 따라 데이터를 주고받지만 이를 서블릿 컨테이너에 위임한다.

  • 대표적인 서블릿 컨테이너로 Apache Tomcat이 있다.
    • 동적인 데이터 처리를 위해 자바 서블릿이 실행될 수 있는 웹 컨테이너 환경을 제공하는 WAS이다.
    • DB연결, 다른 응용프로그램과의 상호작용 등 동적인 기능을 처리해준다.
    • 하나의 톰캣은 하나의 JVM을 가지고 있다.
    • 톰캣은 Apache 웹서버 + Web container 형태로 정적,동적 데이터 모두 처리 가능하다.

WAS(톰캣) 구조

서블릿은 이러한 WAS 안에서 구동된다.

톰캣 및 서블릿에 관해 더 자세한 내용은 추후에 따라 게시글로 만들어 게시하도록 하겠다.

 

서블릿은 자바 코드 안에 HTML 코드를 넣어서 페이지를 출력하는 방식인데, HTML을 출력하기 힘들뿐만 아니라 자바코드와 HTML 코드가 막 섞여있다보니 가독성도 좋지않고 유지보수하기에도 불편했다.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class HelloWorld extends HttpServlet {
 
   private String message;

   public void init() throws ServletException {
      // Do required initialization
      message = "Hello World";
   }

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      // Actual logic goes here.
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
   }

   public void destroy() {
      // do nothing.
   }
}

위의 코드를 보면 <h1>이런식으로 들어가있는데 이런게 웹페이지를 만들다보면 수십 수백개가 들어간다. 

 

3. JSP 의 등장

서블릿 내부에서 HTML 출력을 작성하기가 너무 힘들었기에 차라리 HTML에 Java코드를 넣어서 쓰는 것이 어떻겠느냐 해서 나온 것이 JSP이다.

서블릿이 자바 코드 안에 HTML을 넣은 것이라면 그 반대로 HTML안에 자바를 넣은 것이 JSP인데, 둘이 반대라고 해서 서로 다른 것은 아니다. JSP는 Servlet으로 변환되어 실행되기 때문이다.

JSP가 실행되는 과정

  1.  클라이언트가 *.jsp라는 형태로 요청을 보낸다.
  2. 웹 서버는 *.jsp 형태로 온 요청에 대해 JSP 컨테이너가 처리하게끔 요청 정보를 넘긴다.
  3. 해당 JSP 파일이 처음 요청된 것이면 JSP 파일을 파싱한다.
    • 이전에 요청된 적이 있던 JSP라면 파싱 및 서블릿으로 변환 되지 않고 바로 .class 파일을 메모리에 적재 후 실행한다.
  4. JSP를 서블릿으로 변환한다.
  5. 서블릿은 실행 가능한 상태인 클래스 파일로 컴파일 된다.
  6. 클래스 파일이 메모리에 적재되어 실행된다.
  7. 실행된 결과를 클라이언트에게 HTML 형태로 응답한다.

 

4. EJB 의 등장

이러한 기술들이 나오다가 제대로 된 Enterprise 급으로 만들고자 나온 것이 EJB (Enterprise Java Beans)이다.

  • Java Bean이란 자바 객체를 재사용 가능하도록 컴포넌트화 시킬 수 있는 코딩 방침을 정의한 것을 의미한다.

EJB는 비즈니스 객체들을 관리하는 컨테이너를 만들어서, 필요할 때마다 컨테이너로부터 객체를 받는 식으로 관리하자는 생각에서 탄생한 엔터프라이즈급 어플리케이션 개발을 단순화하기 위해 발표한 스펙이다.

 

처음에는 각광받고 주류로 사용되었지만, 보안, 트랜잭션, 분산 컴퓨팅 등 컨테이너의 다양한 서비스를 제공 받기 위해서는 EJB 스펙을 지켜야 했으며, EJB 컨테이너가 없을 경우 WAS의 다양한 서비스를 사용할 수 없다는 단점이 있었다.

즉, 서비스가 구현해야하는 실제 비즈니스 로직보다 EJB 컨테이너를 사용하기 위한 상투적인 코드들이 더 많았다.

거기에다 벤더 사마다 EJB 컨테이너를 구현한 내용이 다르기 때문에 다른 벤더 사의 컨테이너로의 변경에 어려움도 많았고, 설정도 복잡했으며, 비용 문제도 만만치 않았다. 따라서 비즈니스로직이 특정 기술 등에 종속되는 기술 침투의 문제점이 있었다.

 

이러한 시기를 자바진영에서는 겨울이라고 불렀다.

 

5. Spring 의 등장

EJB는 컨테이너로부터 필요한 객체를 꺼내 사용하는 방식으로 객체들 간의 의존성을 해결하려 했지만 결국엔 비즈니스 로직에 특정 기술이 종속되는 가장 큰 문제점을 가지고 있었다.

이에 2002년에 로드 존슨이라는 개발자가 책을 한권 내는데 그 책에서 특정 클래스를 상속하거나 인터페이스를 구현하지 않는 평범한 자바 클래스 (POJO, Plain Old Java Object)를 이용하여 단순하지만 EJB에서 제공하는 고급 기술을 제공하는 Spring의 근간을 보여줬다. 책 출간 직후 유겐휠러, 얀 카로프가 로드 존슨에게 오픈소스 프로젝트를 제안했고 암울했던 EJB의 겨울이 지나 봄이 왔다는 것을 뜻하는 Spring으로 이름을 지은 오픈 소스 프레임워크를 선보였다.

 

스프링은 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크로 정의내릴 수 있다. 평범한 자바 클래스를 이용하여 EJB의 기능을 유지하면서 복잡성을 제거해 코드가 단순하며 가벼워졌다(경량화). 더불어 스프링은 여러 객체들의 의존성을 해결하고 프레임워크가 직접 객체들을 제어하면서 객체들의 라이프 사이클을 관리해 준다.

 

주요 특징은 아래와 같다. 아래의 특징들 말고도 많은 다양한 기능들을 제공한다.

  • DI 지원
  • AOP 지원
  • MVC 웹 프레임워크 지원
  • JDBC, JPA 연동, 선언적 트랜잭션 처리 등 DB 연동 지원

 

 

출처

'Spring Framework > Spring' 카테고리의 다른 글

Spring Validation  (0) 2022.06.07
Data Binding  (0) 2022.06.07
Spring AOP(관점 지향 프로그래밍)  (0) 2022.06.07
DI 정리  (0) 2022.06.06
Spring Framework 소개  (0) 2022.06.05

댓글