- 작성시간 : 2015/01/30 18:46
- 퍼머링크 : mcchae.egloos.com/11152236
- 덧글수 : 4
최근에 필요에 의하여 Tomcat WAS 컨테이너에서 WebApp를 살펴볼 기회가 있었습니다.














제대로 Tomcat, 웹로직 등에서 웹App를 만들어 jsp 등으로 개발을 해 본 것이 90년 말이었으니
정말 오래된 일입니다.
더군다나 그 이후 말로만 들어 보았던 것을 직접 눈으로 보게 되어 한편으로는
견문을 약간 넓히게 되었네요...
암튼 처음 접하시는 분들도 있으실테니...
웹 프로그램의 발전
World Wide Web이라는 용어가 나오고 HyperText, Web-Broswer의 용어가 나온뒤
HTML을 이용한 CGI 프로그램이 있었습니다.
CGI는 웹서버가 HTTP 요청을 받으면 그것을 CGI 인터페이스를 통하여
다른 프로그램이 결과를 받아 출력으로 HTML을 게워내는 식이었죠.
그러다가 PHP라는 Server-Side-Script 가 나옵니다.
CGI를 이용하여 프로그램을 하던 것과 달리
HTML 템플릿에다가 로직 프로그램을 직접 기술할 수 있으니
처음에는 무척 획기적인 것으로 생각되었습니다.
같은 맥락으로 M$사의 ASP, Java의 JSP 등이 나왔습니다.
그런데 문제는 이런 Server-Side-Script의 치명적인 단점이 존재하는데,
바로 화면을 꾸미는 View와 Logic 이 섞여 있게 된다는 것입니다.
굳이 MVC 모델과 같이 분리를 하지 않더라도
View와 Logic이 섞여 있으므로 발생하는 문제점은
그 해결책으로써 거꾸로 분리해 내기가 쉽지 않습니다.
그러면서 나오는 웹 개발의 MVC 분리 프레임워크 들이 나오게 됩니다.
PHP 진영에서도 찾아보면 여러 것이 있었고,
트위터로 RoR(Ruby on Rails) 라는 새로운 언어, 프레임워크도 있었으며
Python에서도 Django라고 하는 거의 동일한 개념의 웹개발 MVC 프레임워크가 발전합니다.
바로 sprint 프레임워크도 Java WAS 컨테이너의 MVC 프레임워크라고 이해를 하고 있습니다.
(아니면 딴지 걸어 주셔요~)
간단히 이야기 하면 웹은 GET 등의 HTTP method를 URL로 요청을 하는데
이 URL은 WebApp 입장에서는 여러가지가 있을 수 있으므로 해당 URL을
특정 컨트롤러에 라우팅 시키는 기능이 존재합니다.
그러면 해당 컨트롤러는 View와 무관하게 모델에서 자료를 꺼내와서 처리 (도메인)하고
그 결과를 리턴하면 결과는 jsp 템플릿이 받거나 하여 HTML(또는 XML)로 나오고,
이것은 다시 CSS와 HTML5 위짓 등으로 출력되어 브라우저에 멋지게 보입니다.
여기에서 또 ORM 이라는 용어가 나오는데 이것은 Object Relational Mapping 으로서
어떤 언어의 객체 (Class)가 해당 RDB의 테이블이 되고 이 객체 인스턴스가 하나의 Row가
되는 식으로 작동을 한다고 이해하면 되겠습니다.
(Python은 SQLAlchemy 라는 유명한 ORM이 있습니다)
Java에서의 이런 ORM이 바로 iBatis라는 것을 많이 이용하는데,
myBatis 라는 것도 있더군요.
그 다음은 Maven이라는 것이 또 나왔습니다.
Maven은 프로젝트의 build 및 deploy 컴포넌트 이었습니다.
Ant가 단순 make 였다면 Maven은 필요패키지를 기술하면
해당 패키지가 원격 저장소에서 다운로드하여 읜존성까지 찾게되며
이것을 자체 패키지 build (WAR 생성)를 할 수도 있고
다시 원격 혹은 NEXUS라는 로컬 네트워크 저장소에 패키지를 등록할 수도 있습니다.
위와 같은 개념들을 모두 이해해야만 비로소 전체 흐름에 따라
Java로 웹 응용프로램을 만들고 있다... 라고 할 수 있겠네요...
다음은 실제로 돌리면서 알았던 것들입니다.
(주로 Maven 에 관련된 것이네요)
Maven은 pom.xml 파일에 사용할 라이브러리 dependency를 가지고 있는데
이것이 32bit, 64bit 혹은 다른 경우에 따라 원격 저장소에서
가져와서 참조하는데 쉽게 오류가 발생하고는 합니다.
아주 쉽게 푸는 방법은, 직접 jar 등의 라이브러리를 외부에서 특정 위치에 다운로드 하고

위와 같이 systemPath라고 직접 지정을 하는 방법입니다.
이것도 모르면 며칠이고 헤맵니다.

다음은 위와 같이 Maven이 디폴트로 해당 라이블러리 등을 다운로드하고 기록하는 곳의 위치입니다.
만약 처음 프로젝트를 구성하거나 한다면 해당 위치에 파일을 모두 삭제하고 새롭게 구성하십시오.

위와 같이 Maven Clean 또는 Maven>Update Project 등을 하시면 됩니다.
그런 다음에는,

Maven build... 를 눌러,

Goals에 package 를 넣고 Run 을 누르면 새롭게 Maven build를 하고,
(compile을 치면 compile만 됩니다)

위와 같이 war 파일이 BUILD SUCESS 됨을 알 수 있습니다.
위의 war 파일을 $CATALINA_HOME/webapps 에 넣고 tomcat을 다시 기동시키면
해당 웹응용프로그램이 실행됨을 알 수 있습니다.
이제는 APM에 대해 간단히 살펴보겠습니다.
Application Performance Monitoring 의 약자로서
국내에는 제니퍼 라는 회사가 유명하지요.
헌데 이렇게 꼭 돈을 내고서 APM을 할 수 있는 것은 아닙니다.
여러가지 대안 중에서 JavaMelody 라는 것이 있더군요.
(참고로 위의 모든 것은 이성권 이라는 분이 저 대신 작업하신 것을 저는 정리만...^^)

해당 홈페이지에 가서 zip을 다운로드 하고,

압축을 해제한 다음,

$CATALINA_HOME/lib 에 위의 두 파일을 복사해 넣습니다.
그런 다음,

$CATALINA_HOME/conf/web.xml 파일에
servlet 태그 위에 위와 같은 MONITORING 관련 정보를 넣습니다.
<!-- begin mach to MONITORING -->
<filter>
<filter-name>monitoring</filter-name>
<filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>monitoring</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>net.bull.javamelody.SessionListener</listener-class>
</listener>
<!-- end of mach to MONITORING -->
그리고 해당 웹의 http://localhost:8080/monitoring (포트는 다를 수 있음)이라고 접속하면

위와 같은 RRD 그래프가 잔뜩 보입니다.

하나의 그래프만 확인해 보면 위와 같구요...

그 아래에 위와 같은 항목들이 있는데,
위의 Statistics http - 1 day 그래프 하단에
34 hits/min on 54 requests 가 보이고 그 오른편에 Details 가 있습니다.
이 Details 를 누르면,

위와 같이 (왼편에 있는 URL 목록은 보안상 숨겼습니다)특정 URL 및 응답시간 등의 통계 정보를 확인할 수 있습니다.
만약 최적화를 위한 튜닝을 한다면 오래 걸리는 시간의 URL 부터 성능개선을 할 필요가 있겠지요.
기타 다른 것도 많이 있었습니다.
이렇게 하여 Java로 되어 있는 웹App 구성을 해 보았고,
간단히 build를 한 다음 성능 모니터링 까지 해 볼 수 있게 되었습니다.
어느 분께는 도움이 되셨기를....
덧글