본문 바로가기

프로그래밍/Servlet&JSP

CGI와 서블릿

서블릿 관련 책을 보다 CGI와 서블릿의 차이에 대한 내용이 나왔다. CGI에 대한 궁금증이 생겨 좀더 찾아보았는데, 서칭할수록 더 혼란만 오게 되었다. 그 이유는 CGI에 대한 개념을 알게된 이후인데 아래는 CGI와 서블릿에 대한 설명이다.

CGI
Common Gateway Interface(공통 게이트웨이 인터페이스)의 약자. 정의를 보면 웹서버와 외부 프로그램간의 데이터를 주고받는 방법에 대한 규격인데, 웹 서버가 동적인 컨텐츠도 제공할 수 있게하는 방법이다. 
웹 서버는 미리 서버상에 준비되어 있는 정적 컨텐츠(html, 이미지)만 제공할 수 있다. 하지만 사람들은 웹 서버가 클라이언트의 요구에 따라 동적으로 컨텐츠를 만들어 제공할 수 있게 되길 원했다.
그래서 동적 컨텐츠를 생성할 수 있는 프로그램을 만들게 되었고, 이 프로그램과 웹서버간에 데이터를 주고받을 수 있는 규격인 CGI가 만들어졌다.

서블릿
서블릿은 클라이언트의 요청에 따라 동적으로 컨텐츠를 만들수 있는 기술이며, java로 만들어진다. 서블릿 자체는 java로 만들어진 하나의 클래스파일일 뿐이다. 그렇기 때문에 클래스 파일을 로드하고 실행시키기 위한 jvm이 필수이며, 웹서버와 데이터를 주고받으면서 서블릿이 만든 컨텐츠를 웹 서버에게 제공(웹 서버없이 직접 클라이언트에게 제공할수도 있다. 이런 형태를 웹 어플리케이션 서버 줄여서 WAS라고 한다.)하는 컨테이너(톰캣, 제우스 등)가 필요하다. 


CGI에 대한 설명을 보면 서블릿도 하나의 CGI인것이 아닌가라는 생각이 들게되어 혼란스러웠던 것이다.
책에 나온 CGI와 서블릿의 주요 차이점으로, CGI는 요청이 들어오면 프로세스를 실행시켜 동적컨텐츠를 만들고,
서블릿은 쓰레드를 실행시켜서 서블릿이 CGI보다 서버 자원을 덜 잡아먹는다는 것이다.

CGI는 하나의 규격인데 왜 CGI를 하나의 프로그램인 것처럼 서블릿이랑 비교를 하고있다는게 이해가 안 되서 고민을 하던 와중에 위키백과의 CGI에 대한 오해를 보고 의문이 풀렸다. 예전에는 C나 Perl이라는 스크립트 언어로 CGI 프로그램을 작성했는데, 이 프로그램 자체를 CGI라고 호칭했었던 것 같다.

결론을 내리자면 CGI는 웹서버와 동적 컨텐츠를 만들어내는 프로그램간의 대화 방법을 정의한 규격이고,
CGI가 나온 초창기에는 C나 Perl로 CGI프로그램을 만들어서 사용했는데, 서버의 자원을 덜 잡아먹게끔 개선된 서블릿이란 기술이 후에 개발되었다.

 

참고자료

 

techDifference:
https://techdifferences.com/difference-between-cgi-and-servlet.html

위키백과: https://ko.wikipedia.org/wiki/%EA%B3%B5%EC%9A%A9_%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4