[Spring] 스프링 프레임워크(Spring framework)의 탄생 배경 (feat. CGI, Servlet, JSP, J2EE, EJB) - 1편
Spring

[Spring] 스프링 프레임워크(Spring framework)의 탄생 배경 (feat. CGI, Servlet, JSP, J2EE, EJB) - 1편

728x90

[Java] 자바(Java)의 역사에서 자바의 탄생 배경을 알아보았었죠~! 정말 간단하게 요약하자면 하드웨어를 위한 언어로 시작해서 나중에는 웹 개발을 할 때 쓰이는 대표적인 언어로 자리잡았습니다.

 

지금이야 자바로 웹 개발을 할때 스프링(Spring), 스프링 부트(Spring Boot) 등의 자바 프레임워크를 사용하는 게 당연하지만, 처음부터 그랬을까요?

 

오늘은 이 스프링 프레임워크가 어떤 과정과 시행착오를 거쳐 만들어지게 됐는지 알아보겠습니다!


태초의 웹(Web)의 역할

처음 웹이 등장했을 때는 HTTP(Hyper-Text Transfer Protocol) 전송규약에 따른 정적인 데이터(HTML,XML,이미지 등)를 전달하는 것만으로도 충분했습니다. 물론 페이지는 보여줄 수 있지만 유저가 어떤 입력을 함에 따라 화면을 다르게 보여주는 것은 불가능했죠. 때문에 미리 저장된 정보만 불러와서 보여줄 수 있었습니다. 예를들어 사용자의 댓글을 입력받고 보여주는 기능같은건 불가능했습니다. 내가 입력하기 전까지는 어떤 글을 보여줄지 미리 알수가 없으니까요!

 

하지만 웹이 발달하면서 이제 사용자의 입력을 처리하고 그 결과를 다시 화면에 보여주는 동적인 페이지가 필요하게 되었습니다. 따라서 서버에서 다른 프로그램을 불러내고 그 프로그램의 처리결과를 클라이언트로 보내줄수 있는 인터페이스가 필요했고 이것이 바로 CGI(Common Gateway Interface) 입니다.


CGI(Common Gateway Interface)란?

서버(Server)와 애플리케이션(application) 간에 데이터를 주고 받는 방식 또는 컨벤션을 뜻합니다. Interface 라는 이름에서 알 수 있듯 이것은 인터페이스인데, "웹서버""요청을 받아 처리해줄 로직을 담고 있는 애플리케이션 프로그램" 사이의 인터페이스입니다. 웹서버가 특정 언어로 쓰인 구체적인 프로그램이 아니라 이 인터페이스에 의존하고 있기 때문에 어떤 언어든 이 인터페이스를 구현하기만 한다면(CGI 스펙을 따른다면) 웹서버와 소통할 수 있습니다.

위 그림에서와 같이 CGI기능을 사용하려면 사용자의 입력을 받아들이는 html문서와 입력을 처리하기 위한 CGI프로그램이 필요합니다. CGI는 웹서버의 환경의 따라 다르게 구현되는데 주로 C, Perl, Visual Basic 등이 사용되고 있습니다.

 

특히 요새는 PHP,  ASP가 발전함에 따라 혼동이 생기기도 합니다. CGI가 우리가 보통 생각하는 무료 계정에 포함된 Perl로 구현된 것으로 오해하고 있는데요. PHP / ASP 는 CGI를 만들기 위한 한가지 도구이며 한가지 스크립팅 언어일 뿐입니다. 예를 들어 PHP와 PERL은 둘다 언어이기 때문에 수평관계 이지만, PHP와 CGI는 상하관계입니다. PHP는 언어지만 CGI는 규약, 동작 원리이기 때문입니다.

 

CGI 장점

  • 언어, 플랫폼 독립적이다(스펙만 준수하면 된다).
  • CGI 코드를 수행하는데 특정 라이브러리가 필요하지 않기 때문에 매우 가볍다.  

CGI 단점

  • 느리다(요청이 올 때마다 DB connection을 새로 열어야 한다).
  • HTTP 요청마다 새로운 프로세스를 만들기 때문에 서버 메모리를 많이 잡아먹는다. (이에 비해 servlet은 요청마다 스레드를 만든다.)
  • 페이지 로드 사이에 데이터가 메모리에 캐시될 수 없다.

이러한 CGI의 단점을 보완하고 같은 역할을 하는 기능이 자바로 만들어진게 바로 서블릿(Servlet)입니다.


서블릿(Servlet)이란?

서블릿은 웹프로그래밍에서 클라이언트의 요청을 받아서 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바(Java) 프로그래밍 기술입니다. 간단하게 말하면 자바를 이용해서 웹을 만들기 위해 필요한 기술이죠!

 

예를 들어 어떠한 사용자가 로그인을 하려면, 아이디와 비밀번호를 입력하고 로그인 버튼을 누릅니다. 그때 서버는 클라이언트의 아이디와 비밀번호를 확인하고 다음 페이지를 띄워주어야 하는데, 이러한 역할을 수행하는 것이 바로 서블릿(Servlet)입니다. 그래서 서블릿(Servlet)은 자바로 구현 된 CGI 라고 흔히 말합니다.

 

서블릿 특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
  • HTML을 사용하여 요청에 응답한다.
  • Java Thread를 이용하여 동작한다.
  • MVC 패턴에서 Controller로 이용된다.
  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다. UDP보다 속도가 느리다.
  • HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.

서블릿 동작 순서

서블릿(Servlet) 동작 순서

  1. Client가 요청을 하면 HTTP Request가 서블릿 컨테이너(Servlet Container)로 전송됩니다.
  2. 서블릿 컨테이너는 HTTP Request를 받으면 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
    • 서블릿 컨테이너를 공장에 비유하면, 공장에 어떤 물건이 들어오면 공장에서만 돌아다닐 수 있는 비어있는 박스 2개가 생성이 되고, HttpServletRequest 박스에는 HTTP Request가 담겨져서 움직인다고 생각하면 됩니다.
  3. 요청을 분석해서 web.xml을 보고 어느 서블릿(Servlet)에 대한 요청인지 찾습니다.
    • HttpServletRequest 박스에 새겨진 라벨을 보고 공장에 여러 작업공간 중 어디로 보내서 작업해야하는지 찾습니다
  4. 해당하는 서블릿(Servlet)에 요청을 전달합니다.
    • 찾은 작업공간으로 박스를 보냅니다.
  5. 서블릿(Servlet)에서 service() 메소드를 호출합니다.
    • 작업공간에서 작업을 진행할 작업자를 부릅니다.
  6. 클리아언트의 POST, GET 요청 여부에 따라 doGet() 또는 doPost()를 호출합니다.
    • 작업자가 할 수 있는 작업 리스트 중 실제로 수행할 작업을 선택합니다.
  7. doGet(), doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체로 응답을 보낸다.
    • 박스에서 물건을 꺼내서 작업을 수행하고 완료된 결과를 HttpServletResponse 박스에 담습니다.
  8. Client에 HTTP Reponse로 응답을 보내고 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
    • HttpServletResponse 박스에서 HTTP Resonse를 꺼내서 목적지로 보내고, 박스는 폐기합니다.

서블릿 생명주기

// 서블릿이 처음 적재될 때 호출되는 초기화 함수, 서버가 켜질때 한번만 실행된다.
public void init() {...}

// 클라이언트의 요청이 들어올 때마다 호출(doGet(), doPost())한다.
public void service() {...}

// 서블릿이 메모리에서 해제될 때 호출되는 종료 함수, 서버가 꺼질때 한번만 실행된다.
public void destroy() {...}

Spring 의 탄생배경을 소개한다고 해놓고 너무 앞에 설명이 기네요 ㅠ 그래도 스프링이 탄생되기 전에 어떤 과정들이 있었는지 순차적으로 보면 왜 Spring의 특성들이 생겼는지 이해하기 쉬울거같아요.

 

2편에서 계속하겠습니다

 

 

출처:
- CGI와 서블릿 그리고 톰캣
- EJB 를 아시나요? (1)

- [JSP/Servlet] CGI 그리고 Servlet과 JSP와의 관계
- Common Gateway Interface(CGI)란 무엇인가)
- Servlet(서블릿)
728x90