저번 시간에 JSP 실습을 위한 환경설정을 마치고 오늘은 Web의 기본 환경에 대한 설명을 들었다. 용어를 따라 하나씩 정리해 보자.
웹(Web)
웹이란 인터넷 프로토콜 기반의 네트워크에서 도메인이나 IP 주소, 루트 경로만으로 이루어진 일반 URL을 통하여 보여지는 웹 페이지(Web Page)들의 묶음을 말한다.
< 웹 어플리케이션 >
웹을 기반으로 실행되는 어플리케이션을 의미한다. 웹 브라우저에 URL 주소를 입력하고 기능을 요청하면 요청받은 기능에 맞는 결과를 전송해서 출력한다.
< 웹 어플리케이션 구축을 위해 필요한 요소들 >
* 웹 브라우저 (Web Browser) : 웹 서버에 서비스 실행을 요청하여 처리 결과를 사용자에게 보여준다.
▶ IE(Internet Explorer), Chrome, Firefox 등
* 웹 서버 (Web Server) : 웹 브라우저의 요청을 받아 알맞은 결과를 전송한다. 프로그램 처리가 필요하다면 어플리케이션 서버를 사용하거나 프로그램을 직접 호출하여 결과를 생성한다.
▶ Apache 등
* 어플리케이션 서버 (Application Server) : 게시글 목록이나 로그인과 같은 기능을 실행하고 결과를 웹 서버에 전달한다.
▶ Tomcat, WebLogic, JBoss, Jetty 등
* 데이터베이스 (Database) : 웹 어플리케이션이 필요로 하는 데이터를 저장한다. (회원정보, 게시판 글 등)
▶ MySQL, Oracle, MS-SQL 등
Web의 기본 환경
우선 우리가 흔히 웹 브라우저를 사용하는 방식을 떠올려 보자. 웹 브라우저로는 IE(Internet Explorer)나 Chrome, 또는 Firefox등이 떠오를 것이다.
이러한 웹 브라우저를 실행하고 URL에 자신이 원하는 도메인의 주소를 입력할 것이다. 네이버(www.naver.com)나 구글(www.google.com) 등을 입력을 하면 해당 도메인의 DNS Server에 요청을 하여 맞는 웹 페이지를 출력한다.
이후에 사용자가 원하는 작업을 하면 웹 서버(Web Server) 에 요청을 하게 된다. 웹 서버는 요청한 기능을 수행 한 후 결과를 웹 브라우저로 보낸다. 이 때 사용되는 웹 언어로는 HTML, XML, HTML5, XHTML 등이 있다.
< 웹 어플리케이션 실행 순서 >
웹 어플리케이션의 실행 순서에서 웹 서버가 직접 프로그램을 호출하는 지의 여부에 따라 CGI와 Web Application Server 방식으로 나눠진다.
- CGI(Common Gateway Interface) : 웹 서버가 직접 어플리케이션을 실행하는 구조이다. 주로 펄(Perl) 이나 C/C++ 언어를 사용하여 작성된 CGI 프로그램을 직접 실행하고, 생성된 결과를 웹 브라우저에 전송한다. 웹사이트 주소의 마지막이 .cgi로 끝나는 곳이 CGI 방식을 구현한 경우이다. 요청이 올 때마다 process를 계속 생성하는 특징이 있다. 사전을 일일이 찾아 해석한다고 생각하면 된다.
- WAS(Web Application Server) : HTML 과 같이 판화로 찍어내는 듯한 방식의 정적인 언어의 한계를 극복하기 위해 프로그래밍 적 요소를 추가하고 CGI의 비효율적인 특징을 보완하기 위한 방식이다. 어플리케이션 서버가 소스를 해석해서 웹 서버에 전달해주고, 웹 서버는 전달받은 결과를 웹 브라우저에 전송한다.
WAS 방식에서는 여러 웹 브라우저가 동일한 프로그램을 요청하더라도 프로그램을 한 개만 로딩하여 사용하기 때문에 효율적이다. 현재 많이 사용되는 JSP와 ASP.net 모두 어플리케이션 서버 방식을 취하고 있다.
구조가 CGI 방식에 비해 복잡해지더라도 접속자가 많은 경우 성능이 더 좋게 나타난다.
번역가 역할을 한다고 생각하면 될 것이다.
* 요즘엔 웹 서버와 WAS가 결합된 형태를 많이 사용하며 전문적으로 운용하기 위해선 분리하여 사용한다.
* 엄밀히 말하면 CGI 방식 / WAS 방식 모두 하나의 규격이다. 또한, WAS 방식이 CGI 방식에 비해서 절대적으로 성능이 우수한 것은 아니다.
PHP의 경우 CGI 방식에서 처리량이 더 좋게 나오기도 한다. (PHP는 기본적으로 WAS 가 없다. 때문에 모듈을 이용하여 WAS 방식으로 동작한다)
< 스크립트 방식과 실행코드 방식 >
- 실행코드 방식 : 일반적으로 CGI 방식이고 요청이 있을 때마다 코드 번역이 발생한다.
- 스크립트 방식 : JSP나 ASP 기반의 방식이며 어플리케이션 서버 방식이다. 최초 요청에 대해서만 코드 번역이 한 번만 발생한다.
* 스크립트 방식의 처리속도가 빠른 이유
: 두 가지 방식을 비교해 보면 실행코드 방식이 좀 더 빠르게 보이지만, 스크립트 코드 방식이 WAS 방식으로 동작하기 때문에 전체 처리량에서 앞서게 된다. 이유는 스크립트 방식은 최초 요청에 대해서만 코드 번역이 한 번만 발생하고 이후의 요청에 대해서는 앞서 번역된 코드를 실행함으로써 번역횟수를 최소화 하기 때문이고, 기술의 발달로 일반 프로그램과 동일한 수준의 성능을 제공하고 있기 때문이다. 이러한 이유로 스크립트 방식의 속도가 실행코드 방식보다 더 빠르게 나온다.
< URL과 웹 어플리케이션 주소 >
URL 사이트에 연결할 때는 다음과 같은 형식의 주소를 웹 브라우저에 입력하는데 위의 주소는 자원을 구분할 때 사용되는 문자열로서 이러한 문자열을 URL(Uniform Resource Locator) 이라고 부른다.
URL은 다음과 같이 구성된다.
▶ [프로토콜]://[호스트][:포트][경로][파일명][.확장자][쿼리문자열]
* [프로토콜] : 서버와 클라이언트가 통신할 때 사용하는 규약이다. http, ftp 등이 있으며 웹 브라우저와 웹서버는 http나 https를 이용한다.
* [호스트] : 클라이언트가 접속할 서버 주소이다. 우리가 흔히 사이트 주소로 알고 있는 호스트명
( ex) www.naver.com )이나 IP주소를 사용한다.
* [:포트] : 클라이언트는 호스트에 여러 개의 서버 프로그램이 실행될 경우, 호스트 주소 만으로는 원하는 서버에 접속할 수 없게 된다. 따라서 각 서버에 고유한 번호를 부여하여 서비스를 제공하는데 이것이 포트이다.
프로토콜마다 각각 다른 기본 포트를 가지는데 HTTP 프로토콜의 경우 80 이다. 웹 브라우저에서 HTTP 프로토콜을 사용하여 URL을 입력할 때 포트를 입력하지 않을 경우 기본 포트 값으로 80이 적용된다.
(Web : 80, WAS : 8080, MySQL : 3306 등이 있다)
* [경로][파일명][.확장자] : 서버에서 가져올 자원의 위치를 입력한다. 디렉터리 경로와 비슷한 형식이다.
* [쿼리문자열] : 주소 뒤에 붙는 추가정보로써 파라미터를 웹 어플리케이션에 전달할 때 사용한다. 물음표(?)를 이용하여 경로와 구분되며 1개 이상의 파라미터 이름과 값을 가진다. 각각의 파라미터는 앰퍼샌드(&)를 이용하여 구분한다. 파라미터의 이름과 값은 등호(=)로 구분한다.
▶ ?이름1=값1&이름2=값2&...
우리 연구실의 그룹웨어 주소를 예를 들어 설명하겠다.
▶ http://kplus.kpu.ac.kr:9201/NEW_GROUPWARE_SYSTEM/bookList.runa?topMenuSeq=32
* [프로토콜] : http
* [호스트] : kplus.kpu.ac.kr
* [:포트] : :9201
* [경로][파일명][.확장자] : /NEW_GROUPWARE_SYSTEM/bookList.runa
* [쿼리문자열] : ?topMenuSeq=32
< 서블릿과 JSP >
- 서블릿 (Servlet)
웹 개발을 위해 만든 표준이다. 서블릿 규약에 따라 만든 클래스를 서블릿이라 부른다.
자바 코드를 작성하고 코드를 컴파일해서 클래스파일을 만든다. 즉 실행코드 방식이다.
개발 후 데이터를 수정할 경우 코드를 다시 수정하고 컴파일한뒤 클래스를 알맞은 곳에 복사해주는 번거로움이 있다.
- JSP (Java Server Pages)
자바 언어를 기반으로 하는 스크립트 방식의 표준이다.
서블릿 표준을 기반으로 만들어졌으며 HTTP 프로토콜을 알맞게 처리할 수 있도록 설계되었다.
다음과 같은 특징이 있다.
* 자바 언어 기반이기 때문에 자바의 기능을 그대로 사용할 수 있다. 또한 OS에 독립적이다.
* 대규모 어플리케이션을 구현할 때 사용되는 스프링이나 스트럿츠 같은 프레임워크와 연동된다.
* HTTP와 같은 프로토콜에 따라 요청을 처리하고 응답한다.
* HTML, XML 등 요청한 문서를 생성하는데 주로 사용한다.
* 서블릿/EJB 등 엔터프라이즈 기술들과 잘 융합된다.
(EJB(Enterprise Java Beans)는 DB를 객체화하여 이동성을 높인 것이다)
* 표현 언어, 표현식, 스크립트릿 등 다양한 스크립트 요소와 액션 태그 등을 제공한다.
- 웹 컨테이너 (Web Container)
웹 어플리케이션을 실행할 수 있는 컨테이너이다. 웹 어플리케이션을 구현할 수 있는 서블릿 컨테이너와 JSP 컨테이너로 구성된다. 즉, 서블릿과 JSP를 구현할 수 있는 각각의 컨테이너를 묶은 의미이다.
내가 JSP 실습을 위해 사용하는 톰캣 역시 웹 컨테이너로서 JSP와 서블릿을 모두 지원한다.
< 웹 프로그래밍 절차 >
① 개발 환경 구축
② 웹 어플리케이션 코드 개발 및 테스트
③ 완성된 웹 어플리케이션을 서비스 환경에 배포
현재단계는 개발 환경까지 구축하였고 지금은 코드를 개발하는 방법을 배울 준비를 하는 단계이다. 간단한 예제를 통해 JSP를 작성해 보았다.
자바의 Date 클래스를 사용하여 현재 시간을 출력하는 예제이다.
JSP 소스는 디렉티브릿, 스크립트릿, 표현식으로 구성된다.
* 디렉티브릿 : <%@ 디렉티브릿 %>
* 스크립트릿 : <% 스크립트릿 %>
* 표현식 : <%= 표현식%>
다음으로 라인을 따라가며 설명해 보겠다.
Line 1 : 디렉티브릿을 사용한다.자바 언어를 사용하며 contentType 속성을 사용하여 JSP가 생성할 문서가 HTML임을 지정한다. 인코딩은 EUC-KR을 사용한다.
Line 2 : 디렉티브릿을 사용한다. 자바의 java.util.Date 클래스를 사용하는 내용을 담는다.
Line 4~6 : 스크립트릿을 사용하여 현재 시간을 저장하는 Date 객체를 생성. 변수 now에 할당한다.
Line 13~14 : 표현식을 사용하여 현재시간을 출력한다.
출력 결과는 다음과 같다.
여기서 새로고침을 해보면 시각이 바뀌는 것을 알 수 있는데 이것은 JSP의 동적인 측면을 보여준다.
반면, HTML 파일이나 이미지 등은 새로고침을 하더라도 동일한 데이터가 출력되는데 HTML은 정적인 특징을 갖는다는 걸 알 수 있다.
지금까지 웹의 기본 환경과 간단한 예제를 통해 JSP의 특징을 알아보았다.
이상으로 포스팅을 마치며 내용을 잘 숙지하도록 해야겠다.