본문 바로가기

취업준비/우아한 테크 리뷰

우아한 테크 -Servlet & Spring 리뷰(1) - [ CGI와 Servlet에 대하여 ]

발표자

규동님과 타미님은 CGI부터 서블릿, DispatcherServlet까지 설명해준다.

코기님은 실제 요청 처리에 대해서 현대식으로 깔끔하게 설명해주었다. 


당시의 배경

버너스리 아저씨.

1989년 인터넷 시대의 획을 긋는 역사가 탄생한다.

 

팀 버너스라는 연구원은 그가 속한 연구실(스위스 제네바의 CERN 연구소)에서 컴퓨터간 데이터 교환 처리 방식의 비효율성을 개선하고자 인터넷 네트워크를 기반으로 한 월드와이드웹의 하이퍼텍스트(HyperText : Text의 힘을 뛰어넘는(하이퍼 링크)) 시스템을 고안한다.

 

해당 시스템 제안서에는 URL(유일 자원 식별자), HTTP(하이퍼 텍스트 전송 프로토콜), HTML(하이퍼 텍스트 마크업 언어)에 대한 최초 설계가 제안된다.

 

마크업 언어(HTML) - 텍스트에 포함된 지침 및 형식(tag) 코드 시스템

하이퍼 텍스트 - 텍스트의 문서, 이미지 및 다른 요소에 "링크"를 포함하는 수단. [ 텍스트 그 이상의 힘을 가졌다고 하여 hyper라는 말을 붙인다. ] 유일자원 지시자(URL) 또는 통합 자원 식별자(URI)의 개념을 활용한다.

인터넷 - TCP/IP를 통해서 클라이언트가 서비스를 요청하고 서버는 서비스를 제공하는 형태의 글로벌 컴퓨터 네트워크 구조이다.

 

[ 그는 인터넷이 옥스포드 대사전(영국에서 관리하는 사전으로 모든 용어들을 설명하는 대사전)처럼 활용될 수 있기를 바랬다고 한다.]

 

그리고 현재 그의 꿈은 웹 생태계에서 사용되고 있는 정보와 자원들의 관계를 컴퓨터가 처리할 수 있도록 하는 기술 "시맨틱 웹" 기술을 위해 나아가고 있다.

[그런 세상이 오게 된다면 웹은 인류가 만든 가장 거대한 데이터 브레인이지 되지 않을까 한다.]

 

여기서 중요한 것은 HTTP, HTML의 등장이다.

 

팀 버너스 리가 제안한 인터넷 기반의 표준 프로토콜로 인해서 우리는 요청과 응답이라는 모델을 사용하게 된다.

  • 사용자는 요청을 보내고, 서버는 자원에 대해서 응답을 한다.
  • 이는 시간이 지나면서 다음과 같이 발전한다.
    사용자는 브라우저를 통해 서버로 요청을 보내고, 웹 서버는 자원에 대해서 응답을 한다.

 

[ 요약하자면 당시의 역사는 다음과 같다. ]

  1. HTTP, HTML의 등장.
  2. 클라이언트-서버 모델.
  3. 개인용 PC의 등장.
  4. 브라우저의 발전. 브라우저의 응답을 요청하기 위한 웹 서버(아파치)의 발전.

 

이 즈음에 CGI의 개념도 고개를 들기 시작한다.

 

CGI

CGI(Common Gateway Interface)의 등장.

웹 서버 상에서 사용자를 위한 프로그램을 동작시키기 위한 규약 및 표준이다.

  • 웹 서버는 원래는 단순한 구조를 가진다.
    사용자가 보낸 요청에 대해서 정적인 응답 파일(HTML + 이미지 + XML)을 보낸다.
  • 웹 서버가 가진 아쉬운 점은 바로 동적인 기능을 처리하는 것에 대한 부재였는데 CGI를 통해 이를 해결하게 된다.

 

동적인 기능에 대한 욕구를 해결하기 위해 웹 서버와 프로그램을 연결하다.

특정 기술과 환경에 종속되지 않도록 표준을 개발! 

  • 웹 서버에서 프로그램을 호출하고 프로그램에서의 처리 결과를 웹서버가 받아서 이를 다시 클라이언트에 넘기는 방식이 고안된다.
  • 이 과정에서 서버 프로그램과 외부 프로그램과의 연계를 추상화해서 관리할 수 있도록 CGI가 고안된 것이다.
  • CGI는 서버와 외부 프로그램이 데이터를 송수신할 때 ~~ 한 가이드라인을 지키자! 인 것이다.

CGI가 떠오를 당시에는 실행 속도를 고려한다면 C언어로 작성되었고, 텍스트 처리를 편하게 하고 싶었다면 Perl이 사용되었다고 한다.

[ 최근에는 CGI를 만족하는 스크립팅 언어들이 떠오르고 있다.(루비, 파이썬, 자바 스크립트 등등) ]

 

개인용 PC의 가격 하락 그리고 대 인터넷 시대가 열린다.

개인용 가정에서 PC를 보는 것은 이제 흔한 일이 되었다. 

  • 인터넷 망이 전국(전 세계)으로 깔리고 각 가정마다 PC를 소유한 시대가 열렸다.
  • CGI로 동적인 기능도 처리할 수 있게 되면서 온라인 상에서 거래가 가능하게 되었다. [ 인터넷 버블이 등장한 시기 ]
  • 웹 서버는 점점 더 많아지는 요청을 처리하게 되었고, CGI 프로그램의 비효율성이 고개를 들기 시작한다.
    이 즈음 아파치 웹 서버도 비효율성을 개선하기 위해서 NGinx를 고안하게 된다.(이는 나중에 다시 정리할 것이다.)

 

CGI의 비효율성

  • 기존의 Perl로 구현된 CGI는 하나의 요청마다 프로세스를 생성해서 처리했다.
    하나의 요청이 끝나야 프로세스가 끝나고 자원이 반환되었다.
    [요청이 엄청나게 들어오면 프로세스가 순식간에 늘어나고 서버가 죽어버리게 된다.]
  • 같은 요청에도 프로세스를 생성해서 처리하는 구조는 상당한 비효율성을 낳았다.
    코드와 공유 데이터 정적인 영역은 공유하고, 스택과 힙 공간과 같이 동적인 영역을 별도로 가지는 스레드 처리의 필요성을 느끼게 된다.
    • 같은 요청에도 같은 코드, 같은 공유 데이터, 힙, 스택을 생성하는 것을 생산하는 것은 비효율적이다.
  • CGI 구현에 적극적으로 활용되던 Perl과 C 프로그래밍 언어는 절차 지향적인 언어로 복잡한 현실 도메인의 문제를 해결하는데 한계점에 봉착하기 시작한다. [ 절차지향 프로그램의 한계 ]

 

Servlet은 인터넷의 트래픽이 급격하게 상승하던 시기 CGI를 구현한 다른 프로그램의 비효율성을 개선하기 위해 자바 프로그래밍 언어로 구현된 CGI 프로그램이다

  • 추상화, 상속, 인터페이스, 구현, 다형성 등등 객체지향에서 복잡한 도메인을 관리하기 위해서 제공되는 OOP 기능들에 필요성을 느끼게 되면서 객체지향을 지원하는 프로그래밍 언어가 선택된다.
  • 그리고 자바는 멀티 스레딩 라이브러리를 지원하는 프로그래밍 언어였다.

자바 진영은 기존의 CGI 프로그램이 가지는 비효율성을 개선한 CGI 프로그램인 Servlet을 선보인다.

 

Servlet : 순수 자바 프로그래밍 언어로 이루어진 웹 서버용 클래스이다. 

  • HTML 등의 웹 콘텐츠를 생성하고 전달하기 위해 Serlvet 클래스의 구현 규칙을 지켜서 자바로 만들어진 프로그램이다. [ 현대의 Spring MVC는 @Controller로 명시한 클래스를 Servlet 구현 클래스로 본다. ]
  • LoginServlet, LogoutServlet, BuyServlet 등등 Servlet 클래스의 구현 규칙을 지켜서 동적 기능에 맞는 Servlet 프로그램을 제작하면 된다.
  • CGI를 만족하는 Servlet은 자바가 가지는 기능으로 기존 CGI 프로그램의 비효율성을 개선했다고 보면 된다.
  • 요청에 대한 서비스를 처리하고 결과를 반환한다.
  • Java 바이트 코드로 컴파일이 되기에 JVM위에서 동작해 크로스 플랫폼을 지원한다. [ 이식성을 얻게 된다. ]

 

Servlet의 구조. 

2개의 추상 클래스를 짚고 넘어가자 [ GenericServlet , HttpServlet  ]

  • javax 패키지에 있는 GenericServlet 추상 클래스는 보편적인 서블릿 인터페이스가 따라야 하는 API를 명시한다.
    [ CGI 규칙 ]
  • javax 패키지에 있는 servlet.http 패키지에 HttpServlet 추상 클래스는 HTTP 처리용 서블릿 인터페이스이다.
    HTTP의 프로토콜을 수월하게 처리하기 위한 API를 명시한다. [ doGet, doPost ]

 

요청에 대한 전체적인 처리 과정을 깔끔하게 보여준 그림.

서블릿이 가지는 생명주기 [ init(), service(), destory() ] [ 해당 생명주기는 서블릿 컨테이너가 관리한다. ]

  • init() : 서블릿이 메모리로 올라올 때 호출되는 초기화 함수
  • service() : 요청이 들어올 때마다 호출된다. [ doGet, doPost를 호출 ]
  • destory() : 메모리에서 해제될 때 호출되는 종료 함수이다.

 

Servlet을 효율적으로 다루기 위해서 Servlet Container를 사용한다. [일종의 관리자이다.]

- 생애주기 관리

- 스레드로 서블릿을 관리할 수 있게 해 준다. 

  • CGI 프로그램이 가졌던 1 요청 1 프로세스의 문제를 극복하는데 도움을 주는 관리 기법이다.
  • 서블릿의 생명주기를 관리하고 요청에 대해서 스레드를 생성해 준다.
    Servlet이 이미 메모리에 있는 상황이라면 따로 init()을 거치지 않고 Service를 처리하게 해준다.
  • HTTP 요청을 받아서 Servlet을 실행시키고 결과를 사용자 브라우저에게 전달해주는 기능을 가진다.
  • 서블릿과 웹 서버(아파치)가 서버로 통신하는 방법을 제공해준다.
  • 웹 서버로 하여금 요청에 대한 서블릿을 일일 매핑할 필요 없게끔 해준다.
  • 유명한 서블릿 컨테이너로는 톰캣, 제티가 있다.
  • 톰캣은 JSP를 지원한다.

보통 WAS로 묶어서 Apache Tomcat이라고 표현한다.

 

 


개인 후기

내용이 상당히 방대하다. 

 

이 기회에 CGI를 이해할 수 있어서 좋았다. 

 

CGI에 대해서는 "나는 프로그래머다 토비(이일민)편"에서 처음 들었다.

 

토비님이 가졌던 과거에 대한 이야기를 들으면서 자주 등장했는데 CGI가 뭘까 싶었다.

 

오늘 그 이해를 끝낼 수 있어서 좋았다. 

 

역사적인 흐름을 통해서 변화를 따라가다 보면 자연스럽게 그 당시의 관점을 얻어볼 수 있게 된다.

 

아 그래서 이렇게 되었구나, 그래서 이 부분이 개선되었구나 등등

 

예측할 수 없었던 문제점과 기존의 설계를 확장한 새로운 설계의 등장에서 문제를 해결하기 위한 여러 시도들을 간접적으로 경험할 수 있는 것이다.

 

이 모든 과정을 깊게 공부해서 활용하는 데 사용하는 것은 아니지만 흐름으로 경험한다는 것은 큰 도움이 될 것이라 생각한다.

 

다음에는 Servlet에서 JSP로의 과정을 살펴보고자 한다.

 

그리고 JSP와 서블릿 컨테이너(톰캣)를 좀 더 Deep 하게 살펴보고자 한다.

 

마지막으로는 DispatcherServlet의 구조를 보며 왜 이러한 구조를 가지게 되었는지 정리해보고자 한다.

 


참고 자료

반응형