WAS 의동작과 WEB, Servlet, JSP 엑셈컨설팅본부 /APM 박종현 웹어플리케이션서버란? 웹어플리케이션서버방식은웹서버가직접어플리케이션프로그램을처리하는것이아니라웹어플리케이션서버에게처리를넘겨주고어플리케이션서버가어플리케이션프로그램을처리한다. 여러명의사용자가동일한페이지를요청하여여러어플리케이션프로그램을처리할때오직한개의프로세스만을할당하고사용자의요청을 thread 방식 (Servlet/JSP) 으로처리한다. [ 그림 1] WAS 방식 - Note 여러개의요청에오직 1개의프로세스만을할당하고사용자의요청을 thread 방식으로처리한다. 메모리를절약할수있기때문에 Servlet/JSP방식은 CGI 방식에비해동시에더많은사용자에게서비스를할수있다. 이것은전체적인성능의향상을가져와보다안정적인웹서비스를제공하는것이가능하다. 웹서버의기능들을구조적으로분리하여처리하는목적으로아래그림과같이웹서버의기 능과컨테이너의기능으로구성되어있다. 322 2013 기술백서 White Paper
[ 그림 2] WAS 구조 웹서버와어플리케이션서버 웹서버와웹어플리케이션서버의차이는구현된언어가다른것이다. 웹서버는 C로구현되며웹어플리케이션서버는 JAVA 로구현이되어실행할때 class 작업을하며메모리할당후해제를자동으로 GC가관리한다. 웹서버는웹에서서버기능을처리하는프로그램으로써 HTTP 라는프로토콜을기반으로하여웹클라이언트로부터요청을서비스하는기능을담당하여처리된결과를클라이언트로응답한다. 웹어플리케이션서버는웹서버의기능들을구조적으로분리하여처리하는목적이다. business logic 을수행한다. WAS 는웹서버의기능과컨테이너의기능으로구성된다. 컨테이너는 Servlet 컨테이너이다. [ 그림 3] WAS 의구성별기능 Part 2 APM 323
- Note 대부분의상용화된웹어플리케이션서버들은웹서버나컨테이너기능외에엔터프라이즈환경에필요한트랜잭션, 보안, traffic 관리, DB 커넥션풀, 사용자관리등의다양한기능을제공하는소프트웨어로개발되었다. J2EE 기술을지원하는서버로서웹서버기능에 Servlet/JSP 처리와 EJB 수행을지원하는서버로제공된다. 그래서 WAS 를 J2EE 서버라고한다. 서버라고불리지만실체가존재하지않는, 즉물리적서버의개념이아닌논리적서버를말한다 [ 그림 4] WAS 와 J2EE 위의내용으로 WAS 의구조와성능에대해서알아보았다. InterMax 는단순 WAS 모니터링이아닌 business 트랜잭션성능의측면에서모니터링을하기위한툴이다. InterMax 를통해수집된성능지표와 logging 된데이터를통해문제발생원인을제대로파악하기위해서는 WEB 과 Servlet, JSP 에대해서좀더조사하고이해하는것이도움이될것이다. 먼저 WEB 을알아보도록하자. WEB 웹프로그램의이해기본적으로클라이언트 (Client)/ 서버 (Server) 방식의형태이다. 클라이언트 ( 웹브라우저 ) 가특정웹서버에요청 (Request) 하게되면웹서버가이를처리한후결과를클라이언트 ( 웹브라우저 ) 에게응답 (Response) 을하게되는구조이다. 324 2013 기술백서 White Paper
[ 그림 5] WEB 의요청과응답 웹프로그래밍언어의종류개인용홈페이지와다르게많은양의데이터처리나많은접속을동시에수용할수있도록개발가능한언어들이다. CGI, ASP, PHP 등이있으며여기에서는 Servlet과 JSP에대해알아볼것이다. Servlet(Server + Applet) JAVA 언어를기반으로동적인 contents를생성하는기술. JAVA 프로그램을작성하는형식과거의같다. JAVA 코드안에 HTML 태그가섞여있어작업에대한분리적인측면으로볼때효율성이떨어진다. 프로그래머가프로그래밍하기어려우며수정하기어려운단점이있다. JSP(Java Server Pages) JAVA 언어기반으로만들어짐. ASP, PHP 처럼 HTML 태그사이사이에동적인 contents 생성을담당할 JAVA 코드가들어있는형태로 Servlet의형태와다른모습을취하고있다. 동적 contents를생성하기위해스크립트언어형식으로프로그램을작성할수있어개발자에게쉬운개발을할수있게한다. 또한 JSP는사용자가직접태그를정의해서사용할수있는사용자정의태그를지정할수있는기능을갖고있어효율적인웹사이트를구성할수있다. JSP 가 Servlet 으로변환된다. 변환된 Servlet 이 compile 되고실행된다. 웹어플리케이션처리순서 웹어플리케이션이란웹을기반으로실행되는프로그램을의미한다. 따라서웹프로그래밍 Part 2 APM 325
과웹어플리케이션의관계는웹프로그래밍을통한웹어플리케이션의구현이라할수있다. [ 그림 6] 웹어플리케이션의처리순서 웹브라우저가웹서버에페이지를요청한다. 해당웹서버는웹브라우저의요청을받아서요청된페이지의 logic 및데이터베이스와의연동을위해어플리케이션서버에처리를요청한다. 웹어플리케이션서버는데이터베이스와의연동이필요하면데이터베이스와데이터의처리를수행한다. logic 및데이터베이스작업의처리결과를웹서버에보낸다. 웹서버는결과를다시웹브라우저에응답한다. 웹어플리케이션은웹브라우저, 웹서버, 웹어플리케이션서버, 데이터베이스로구성되어있다. 웹브라우저웹에서클라이언트이며사용자의작업창이다. 웹서버 웹브라우저의요청을받아들이는곳으로작업의결과를웹브라우저에게응 답을하는곳이다. 요청된페이지의 logic 및데이터베이스와의연동을위해 어플리케이션서버에이들의처리를요청하는작업을수행한다. 웹어플리케이션서버요청된페이지의 logic 및데이터베이스와의연동을처리하는부분이다. 데이터베이스데이터의저장소로웹에서발생한데이터는모두이곳에저장된다. [ 표 1] 웹어플리케이션구성 326 2013 기술백서 White Paper
웹의동작방식과웹의구성요소에대한조사와정리를하였다. 웹의요청과응답과정과처리과정을보면웹어플리케이션서버가웹서버및데이터베이스와연동하여작업을진행하는것을볼수있다. 웹서버의역할은클라이언트의요청에따라직접서비스하거나웹어플리케이션서버의컨테이너를이용하여요청을처리한후클라이언트에게전달해주는것이다. Servlet 에대한요청이발생할경우웹서버는 Servlet 을처리하기위해 Servlet 컨테이너에요청을할것이다. 다음장에서웹프로그래밍언어인 Servlet 과 JSP 에대해서알아보자. JSP, Servlet JSP JSP 는자바 Servlet 기술을확장시켜웹환경상에서자바만으로서버사이드모듈을개발하기 위한기술이다. JSP 도 Servlet 과마찬가지로서버사이드에서 DBMS 와같은 Back-end Server 와연동하여 Back-end Server 의데이터를가공하여웹상의최종적사용자에게디스플레이할수있고여 러조건에따라디스플레이할수있는내용들을동적으로처리할수있는기능을제공한다. JSP 는웹프로그래밍언어중하나이다. 웹프로그래밍언어는동적인페이지를생성하기위한 서버측스크립트언어이다. 그러한언어들중에서 JSP 는자바를기반으로만들어진것이다. - Note 객체지향적, 플랫폼독립적, 네트워크지향적, 뛰어난보안, 멀티 thread 기능, 친근한코 드가장점이다. JSP 는자바가갖는특징들을그대로갖고있으며 J2EE 를구성하는기술중에하 나이다. Part 2 APM 327
[ 그림 7] J2EE Servlet Servlet은멀티 threading에의해사용자요구를처리하고가공해서이에대한결과를내보내게된다. CGI가클라이언트를프로세스로처리하는데반해 Servlet은클라이언트를 thread로처리한다. 많은클라이언트의요구를효과적으로처리할수있다. Servlet 객체는여러개의 thread가돌아가면서처리하기때문에 Servlet의 method들은반드시멀티 thread에대한고려를해야한다 328 2013 기술백서 White Paper
[ 그림 8] Servlet 처리과정 1. 클라이언트의서비스요청 ( 객체생성의유무체크 ) 2. Yes 이면생성하지않고 No 면객체를생성한다.( 메모리에적재 ) 3. Invoker 에서생성된 Thread 에서 service method(response 의내용이담김 ) 을호출. 클라이언트당 1 개씩생성된다. 4. 결과를클라이언트에게보낸다. 이때결과를 mime type 으로보내는데웹브라우저 의 mime type 은 text/html 이다. - Note Container 는객체생성의유, 무를체크해서객체가생성되어있지않으면생성한다. J2SE, J2EE, J2ME와 Servlet, JSP의관계 Servlet과 JSP는 J2SE 영역이아니고 J2EE 영역이기때문에 JDK(J2SE) 에서는 Servlet 관련 API 가없어개발할수없다. J2EE 환경은 J2SE 환경위에서운용하게되므로 J2EE에속하는프로그래밍을하기위해서는먼저 J2SE가설치되어있어야하며 J2EE를지원하는서버가준비되어있어야한다. Part 2 APM 329
동작방식웹브라우저에서 JSP 페이지를웹서버로요청하게되면웹서버가이요청을받게된다. 사용자가요청하는것이웹서버는 JSP 파일인것을인지하고작업을웹컨테이너 (JSP 컨테이너 ) 로넘기게된다. 이런요청을받은웹컨테이너는해당 JSP 페이지를찾아서자바파일로변환을시킨다음컴파일을하게된다. 컴파일된 Servlet은최종적으로웹브라우저에응답되어사용자는응답결과를보게된다. 이러한과정은 JSP 페이지가최초로요청되었을때단한번만실행된다. 이후같은페이지에대한요청이있으면변환된 Servlet 파일로서비스를처리한다. [ 그림 9] JSP 파일 Servlet 으로변환과정 1 [ 그림 10] JSP 파일 Servlet 으로변환과정 2 실행코드방식 (CGI) 스크립트방식 ( 웹어플리케이션서버 ) 코드형식 컴파일된실행프로그램 컴파일되지않은스크립트코드 실행방식 컴파일된기계어코드직접실행 스크립트코드를해석한뒤실행 코드변경 소스코드를다시컴파일해야함 스크립트코드만고치면됨 종류 대부분 CGI 프로그램 JSP, ASP, PHP 330 2013 기술백서 White Paper
구현 웹브라우저요청전송 - 웹서버요청받음 - 프로그램실행 웹브라우저요청전송 - 웹서버요청받음 - 스크립트코드번역 - 번역된코드실행 ( 번역이최초에한번만실행되기때문에속도가빠름 ) [ 표 2] 실행코드방식과스크립트방식 컨테이너측면과서비스 API 측면구분이유 J2EE는컨테이너 (Container) 가관리하는컴포넌트 (container-managed component) 그룹과서비스 API(Service API) 그룹으로나누어진다. 각분야마다전문가들이개별컴포넌트를하나만집중해서개발하면된다. 이미제공되는서비스들및컨테이너를연계하여집중적인튜닝을통해성능을향상할수있다. - Note Connection Pooling 과같은일반적으로사용되는컴포넌트나서비스분야와비즈니스 logic 개발을나누어작업할수있다. 컨테이너 tomcat은컨테이너의좋은예이다. apache와같은웹서버가사용자로부터 Servlet에대한요청을받으면 Servlet을바로호출하는것이아니라 Servlet을관리하고있는컨테이너에게이요청을넘긴다. 이컨테이너는 Servlet이배포 (deploy) 된컨테이너다. 요청을넘겨받은컨테이너는 HTTP Request와 HTTP Response 객체를만들어이를인자로 Servlet dopost( ) 나 doget( ) method 중하나를호출한다. 웹컨테이너. JSP 는서버측에서동작하고웹서버와연동이되어동적인페이지를생성한다. JSP 가동작하는고이서버의환경이라는것이다. 이는 JSP 를사용하기위해서는서버환경이구축되어야하며기본적으로웹서버와웹컨테이너가설치되어있으면된다. 대부분의웹컨테이너는웹서버기능을가지고있다. Servlet 컨테이너. Servlet 을동작시킬수있는환경을제공하는서버프로그램이다. 즉 HTTP 요청을받아서해당 Servlet 을동작시키고그결과를사용자의브라우저로전달해 Part 2 APM 331
주는기능을제공한다. 보통컨테이너라고하는이유는 Servlet 프레임워크안에서동작을하고 Servlet 이동작할수있는환경을제공해주며기타필요한작업등을제공해주기때문이다. HTTP parameter parsing 및결과전달을컨트롤, Forwarding, Redirecting 등의기능을컨테이너에서제공해준다. 이때 Servlet 개발자는자신이만든 Servlet 을이컨테이너에등록을하게되고실제동작을컨테이너가알아서하게되기때문에사용되는언어이다. JSP 컨테이너. 실제로 JSP 컨테이너의의미는 Servlet 컨테이너의개념과동일하다. 실제로는 Servlet 컨테이너가 JSP 컨테이너가된다. JSP 는 PHP/ASP 와같이완전히스크립트형식으로동작하지않고 Servlet 으로변환이된이후에실행되기때문이다. JSP 를 Servlet 으로컴파일을해주는것이 JSP 엔진이다. tomcat 의경우 JSP 엔진이바로 JSPServlet 이다. 즉 JSP 를컴파일하고동작을시켜주는것을특정 Servlet 이담당하고있다. JSP 자체가완전한 Servlet 으로컴파일되지않는다는것을알수있다. JSPServlet 이구동할수있는형태의 Servlet 으로바뀌게된다. JSP 컨테이너는 Servlet 으로변환하는과정에서 parsing 과정이하나더켜져있는것이고나머지는똑같다. EJB 컨테이너. EJB spec 은확장가능하고다중사용자처리에안전한트랜잭션기능을인식하는분산된비즈니스어플리케이션컴포넌트들을개발하기위해필요한표준화된모델을제공한다. EJB 는비즈니스 logic 을구현한각종컴포넌트들을서버에분산시킴으로지속성있는데이터를개체지향적인방식으로표현할수있도록해준다. - Note 컨테이너는 Servlet 과웹서버가서로통신할수있는손쉬운방법을제공하고 Servlet 의라이프사이클을관리하고요청이들어올때마다생기는 thread 에대한멀티 threading 을지원하며보안관리, JSP 를지원한다. J2EE 에서는두타입의컨테이너를제공한다. 웹컨테이너와 EJB 컨테이너이다. 웹컨테이너는 Servlet 과 JSP 에대한실행환경을제공하고 EJB 컨테이너는 Enterprise JavaBeans 에대한실행환경을제공한다. 332 2013 기술백서 White Paper
Servlet 의 Lifecycle [ 그림 11] Servlet 의생명주기 1. init( ) : 초기화및자원할당. 단 1 번만호출된다. (Container 당 1 개 ) 2. service( ) : request 당 1 개씩호출된다. reload 도해당 3. destroy( ) : 자원해제및소멸 1 번만호출된다. 관리 container 가종료될때 timeout 이되었을때, class 의내용이변경되었을때, 재컴파일시호출된다. Servlet 이처음에 load 되면 init( ) method 가실행된다. init( ) method 에서는 Servlet 이서 비스하기위해필요한초기화작업을수행하고 init( ) method 가 service( ) method 를호출한 다. 초기화된 Servlet 은클라이언트의요청이있을때마다 thread 가생성이되어서병행적으로 service( ) method 를실행한다. Part 2 APM 333
Servlet 은더이상서비스를하지않을경우에는 Servlet 엔진에의해메모리에서 unload 된다. 이때 unload 되기전에 destroy( ) method 가실행된다. service( ) method 는 0 회이상실행되고 init( ) method 는여러번실행될수있지만그전에 destroy( ) method 가실행되어야한다. WAS 내부적으로 JSP 를 JAVA 파일로변환하고그것을다시 compile 하여 class 파일로바꾸어실행을시킨다. 페이지자체가 class 가된다. Servlet 은자체가 JAVA 로되어있어그것을 class 로 compile 한다. Servlet 에다한단계더나아간것이 JSP 이다. JAVA 와 HTML 을분리하여개발과디자인을구분하여복잡성을줄이고 upgrade 및사후관리를더욱편리하게만들었다. 결론 WAS 를 monitoring 하기위해서 WAS 의구성요소와그구성요소가무엇인지조사를해보았다. 인터넷의발전으로사용량이증가하여 Web Server 의작업을세분화하였다. 1tier 이었던시스템의점점늘어나 n tier 로쪼개졌다. 어느부분에서어떤작업을하고어떤역할을하는지모르면장애가발생하였을때원인을찾기도어려워졌다. 그렇기때문에 WAS 엔지니어는각부분에대해어떤작업이이루어지는지바로파악할수있어야하며문제현상을보고문제가발생한지점에서적절한대응을할수있어야한다. 334 2013 기술백서 White Paper