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

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

728x90

아직 1편을 안보셨다면 1편을 보고와주세요!

 

1편에서 다룬 얘기를 요약하면 다음과 같습니다

  • 태초에 Web이 있었다 이 때는 HTTP(Hyper-Text Transfer Protocol) 전송규약에 따른 정적인 데이터(HTML,XML,이미지 등)만 전달할 수 있었다.
  • 하지만 웹이 발달하면서 사용자가 입력하는 걸 처리해서 다시 화면에 보여주는 동적인 페이지가 필요하게 되었다. 이때 등장한것이 CGI(Common Gateway Interface) 다.
  • 당연하게도 CGI에는 장단점이 있었고, CGI에서 단점을 보완하고 자바(Java)로 웹을 구동할 수 있는 서블릿(Servlet)이 등장했다.

아직 멀었지만 그래도 점점 스프링(Spring)과 가까워져가는 것을 느끼시나요?

 

그럼 서블릿과 항상 함께 등장하는 JSP(Java Server Page)를 이어서 알아보겠습니다!


JSP(Java Server Page)

JSP는 서블릿(Servlet)의 단점을 보완한 결과물이지만 결과적으로 하는일은 동일합니다. 왜냐하면 JSP로 작성된 프로그램은 서버로 요청시 서블릿 파일로 변환되어 결국 서블릿이 하는 일을 똑같이 하기 때문이죠.

 

그럼 굳이 왜 JSP라는 것을 만들었느냐?

바로 개발자(사람)가 코딩을 하기 더 쉽도록 하기 위해서입니다.

 

1편에서 설명했던 서블릿(Servlet)은 자바코드 안에 HTML 코드가 들어가있습니다. 자바코드 안에 HTML 코드 넣어보셨나요? ㅂㄷㅂㄷ 아마 개발 경력이 오래되셨거나, 레거시 코드를 접하신 분들은 해보셨을 것 같습니다. 아래는 Servlet 의 예시입니다.

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        // HTML 코드 작성
        String htmlRespone = "<html>";
        htmlRespone += "<h2>Your username is: " + username + "<br/>";      
        htmlRespone += "Your password is: " + password + "</h2>";    
        htmlRespone += "</html>";
         
        // return response
        writer.println(htmlRespone);
    }
}

HTML 코드 작성을 저렇게 String 을 더해가면서 해야한다니... 보통 HTML이 한두줄도 아닌데.. css 도 있고.. javascript도 들어가고.. 전부다 저렇게 작성하려니 막막하지 않나요.

 

그래서 자바코드 안에 HTML을 넣는게 힘들면, HTML 코드 안에 자바코드를 넣자!! 해서 등장한 것이 바로 JSP 입니다.

 

따라서 JSP의 정의는 HTML 소스코드 속에 자바 소스코드가 들어가는 구조를 갖는 웹어플리케이션 프로그래밍 기술입니다. HTML속에서 자바코드는 <% 자바코드 %> 또는 <%= 자바코드 =%>형태로 들어갑니다. 자바 소스코드로 작성된 이 부분은 html 처럼 바로 웹 브라우저로 보내는 것이아니라 웹 서버에서 실행이 됩니다.

 

서블릿의 동작과정을 알고있다면 JSP의 동작 방식을 이해하는 것은 쉽습니다.

  1. JSP가 실행이 되면 자바 서블릿 파일(.java)로 변환됩니다.
  2. java 파일은 자바 컴파일러에 의해 컴파일이 되고 1편에서 설명한 Servlet과 동일한 방식으로 실행됩니다.

따라서 JSP는 Servlet 기술의 확장형이라고 볼 수 있고 모든 Servlet의 기능 + 추가적인 기능을 가집니다.


JSP 와 J2EE 그 사이 이야기

서블릿, JSP 에 대한 악평

그런데 말입니다. 다 좋은데 초창기에 자바 진영의 서블릿, JSP는 성능이 구렸습니다. 속도가 PHP >= ASP >>>>> JSP 이랬습니다. 이렇게 된 원인 중 하나는 여러가지가 있습니다

  1. 당시 자바는 데이터베이스 연결 기술이 별로였습니다. 초창기 자바의 데이터베이스 연결에 대한 기반 기술인 JDBC의 성능은 아주 악명이 높았습니다.
  2. 당시 JVM의 성능이 너무 안좋았습니다. HTML을 생성하는 자바 프로그램이 JVM이라는 녀석 위에서 돌아야 하는데, 이놈의 성능이 당시에는 그닥 이었습니다. 버전이 올라가면서 조금씩 나아지긴 했지만 그래도 나머지 두 기술(PHP, ASP)에 비하면 별로 였습니다. 그 둘은 이미 오랫동안 꾸준히 웹 관련 성능을 개선해왔지만, 자바는 아직 초창기였으니까요. JDBC 2.0에 이르러서야 비로소 경쟁이 가능한 정도로 따라잡을 수 있었습니다. 그것이 2000년대 초반의 일입니다.

JSP의 역전 기회

그런데 역설적으로 이 구리디 구린 DB접속 성능 때문에 자바는 새로운 기회를 잡게 됩니다. 그냥 PHP나ASP가 하는 방식으로는 그들을 이길 수 없었던 자바 진영의 사용자들은 Connection Pool 이란 개념을 도입하기에 이릅니다. 

 

사실 DB연결은 상당히 비싼(High Cost) 작업입니다. 기존 프로그램에서는 필요할 때 연결하고 필요 없으면 끊고.. 하는 식으로 사용했습니다. 웹 시대 이전의 client-server 구조에서 쓰던 방식이었습니다. 그런데 이 짓을 하기에는 너무도 성능이 구렸던(ㅠㅡㅠ) 자바는 일정한 숫자의 DB연결을 미리 해놓고 사용하면서 그 연결들을 다시 돌려쓰는 방식을 웹 프로그램의 기본 아키텍쳐로 도입합니다. 일정 숫자의 연결은 해제하지 않고 계속 돌려 쓰는 거죠. 이 방식은 웹 프로그램의 성능을 드라마틱하게 향상시킵니다. PHP = JSP > ASP 이렇게 만들어 놨으니까요. 심지어 어떤 때는 구린 PHP 보다 성능이 좋았습니다. 웹 프로그래밍 시장에서 자바는 새로운 기회를 잡게 된 겁니다!!

 

이 시기를 기점으로 자바 진영은 프레임워크의 시초격인 J2EE 스펙을 발표합니다


J2EE(Java 2 Enterprise Edition) & Java EE

J2EE는 자바로 기업 환경의 어플리케이션을 만드는데 필요한 스펙들을 모아둔 스펙 집합입니다. [Java] 자바(Java)의 역사에서 등장했던 썬 마이크로시스템즈(Sun Microsystems)사 에서 만들었고 스펙을 시범적으로 구현했습니다. 하지만 IBM, BEA, Oracle, HP, Iona등 여러 벤더들도 그 스펙을 구현할 수 있어서 사실상 SUN의 독점적인 기술이라기 보다는 Java 진영으로 불리는 여러 개발자들이 같이 만들어가고 공유하는 기술이라고 볼 수 있습니다

 

이 J2EE의 출시로 인해서 자바가 엔터프라이즈급, 즉 전사 레벨의 시스템을 구축할 수 있는 프로그래밍 언어가 되고자 하는 야욕을 드러냈다고 할 수 있습니다. 전사 레벨의 시스템을 구축할 수 있는 프로그래밍 언어란, 그냥 언어가 아니라 아주 다양하고 복잡한 요구사항을 소화할 수 있는 기술 스펙이라 할 수 있습니다.

 

더 중요한건 드디어 본론으로 돌아오게 되었는데, 스프링(Spring) 프레임워크도 J2EE 애플리케이션 (ㄴㅇ.ㅇㄱ) 입니다.

 

J2EE 구성 요소

검증됐다면 누구나 기여하고 만들어갈 수 있는 특성때문에 J2EE는 매우 방대한 범위를 다루는 스펙 집합입니다. 대표적인 구성은 다음과 같습니다.

  • Servlet : 클라이언트가 보내는 HTTP 요청을 처리하는 서버측 자바 프로그램이며, Servlet 엔진이 있어야 합니다.
  • JSP: HTML이나 Java 코드를 써서 사용자에게 정보를 보여 줍니다. JSP가 처음 실행될 때 Servlet 엔진이 이것을 Servlet으로 컴파일시켜서 내부적으로는 Servlet으로 동작합니다.
  • EJB(Enterprise Java Beans): Java에서 제공하는 분산 컴포넌트 기술로 비즈니스 로직이나 데이터, 메시지를 처리할 수 있습니다.
  • RMI(Remote Method Invocation): 프록시를 써서 원격에 있는 Java 객체의 메소드를 실행시키기 위한기술입니다.
  • JNDI(Java Naming DirectoryInterface): 자바 기술로 만들어진 객체에 이름을 붙여 찾을 수 있도록 단일한인터페이스를 제공합니다.
  • JDBC(Java Database Connector): 여러 종류의 데이터베이스 시스템에 접근하는 단일한 인터페이스를 제공합니다. 각각의 데이터베이스에 맞는 JDBC 드라이버가 있어야 합니다.
  • JCA(Java Connector Architecture): 이기종 플랫폼을 통합할 수 있도록 플랫폼 독립적인 인터페이스를 제공합니다.
  • JMS(Java Message Service): 여러 가지 메시징 시스템에 대한 플랫폼 독립적인 인터페이스를 제공합니다.

많은 구성 요소중 EJB가 눈에 띄지 않나요? 바로 [Spring] POJO (Plain Old Java Object) 란? 편에서 등장했었습니다. POJO 자체가 아예 대놓고 EJB을 겨냥하고 만든 단어입니다. 왜 대놓고 EJB를 배제하려고 단어까지 만들었을까요? EJB의 등장으로 자바는 아주 추운 겨울을 보내게 되기 때문입니다.

 

** J2EE는 Java 5 (JDK 1.5) 부터 Java EE 라는 이름으로 개칭됩니다


이제 드디어 Spring과 아주 가까워지고 있습니다. EJB로 인해 시작된 자바의 추운 겨울이 지나가면 Spring(봄)이 다가오기 때문인데요!

 

분량이 너무 많아졌기 때문에 3편(마지막)에서 이어나가겠습니다~!

 

출처:
- [JSP] JSP (JavaServer Pages ) 란 무엇인가?
- EJB 를 아시나요? (1)
- J2EE란? 자바2 엔터프라이즈 에디션)
- 스프링의 역사 | 스프링은 왜 탄생했는가
728x90