"올바른 성장과 따뜻한 나눔"이 있는 넥스트리

WAS를 갈아타고 작업할 때 마다 항상 잊어버린다. 그리고 이놈의 tomcat은 버전마다 이런 기본 설정 방법이 달라지니...
점점 떨어지는 기억력은 어쩔 수 없으니 블로그에 의지하고 남기는 수 밖에...
---

Tomcat에서 Datasource 설정하기
Tomcat에서는 JNDI 리소스를 등록하는 방법이 크게 2가지가 있다. 하나는 모든 web context가 사용할 수 있는global 리소스이고 다른 하나는 해당 context에만 적용되는 리소스이다.

Global 리소스 등록방법
${CATALINA_HOME}/conf/server.xml에 다음과 같이 추가

   <Server port="8005" shutdown="SHUTDOWN"> 
   ... 
  <GlobalNamingResources> 
    <!-- Editable user database that can also be used by 
         UserDatabaseRealm to authenticate users 
    --> 
    <Resource name="UserDatabase" auth="Container" 
              type="org.apache.catalina.UserDatabase" 
              description="User database that can be updated and saved" 
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
              pathname="conf/tomcat-users.xml" /> 
    
    <Resource name="jdbc/OracleDS" auth="Container" type="javax.sql.DataSource" 
          username="xxx" 
          password="xxx" 
          driverClassName="oracle.jdbc.driver.OracleDriver" 
          url="jdbc:oracle:thin:@localhost:1521:XE" />
 
          
  </GlobalNamingResources> 
 ...

각 web context에서 global 리소스를 사용하기 위해서는 각 context의 <ResourceLink/> 태그로 연결하여야 한다. 다음은 모든 context에 연결하는 방법이다.

${CATALINA_HOME}/conf/context.xml에 다음과 같이 추가

 <Context> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <ResourceLink 
            name="jdbc/OracleDS" 
            global="jdbc/OracleDS" 
            type="javax.sql.DataSource" 
          /> 
...


Context 리소스 등록방법
tomcat 6.x에서는 각 WAR 디렉토리의 /META-INF/context.xml 파일에 해당 context 설정 정보를 담고 있다. 즉 WAR 파일 내에 context.xml 이 있어야 한다. 편하긴 한데...

예) bcf가 context라면

${CATALINA_HOME}/webapps/bcf/META-INF/context.xml 에 다음과 같이 추가

<Context antiResourceLocking="false" privileged="true"> 
<Resource name="jdbc/OracleDS" auth="Container" type="javax.sql.DataSource" 
          username="xxx" 
          password="xxx" 
          driverClassName="com.mysql.jdbc.Driver" 
          url="jdbc:mysql://localhost:3306/bcf" />
 
</Context>


JNDI로 접근하기
다른 JNDI 룩업과 마찬가지로 다음과 같은 이름로 접근하면 된다. 그냥 jdbc/OracleDS 이런식으로는 접근할 수 없다. 

java:comp/env/jdbc/OracleDS


정리
Context 리소스 등록방법이 context.xml을 war/MET-INF 밑에 넣으면 되기 때문에 더 편하기는 한데 war에 저 파일이 배포되어야해서 좀 찜찜하다. (datasource 정보가 WAR 형상관리되어야 한다?)

따라서 운영환경에서는 global 리소스를 이용하는 방법이 나을 듯 하다. (역시 비밀번호는 노출이 되는군 ㅠㅠ)


출처 -  http://greatkim91.tistory.com/42 

Posted by linuxism
,
Tomcat 4.1 ROOT directory

kenu
2002-09-09 12:14오전

이번 강좌는 Tomcat 4.1.10 버전의 디렉토리를 변경하는 것입니다. Tomcat 4.0 버전의 경우 크게 차이가 없이 동일하게 적용하시면 될 것입니다. Tomcat 3 에서 ROOT 를 바꾸는 것과는 차이가 있습니다. 하지만 알고 보면 별 것 없습니다. 이번 강좌에서 알아 볼 것은 다음과 같습니다.
Tomcat 4.1 디렉토리
최초 설치시 파일의 위치
컨텍스트 추가하기
ROOT 디렉토리 변경하기

		


ROOT 디렉토리 변경을 마지막으로 뺀 이유는 이렇게 하는 것이 크게 의미가 없기 때문입니다. Tomcat 환경이 익숙해져서이겠지요. 처음 Tomcat을 시작했을 때는 왜이리 디렉토리가 쳐박혀 있나 싶었는데, 이제는 바꾸는 일이 더 일처럼 생각이 되네요. ^^; Tomcat 의 디렉토리에 대해서 살펴보기로 하겠습니다. 

Tomcat 4.1 을 처음 설치했을 때 디렉토리구조는 다음과 같습니다. Tomcat 4.1 이 설치된 디렉토리의 webapps 디렉토리 아래에 ROOT 가 jsp, html, 등의 파일들이 놓이는 위치입니다. 

ROOT 아래에 있는 WEB-INF 디렉토리는 ROOT 컨텍스트에 대한 정보를 담고 있는 web.xml 이라는 deploy descriptor 파일이 있습니다. 또한 서블릿과 빈즈, 이 컨텍스트에서만 사용되는 jar 파일들이 서브디렉토리에 위치하게 됩니다. servlet과 beans 그리고 helper class 들과 같은 class 파일들과 properties 파일들은 WEB-INF/classes 디렉토리에 위치하게 됩니다. jdbc driver 등의 jar 파일들은 WEB-INF/lib 디렉토리에 놓습니다. 처음 설치를 하면 이 두개의 디렉토리는 보이지 않습니다. 그렇다면 만들면 됩니다. 테스트를 위해서 examples/WEB-INF/classes 아래에 있는 HelloWorldExample.class 서블릿 파일을 ROOT/WEB-INF/classes 아래에 복사해 봅니다. 이때 주의할 것은 HelloWorldExample.java 서블릿 소스를 보시면 LocalStrings 라는 properties 파일을 필요로 한다는 것을 알 수 있습니다. 따라서 LocalStrings.properties 파일이 없다면 에러가 나오게 됩니다. 같이 복사를 한 뒤에 Tomcat 4.1 을 재시동해서 브라우저에서 http://localhost:8080/servlet/HelloWorldExample 주소로 확인해봅니다. 

Context is a web application. 이라고 했습니다. 하나의 컨텍스트를 추가하는 것은 웹 어플리케이션을 하나를 추가하는 것입니다. Tomcat4.1 의 conf 디렉토리에 있는 server.xml 파일을 텍스트편집기로 엽니다. 아래 부분을 파일에서 찾아보십시오. Tomcat 의 Root 컨텍스트는 주석으로 감싸져있고, 그 아래에 /examples 컨텍스트가 보입니다. docBase 는 하드 디스크상의 경로명이고, 해당 Host 의 appBase(="webapps") 에 대해 상대 경로 입니다.
conf/servlet.xml
...

        <!-- Define properties for each web application.  This is only needed
             if you want to set non-default properties, or have web application
             document roots in places other than the virtual host's appBase
             directory.  -->

        <!-- Tomcat Root Context -->
        <!--
          <Context path="" docBase="ROOT" debug="0"/>
        -->

        <!-- Tomcat Examples Context -->
        <Context path="/examples" docBase="examples" debug="0"
                 reloadable="true" crossContext="true">
          <Logger className="org.apache.catalina.logger.FileLogger"
                     prefix="localhost_examples_log." suffix=".txt"
        	  timestamp="true"/>
...

		


okjsp 라는 컨텍스트를 추가해 보겠습니다. c: 드라이브에 okjsp 디렉토리를 만듭니다. 이곳을 새로운 컨텍스트의 Root 디렉토리로 정합니다. 주의할 점은 <Context> 태그는 xml 의 문법을 준수 하여야 되기 때문에 <Context ... /> 와 같이 단독태그로 끝을 닫아주거나 <Context ....></Context> 로 막아주어야 됩니다. Tomcat 을 재시동합니다. reloadable 이라는 속성은 servlet reloading 에 관한 속성입니다.
conf/servlet.xml
...

        <!-- Define properties for each web application.  This is only needed
             if you want to set non-default properties, or have web application
             document roots in places other than the virtual host's appBase
             directory.  -->

        <!-- Tomcat Root Context -->
        <!--
          <Context path="" docBase="ROOT" debug="0"/>
        -->

        <!-- Tomcat okjsp Context -->
        <Context path="/okjsp" docBase="c:/okjsp" debug="0"
                 reloadable="true"/>

        <!-- Tomcat Examples Context -->
        <Context path="/examples" docBase="examples" debug="0"
                 reloadable="true" crossContext="true">
          <Logger className="org.apache.catalina.logger.FileLogger"
                     prefix="localhost_examples_log." suffix=".txt"
        	  timestamp="true"/>
...

		


다음 파일을 c:\okjsp 디렉토리에 넣고 브라우저에서 호출해봅니다. 새로운 컨텍스트에 servlet 을 복사하고 브라우저에서 불러봅니다. 루트컨텍스트의 WEB-INF/ 아래있는 모든 파일과 디렉토리를 c:/okjsp/WEB-INF/ 에 복사한 뒤에 브라우저에서 주소를 http://localhost:8080/okjsp/servlet/HelloWorldExample 로 호출하면 됩니다.
realpath.jsp
<%=request.getRealPath("/") %>

		


이제는 ROOT 디렉토리를 바꾸는 작업을 해보겠습니다. Tomcat4.1 의 conf 디렉토리에 있는 server.xml 파일을 텍스트편집기로 엽니다. 아래 부분을 파일에서 찾아보십시오. 주석 부분을 읽어보시면 아시겠지만, 웹 어플리케이션 기본 설정을 변경하기 원하면 바꾸라고 되어있습니다.
conf/servlet.xml
...

        <!-- Define properties for each web application.  This is only needed
             if you want to set non-default properties, or have web application
             document roots in places other than the virtual host's appBase
             directory.  -->

        <!-- Tomcat Root Context -->
        <!--
          <Context path="" docBase="ROOT" debug="0"/>
        -->

        <!-- Tomcat Examples Context -->
        <Context path="/examples" docBase="examples" debug="0"
                 reloadable="true" crossContext="true">
          <Logger className="org.apache.catalina.logger.FileLogger"
                     prefix="localhost_examples_log." suffix=".txt"
        	  timestamp="true"/>
...

		


c: 드라이브의 jsphome 이라는 디렉토리를 ROOT로 잡아보도록 하겠습니다. ( 아주 오랜만입니다. ^^) c:\jsphome 디렉토리를 만든 후에 아래처럼 변경합니다. C:/jsphome 에서 디렉토리 구분표시는 ms 의 \ 가 아니라 unix 스타일인 /(슬래시) 표시를 합니다. 이 아래에 WEB-INF 디렉토리를 만들고 web.xml 파일을 복사해 놓습니다. 그리고 classes 디렉토리와 lib 디렉토리를 만들어 놓고, tomcat 을 재시동합니다. 이제 ROOT 를 바꾸는 설정법은 끝났습니다. 한가지 속성을 설명하려합니다. reloadable="true" 라는 속성입니다. servlet 이 변경되었을 경우 이 Context 전체를 다시 불러오도록 하는 속성입니다. 개발중에는 "true" 라는 속성으로 개발완료 후에는 "false" 로 하시는 것이 성능면에서 도움이 됩니다. servlet reloading 은 파일의 갱신날짜를 비교하기 때문입니다.
conf/servlet.xml
...

        <!-- Define properties for each web application.  This is only needed
             if you want to set non-default properties, or have web application
             document roots in places other than the virtual host's appBase
             directory.  -->

        <!-- Tomcat Root Context -->
          <Context path="" docBase="C:/jsphome" debug="0" reloadable="true" />

        <!-- Tomcat Examples Context -->
        <Context path="/examples" docBase="examples" debug="0"
                 reloadable="true" crossContext="true">
          <Logger className="org.apache.catalina.logger.FileLogger"
                     prefix="localhost_examples_log." suffix=".txt"
        	  timestamp="true"/>
...

		


설정이 다 끝났으면 톰캣을 재시동하고, 브라우저에서 위에 있는 realpath.jsp 파일을 호출해서 확인해봅니다. 

관련 사이트
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/config/context.html 
Tomcat 4.1 Context 문서
http://210.219.132.169/bbs?act=VIEW&bbs=bbs4&seq=23530 
Tomcat 4.1.12 버전에서 서블릿 접근이 안되는 경우


Posted by linuxism
,
   

Context를 생성하는 방법은 크게 두가지로 나눌 수 있는데요.
첫번째는, CATALINA_HOME/conf/server.xml 파일을 수정하는 방법과
두번째는, CATALINA_HOME/conf/Catalina/localhost/ 디렉토리에 context xml파일을 생성하는 방법이 있습니다.
미리 말해두자면, 두번째 방법이 추천하는 방법입니다.

첫번째, server.xml을 수정하는 방법은
server.xml파일을 열어서 <Host>태그를 찾아 그 사이에 <Context>태그를 추가 하는 겁니다.
예를 들면 아래와 같이 됩니다.

 
  1. <Host name="localhost" ......>  
  2. ...   
  3. <Context path="/myContext" docBase="c:\myContext\webapps"  
  4.         debug="0" privileged="true">  
  5. </Context>  
  6. ...  


위의 path 속성에는 생성하고자 하는 Context의 이름을 지정하구요,

나중에 Http URL을 통해 접근할때 hostname 바로 다음에 위치하게 되요.
docBase 속성은 서비스 될 실제 웹파일(html, gif, jsp)들이 위치하는 디렉토리 입니다.

두번째, context xml을 추가 하는 방법은
CATATLINA_HOME/conf/Catalina/localhost 디렉토리에 context이름으로 xml파일을 생성해서 아래의 내용과 같이 기재하시면 됩니다.

<Context path="/myContext" docBase="c:\myContext\webapps"
        debug="0" privileged="true">
</Context>


두번째 방법이 당연히 쉽고 편하겠죠.
왜냐하면 server.xml을 잘못 건드리면 뭐가 잘못되었는지 찾아야 하는 불편이 있지만, 새로 파일을 만들게 되면 잘 안되었을때 지우고 다시 만들면 되니까요.

이렇게 생성된 context의 docBase에는 서비스할 웹파일은 물론 WEB-INF 라는 디렉토리가 반드시 존재해야 하구요. 그 안에는 web.xml이라는 파일이 존재해야 하는것 쯤은 아시겠죠?
 

WEB-INF/classes,lib 디렉토리에는 context에서 사용할 class 파일이나 jar파일을 저장하면 되는데요. 여기에 위치한 class와 jar 파일은 별도의 CALASSPATH를 지정하지 않아도 접근이 가능합니다.

그런데 만약 어떠한 이유에서든 WEB-INF/classes, lib 디렉토리에 class, jar파일을 위치하지 않으려면 CLASSPATH에 지정해도 Tomat은 찾지 못하게 됩니다.
그 이유는 Tomcat이 System class loader를 이용하여 서비스 할 Class들을 로딩하지 않기 때문인데요.

그래서 Tomcat은 용도별로 3군데의 classes, lib 디렉토리를 가지게 하고 그곳에 적절히 class 또는 jar파일을 위치하게 하고 있어요. 그게 어딘지는 아래에 표로 설명했습니다.

 CATALINA_HOME/server/lib, classes  Tomcat 엔진에서 사용할 class, jar
 CATALINA_HOME/common/lib, classes  Tomcat 내부적으로 사용하거나, web applicatoin이 사용할 class, jar (예:JDBC Driver)
 CATALINA_HOME/shared/lib, classes  모든 Web Application들이 사용할 class, jar

이와 같이 3곳과 context 내의 WEB-INF/classes, lib에 자신이 만들 context에서 사용할 class와 jar파일을 위치 시키면 되는 데요. 

또 어떠한 이유에서 지정된 디렉토리에 class와 jar파일을 옮겨 둘 수 없는 경우가 있을 겁니다.
그럴때는 CATALINA_HOME/conf/catalina.properties 라는 파일을 수정해서 CATALINA_HOME 디렉토리 영역 바깥 어디에 있는 class나 jar파일도 지정해 줄수가 있어요.

calalina.properties 파일을 열어 보면 주석으로 장황하게 기재되어 있지만, 실제로는 아래와 같이 3줄만이 있을 뿐입니다.

common.loader=${catalina.home}/ <..생략..> ${catalina.home}/common/lib/*.jar
server.loader=${catalina.home}/serve<..생략..>${catalina.home}/server/lib/*.jar
shared.loader=${catalina.base}/share<..생략..>,${catalina.base}/shared/lib/*.jar


위의 3줄은 앞서 설명한 3군데의 디렉토리를 지정하고 있구요. 각 영역의 의미에 맞는 class나 jar파일을 해당 라인 끝에 연결해서 원하는 디렉토리의 class나 jar파일을 지정해 주시면 됩니다.
보시면 아시겠지만, 앞서 설명한 3군데의 디렉토리도 이곳 catalina.properties파일에 지정되어 있죠. 무슨 의미인지 아시겠죠?

끝으로, 힌트 한가지.
내가 생성할 Context 의 path(이름)을 그냥 루트(/)로 하고 싶으면, 별도의 context를 만드실 필요 없이 CATALINA_HOME/webapps/ROOT 디렉토리를 context의 docBase로 사용하시면 되구요.

별도의 디렉토리로 docBase를 지정하고 싶다면, context xml파일을 생성할때 path 속성을 공백으로 두시면 됩니다. 이렇게요.

<Context path="" docBase="c:\myContext\webapps"
        debug="0" privileged="true">
</Context>



자 오늘은 여기 까지 입니다.

 

출처 : http://rainer.tistory.com/31





Posted by linuxism
,