\W.*System.out.println.*[;|\r]

요렇게 search 해서 지우자
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
NTP 를 사용하여 리눅스 시간 맞추는 방법

rdate -s time.bora.net


위와 같은 커맨드로 시간 동기화 가능하다
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
이것땜에 오늘 또 하루를 날렸다.. 바쁜때에는 꼭 예상 밖의 일들이 터져서 하루를 피곤하게 만든다.

며칠 전부터, 개발서버 AIX 환경에서 매 요청 마다 Exception 이 계속 발생했는데,
대충, Struts2 의 FileUploaderInterceptor 에서 부터 시작하고, 결국에는 NoSuchFieldException 을 throw 하게 되는 콜스택을 보이는 예외이다.

사실 동작하는데 크게 문제는 없지만, 여간 신경쓰이는게 아니어서 해결하려고, Struts2 와 내부에서 사용하는 xwork2 의 소스까지 빌드해가면서 찾아낸 결론은,

AIX 에서는 IBM JDK (JDK6) 와 xwork 와의 호환성에 문제가 있어,
struts.xml 이나 properties 에서, struts.i18n.reload 와 devmode 옵션을 false 로 주어야 한다


는 것이다.

좀더 깊숙히 원인을 분석해본 결과, struts2 가 사용하는 xwork2 라이브러리에서, ResourceBundle 을 사용하는데,
Struts 의 Dispatcher 에서 사용하는 xwork 의 클래스 중에서 (LocalizedText 였나.. 기억이..) java.util.ResourceBundle 을 사용한다.

이때, xwork 의 옵션으로, 리소스를 동적으로 갱신 시에 리로드 할 수 있는 옵션을 줄 수 있는데, struts2 에서는 Dispatcher 에서 struts.i18n.reload 옵션값을 읽어, xwork 에 설정하도록 한다.
이때 reload 옵션이 true 인 경우, 위와 같은 문제가 생기는데, 옵션이 true 이면, ResourceBundle 의 claerCache() 메소드를 호출하거나 하는게 아니라, Reflection 기능을 사용하여, ResourceBundle 의 내부 HashMap, 그것도 private 로 선언된 놈(멤버변수명: cacheList) 을 setAccessible(true)를 써가면서 까지 가져와 직접 clear() 를 호출하도록 하고 있다.

여기에서 문제가 생기는데, Sun 의 JDK 의 경우, 위 map 의 변수명이 cacheList 이지만, IBM 의 JDK 의 구현 소스는 내부적으로 많이 다르고, cacheList 라는 Field 변수 자체가 없다. 그래서 오류가 나는 것이다.

이 기능을 안쓰거나, xwork 소스를 수정하는 방법이 있겠는데, 나는 회피하는 방법을 쓰려고 struts.i18n.reload 를 false 로 struts.xml 의 constant 선언으로 값을 주었지만 먹지를 않았다. 그래서 결국 xwork 와 struts 를 소스로 받아 세팅값이 먹혔는지 보기 위해 maven 으로 빌드까지 해가면서 파악 해보니, struts.i18n.reload 값에 앞서, devmode 를 false 로 해줘야 하는것을 알 수 있었다.

결국은 저렇게 세팅하나 잘못 바꿔서 하루를 날려버리는 참 어처구니 없는 일을 저지르고 말았다..
그래도 Reflection 의 강력한 기능과 Struts2 의 내부를 조금이나마 더 들여다 볼 수 있는 기회이기도 했다는데에 만족하고 있다.

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

MessageContext messageContext = MessageContext.getCurrentContext();
HttpServlet servlet = (HttpServlet)messageContext.getProperty(HTTPConstants.MC_HTTP_SERVLET);
ServletContext servletContext = (ServletContext)servlet.getServletContext();

HttpSession session = (HttpSession)messageContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);

위와 같은 방식으로 가져올 수 있다
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

오늘 아주 이놈땜에 몇시간을 삽질했는지 모르겠다.. 하루가 다 갔다.
ANT 로 컴파일 하도록 하였는데, Task 중, Javac 태스크에, 옵션 하나가 지정이 안되어서 아주 고생했다.

바로, encoding= 옵션!
encoding="utf-8" 처럼 지정해주지 않으면, 코드 내에 한글 등 다국어는 커파일 당시 OS 의 언어 설정으로 먹는 듯 하다.

하루 종일, LANG=C 인 환경에서, 필터 빼고 넣고 별 짓을 다하다가 찾아냈다..
반드시 주의하자!~ 다국어 지원 필요한 경우, .java 파일 자체 인코딩은 당연히 UTF-8 이어야 하고,
컴파일러에게도 인코딩을 지정해 주어야 한다!~
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
Tomcat 에서는 server.xml 과 context.xml 에 리소스와 리소스 링크 추가해주면 잘 찾는데,
이상하게 Jeus 에서는 계속 네이밍 못찾는다고 나와서 요것조것 해보다 보니,

Jeus 에서는 web.xml 에 resource-ref 를 추가 안해주면 못찾는구나.. 라는 결론이 나왔다.

아래와 같이 Jeus 와 web.xml 을 모두 세팅 해줘야 하더라..

1. JEUSMain.xml 설정

  
   <resource>
      <data-source>
         <database>
            <vendor>mysql</vendor>
            <export-name>cserverdb</export-name>
            <data-source-class-name>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</data-source-class-name>
            <data-source-type>ConnectionPoolDataSource</data-source-type>
            <stmt-query-timeout>60000</stmt-query-timeout>
            <property>
               <name>DriverClassName</name>
               <type>java.lang.String</type>
               <value>com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</value>
            </property>
            <property>
               <name>URL</name>
               <type>java.lang.String</type>
               <value>jdbc:mysql://192.168.1.X:3306/cserverdb?autoReconnect=true</value>
            </property>
            <property>
               <name>User</name>
               <type>java.lang.String</type>
               <value>XXXXXX</value>
            </property>
            <property>
               <name>Password</name>
               <type>java.lang.String</type>
               <value>XXXXXX</value>
            </property>
            <action-on-connection-leak>Warning</action-on-connection-leak>
            <connection-pool>
               <pooling>
                  <min>2</min>
                  <max>30</max>
                  <step>1</step>
                  <period>3600000</period>
               </pooling>
               <wait-free-connection>
                  <enable-wait>true</enable-wait>
               </wait-free-connection>
            </connection-pool>
         </database>
      </data-source>
   </resource>

2.WAR 의 web.xml 에 아래와 같이 추가

	
       <resource-ref>
		<description>Datasource Contents Server</description>
		<res-ref-name>cserverdv</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>

3. iBatis 의 sqlmapConfig.xml 을 아래와 같이 설정
	<transactionManager type="JDBC" >
		<dataSource type="JNDI">
			<property name="DataSource" value="cserverdb"/>
		</dataSource>
	</transactionManager>

위에서, DataSource 에, java:comp/env/cserverdb 가 아니고, 그냥 cserverdb 임에 반드시 주의하자~! 요것땜에 많이 헤맸네~?

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
이번에 Tomcat / Eclipse 에서 개발하던 환경이 Jeus 로 올라가면서 동작하지 않아 난감한 상황이었는데,
결국 사소한 문제 때문에 작동하지 못한거여서 참으로 황당하네..

struts.xml 에서, package 정의와 include 시에 아래와 같은 사항에 주의해야 하겠다.

1. namespace 에 root 를 지정할 경우 주의점

 package 의 attribute 중에, namespace 를 지정할 때에, root 요소를 지정하는 경우, namespace="/" 가 아니라
 namespace="" 로 주어야 한다.
 즉, 값 안에 / 가 있어서는 안된다.

2. include 시에 주의 점

include file="/demo/db/user-navi.xml" 과 같이 해서는 안되고,
include file="demo/db/user-navi.xml" 과 같이, 앞의 "/" 를 빼도록 한다.
아직 테스트는 안했지만, 앞에 / 가 붙으면 절대 경로로 찾는 듯 하다. 절대경로 찾을 시 root 는 system 루트가 되는 듯 함.

이상 사소한 것들이지만, 작동이 안되는 우를 범하지 말도록 하자.




반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
Oracle 은 뭐 대충 Webadmin 에서 입력하면 되는데, MySQL 은 조금 헤멨다..

Database Name, Server Name, User, Password 등을 Webadmin 의 Form 필드에 넣지 말고,
아래의 커스텀 Property 부분에만 지정해주니 잘 된다.

참고로, 아래에 세팅된 예제 나간다.

Jeus 4.x 대 부터 모두 통용되는 듯 하다.

<resource>
   <data-source>
      <database>
         <vendor>mysql</vendor>
         <export-name>cserverdb</export-name>
         <data-source-class-name>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</data-source-class-name>
         <data-source-type>ConnectionPoolDataSource</data-source-type>
         <stmt-query-timeout>60000</stmt-query-timeout>
         <property>
            <name>DriverClassName</name>
            <type>java.lang.String</type>
            <value>com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</value>
         </property>
         <property>
            <name>URL</name>
            <type>java.lang.String</type>
            <value>jdbc:mysql://192.168.1.X:3306/cserverdb?autoReconnect=true</value>
         </property>
         <property>
            <name>User</name>
            <type>java.lang.String</type>
            <value>XXXXXXXX</value>
         </property>
         <property>
            <name>Password</name>
            <type>java.lang.String</type>
            <value>XXXXXXXX</value>
         </property>
         <action-on-connection-leak>Warning</action-on-connection-leak>
         <connection-pool>
            <pooling>
               <min>2</min>
               <max>30</max>
               <step>1</step>
               <period>3600000</period>
            </pooling>
            <wait-free-connection>
               <enable-wait>true</enable-wait>
            </wait-free-connection>
         </connection-pool>
      </database>
   </data-source>
</resource>

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

Jeus 에는 BASEPORT 를 기반으로 하여 자동 계산되어 지정되는 포트가 많은 편이다.
기본 포트를 포함하여, 자동 지정되는 포트들은 아래와 같다.

Jeus 6 기준임

 이름  기본 포트  설명
 BASEPORT  9736  JEUS Manager가 JNDI 서비스 및 운영을 위해 필요한 기본 서비스 포트
 COS Naming Server Port  BASEPORT + 4 (e.g. 9740)  COS Naming 서비스를 위해 사용하는 포트
 WebAdmin Port  BASEPORT + 8 (e.g. 9744)  /webadmin 으로 접속
 엔진 컨테이너 BASEPORT  BASEPORT + 15 + (엔진 컨테이너 ID * 10)  엔진 컨테이너별 기본 서비스 포트
 ORB Port  엔진 컨테이너 BASEPORT + 1  IIOP 포트
 ORB SSL Port  엔진 컨테이너 BASEPORT + 2  IIOP SSL 포트
 ORB SSL Mutual Authorization Port  엔진 컨테이너 BASEPORT + 3  IIOP 상호인증 포트
 HTTP Port  8088  
 EJB RMI Port  엔진 컨테이너 BASEPORT + 7 or 엔진 컨테이너 BASEPORT  EJB를 접근하기 위한 RMI 포트. use-baseport 설정이 있는 경우 Container BASEPORT를 사용
 JMS 엔진 Port  9741 or 엔진 컨테이너 BASEPORT  JMS 서비스 포트. oneport 설정시 Container BASEPORT를 사용



 
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

Bash 프롬프트 변경 옵션 중 아주 필수적인 것들이다.

export PS1="$" 처럼, PS1 환경변수를 정의하면 되며, 값으로 아래 것들 온다.

\T : 시각 (12h)
\t : 시각 (24h)
\u : 유저
\w : 현재 디렉토리
\W : 현재 디렉토리 마지막 경로명
\h : 호스트이름 (단축)
\H : 호스트 이름
\s : 쉘 이름
\v : bash 버전
\V : bash 버전 + Patch 버전
\! : History 숫자
\\ : \ 문자
\a : 삐 소리

예를 들면, export PS1="\u@\w>" 과 같이 설정한다.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,