Symbolic Link

12.OS 2011.12.06 10:21

이 간단한 것을 왜 까먹는지 모르겠다

ln -s [resource] [WHATIWANT] 
신고

'12.OS' 카테고리의 다른 글

Windows Powershell font 바꾸기  (0) 2013.06.11
linux에서 grep으로 parsing 및 group by 하자  (0) 2013.06.04
Symbolic Link  (0) 2011.12.06
Fedora MySQL 설치  (0) 2011.06.15
AWS EC2 ubuntu 에서 Apache httpd + Tomcat 구성하기  (0) 2011.06.14
Fedora 14 및 samba 설치  (0) 2011.06.01
Posted by Stewie

Tomcat

Tomcat은 servlet engine의 한 형태로 오픈 소스 이다. renderging page 및 core적인 성격의
servlet engine의 역할을 수행하던 초기 버전에 비해 현재 여러가지 부가 기능 들이 추가되면서
그 형태가 약간 비대해 졌다. 하지만 최근 웹 프로그래밍의 추세를 보면 client-side의 scripting에 
보다 많은 비중이 실리고, back-end의 servlet은 그 역할이 순수히 controller 기능을 수행하는
형태로 변화하고 있었다.

Jetty

servlet engine의 본연의 기능만에 집중한 형태인 Jetty는 tomcat보다 빠르고 tomcat이 지원하는
간단한 부가적인 기능 몇개를 지원한다. 하지만 documentation이 굉장히 형편없고 현재 jetty 서버의 
ownership에 대한 문제가 있으며 embeded 형태로 servlet engine을 구동하기엔 약간은 많은 lib와
xml 설정 파일들이 필요하다

Winstone

Hudson에서 사용하는 servlet engine으로 Jetty의 documentation 등의 단점은 어느 정도 커버해준다.
embeded 형태로 사용하기위해 필요한 것은 jar 파일 하나며 단 소스 몇 라인이면 충분하다.
필요한 설정값은 map형태에 key-value 쌍으로 담기만 하면 된다. 물론 websocket 지원이라 던지
licence 등의 미흡한 점은 있지만 간단한 WAR파일을 WAS로 구동시키기에는 더 쉽고 더 편리한
servlet engine이다.

maven pom.xml

<dependency>
<groupId>net.sourceforge.winstone</groupId>
<artifactId>winstone</artifactId>
<version>0.9.10</version>
</dependency>

sample source to start

Map config = new HashMap();
config.put(“webroot”, “webapps/my-killer-app/”);
Launcher.initLogger(config);
Launcher winstone = new Launcher(config);

command line 실행

java -jar winstone.jar --webroot [your-exploded-war-base-directory-or-war-file-location] 

다음의 기능들이 있다.

-HTTPS support
-JAAS support
-Apache/JK support
-Cluster support
-Hot-redeploy of servlet classes
-JNDI support
신고
Posted by Stewie

웹어플리케이션이 구동중에 MessageSource가 변경되는 경우 ReloadableResourceBundleMessageSource를 이용하면 ResourceBundleMessageSource와 달리
재시작을 하지 않아도 된다. 하지만 이 방법은 개발시에는 유용하지만 실제 운영 서버에서는 다른 기타 문제가 발생할 수 있기 때문에 
비추하는 방법이라 한다.뿐만 아니라 ReloadableResourceBundleMessageSource에서 사용하는 MessageSource 파일은 classpath안에 
두지 않아야 한다. 그 이유는 애플리케이션 서버는 클래스패스에 있는 모든 리소스를 캐싱하기 때문이라 한다. 그렇기 때문에

<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/message-sample</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8" />
<property name="cacheSeconds">
<value>60</value>
</property>
</bean>

위처럼 정의한다면, 로케일을 기반으로 messages_<LID>.properties 와 errors_<LID>.properties 를 찾게 된다.
단 classpath 대신 WEB-INF/message/message-sample 과 같은 위치에 두는 것이 좋다


MessageSource의 사용은

예를 들어 message-sample_en_US.properties가

message = hi my name is {0} 

형태로 되어있다고 했을때

@Inject
MessageSource messagesource

messageSource.getMessage("message", new String[] {"stewie"}, "no surch", Locale.US);

같은 메서드의 결과가 hi my name is stewie 와 같이 나온다고 한다.

http://www.javajigi.net/pages/viewpage.action?pageId=207061054
http://jjaeko.tistory.com/18

신고
Posted by Stewie
TAG Spring

SimpleMappingExceptionResolver는 HandlerExceptionResolver의 구현체로서 예외가 발생하였을때
그 종류에 따라 에러 페이지를 표시한다던지, 혹은 다른 Controller를 호출하여 후속 작업을
가능하도록 하게 하여 준다. 단, view layer에서 발생하는 예외는 이름 그대로 HandlerException
Resolver이기 때문에 처리 할 수 없다.

<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="EXCEPTION 종류 class">view/error</prop>
</props>
</property>
</bean>

만약, 해당 에러 페이지로 이동하기 전 log를 남기고 싶다면 warnLogCategory property를 이용하여
남길 수 있다. 

<property name="warnLogCategory" value="abcd"/>



또 다른 방법으로는,
@Controller 가 명시된 Controller에서 @ExceptionHandler(Exception.class)을 표시한 메서드를 구현하면
실질적으로 그 컨트롤러 안에 예외가 발생하였을 경우 해당 메서드가 실행되게 된다.

    @ExceptionHandler(Exception.class)
    public void testException(Exception ex) {
        // ...
    }
    
뿐만 아니라 @ResponseStatus 태그도 같이 사용할 수 있어 Response Status Code를 전달할 수도 있다.

    @ExceptionHandler(Exception.class)
    @ResponseStatus(value=HttpStatus.NOT_FOUND)
    public void testException(Exception ex) {
        // ...
신고

'09.Framework' 카테고리의 다른 글

JUnit4 테스트 Datasource Rollback  (0) 2011.12.06
Spring Framework / ReloadableResourceBundleMessageSource  (0) 2011.08.16
Spring MVC SimpleMappingExceptionResolver  (0) 2011.08.16
Spring 3.0 에서 Quartz 설정  (0) 2011.08.09
iBatis 동적 SQL 작성  (0) 2009.10.25
WebWork in Action  (0) 2009.10.07
Posted by Stewie
TAG Spring
특정 파일이나 디렉토리를 필터링 할 필요가 있을 때 사용하는
interface FileFilter와 FilenameFilter

File class는 

- public String[] list( FilenameFilter filter );
- public File[] listFiles( FileFilter filter );
- public File[] listFiles( FilenameFilter filter );

와 같은 3개의 메서드를 가지고 있는데 여기서는 FilenameFilter를 이용한 예제를 보면

File file = new File( "c:/temp" );
File[] fileList = file.listFiles( new FilenameFilter() {
  public boolean accept( File dir, String name ) {
  return name.endsWith( ".dat" );
  }
} );

와 같이 accept 메서드를 구현하여 filter결과를 boolean 형식으로 리턴하면 된다.
신고

'01.Java' 카테고리의 다른 글

Exception Handling vs. Error Logging  (0) 2012.02.14
JUnit Test. 그리고 Stub, Mock  (0) 2011.12.27
java.io.FilenameFilter 활용  (0) 2011.08.09
[예시] byte단위로 잘라서 String 만들기  (0) 2010.11.25
Method Class  (0) 2010.06.07
Aspect Oriented Programming (AOP)  (0) 2010.01.21
Posted by Stewie

Spring 3.0 에서 제공하는 TaskExecutor와 TaskScheduler도 있지만 Quartz를 사용하는 경우도 있다.

필수 dependency
               
                <!-- Quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency> 

가장 큰 설정은 trigger와 listener

1. Trigger

org.springframework.scheduling.quartz.CronTriggerBean
org.springframework.scheduling.quartz.SimpleTriggerBean

2종류가 있는데 cronjob스럽게 돌리려면 CronTrigger를 그렇지 않고 인터벌 및 간단한 설정으로
스케쥴러를 구동시키려면 SimpleTrigger를 사용하는 것이 좋다.
 
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="testJob"/>
<property name="cronExpression" value="0/1 * * * * ?"/>
</bean>

 다음과 같이 등록하고

<bean id="testJob" class="org.springframework.scheduling.quartz.JobDetailBean"
     p:jobClass="com.test.testDaemon">
<property name="jobDataAsMap">
 <map>
   <entry key="test1Service">
    <ref bean="test1Service"/>
   </entry>
   <entry key="test2Service">
    <ref bean="test2Service"/>
   </entry>
 </map>
</property>
</bean> 

다음과 같이 설정하면 된다. testDaemon 에서 쓰이는 bean들은 map형태로 프로퍼티를 등록하면 된다. (setter구현 必)


  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="testTrigger"/>
</list>
</property>
<property name="quartzProperties">
<props>
    <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
    <prop key="org.quartz.threadPool.threadCount">3</prop>
    <prop key="org.quartz.threadPool.threadPriority">4</prop>
    <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
    <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean>


SchedulerFactoryBean에 다음과 같이 tiggers를 등록한다. quartzProperties에는 thread의 갯수 등의 각종 설정변수 들이 있다.

 
2. Listener 
Quartz에서 제공하는 TriggerListener를 구현하면 각  fire->execute-> complete 혹은 misfire되는 시점에 로깅을 남길 수 있다. 다음은 Anyframe 사이트에 있는 TriggerListener 구현체 중 하나이다.

 public class GlobalTriggerListener implements TriggerListener {
    Log logger = LogFactory.getLog(GlobalTriggerListener.class);
    String listenerType = "Non global";

    public void setListenerType(String listenerType) {
        this.listenerType = listenerType;
    }

    public void triggerFired(Trigger trigger, JobExecutionContext ctx) {
        logger.info("Scheduled " + trigger.getJobName() + " Fired!!");
    }

    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext ctx) {
        logger.info("Scheduled " + trigger.getJobName() + " Executed!!");
        return false;
    }

    public void triggerComplete(Trigger trigger, JobExecutionContext ctx, int arg) {
        logger.info("Scheduled " + trigger.getJobName() + " Completed!!");
    }

    public void triggerMisfired(Trigger trigger) {
        logger.error("Scheduled " + trigger.getJobName() + " Misfired!!");
    }

    public String getName() {
        return "GlobalTriggerListener";
    }
}

SchedulerFactoryBean 설정에서 다음과 같이 Listener를 등록할 수 있다.

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggerListeners" ref="triggerListener"/> <property name="globalTriggerListeners" ref="globalTriggerListener"/>
<property name="quartzProperties">
<props>
    <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
     <prop key="org.quartz.threadPool.threadCount">3</prop>
     <prop key="org.quartz.threadPool.threadPriority">4</prop>
     <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
     <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean> 
신고

'09.Framework' 카테고리의 다른 글

Spring Framework / ReloadableResourceBundleMessageSource  (0) 2011.08.16
Spring MVC SimpleMappingExceptionResolver  (0) 2011.08.16
Spring 3.0 에서 Quartz 설정  (0) 2011.08.09
iBatis 동적 SQL 작성  (0) 2009.10.25
WebWork in Action  (0) 2009.10.07
Hibernate VS iBatis  (0) 2009.09.23
Posted by Stewie
여러가지 옵션을 제외하고 설정에는 크게 2종류가 있다.
 
Forward Proxy



예)
ProxyRequests On
ProxyVia On

<Proxy *>
Order deny,allow
Deny from all
Allow from internal.example.com
</Proxy>

Order -> 명령어의 순위 deny->allow
Deny -> 프록시 서버 접근 제한
Allow -> 서버 접근 허용
==> 모든 경우의 수를 제한 하지만 -> internal.example.com 만 허용
 

Reverse Proxy
 

예)
ProxyPass /mirror/foo/ http://backend.example.com/
ProxyPassReverse /mirror/foo/ http://backend.example.com/
ProxyPassReverseCookieDomain backend.example.com public.example.com
ProxyPassReverseCookiePath / /mirror/foo/

local server 가 http://example.com이라고 가정하면 http://example.com/mirror/foo/bar 라는 요청이 들어오면
ProxyPass에 의해서 http://backend.example.com/bar로 요청이 변환 된다. 하지만 만약 backend.example.com 서버에서
http://backend.example.com/quux으로 redirect가 일어난다면 Apache는 client에게 redirect 응답을 보내기 이전에
ProxyPassReverse 옵션에 의해 http://example.com/mirror/foo/quux로 변환하여 전달하게 된다.

mod_proxy_balancer
-loadbalancer를 구현한 submodule

예)
    <Proxy balancer://wpCluster>
      BalancerMember http://IP1:8080/docs
      BalancerMember http://IP2:8080/docs
    </Proxy>
    <Proxy balancer://apiCluster>
      BalancerMember http://IP3:8080/examples
      BalancerMember http://IP4:8080/examples
    </Proxy>
    ProxyPass /docs balancer://wpCluster
    ProxyPassReverse /docs balancer://wpCluster
    
    ProxyPass /examples balancer://apiCluster
    ProxyPassReverse /examples balancer://apiCluster 
 
http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://orpheuskr.tistory.com/242
신고
Posted by Stewie

<AWS EC2 AMI>
ami-e99faa9d : RightImage_CentOS_5.4_i386_v5.6.8.1_EBS


1. JDK 설치
설치되어있는 구버전의 JDK를 지우고

# rpm -qa | grep java
# rpm -qa | grep jdk
# rpm -e --nodeps 패키지명 
->로 모두 삭제한다. 

http://download.oracle.com/otn-pub/java/jdk/6u26-b03/jdk-6u26-linux-i586.bin 파일 Download & Install

/etc/profile 에 $JAVA_HOME 추가


2. Apache2 설치
http://mirror.khlug.org/apache//httpd/httpd-2.2.19.tar.gz

압축을 해제한 폴더에서 ./configure 를 실행 (옵션에 따라 많은 차이가 있다.)
http://blog.naver.com/PostView.nhn?blogId=kunks3&logNo=105790630&redirect=Dlog&widgetTypeCall=true

예) ./configure --prefix=PREFIX --enable-rewrite --enable-so --enable-mods-shared=most 

make & make install

service에 등록하려면 $APACHE2_HOME/bin의 apachectl을 /etc/rc.d/init.d/로 복사 후

chkconfig --add apachectl 명령어를 실행하면 되는데 이번에 설치한 ami에서는 에러를 발생한다.

apachectl를 vi 에디터로 편집하여 

# chkconfig: 2345 90 90
# description: init file for apachectl server daemon
# processname: /usr/local/apache2/bin/apachectl
# config: /usr/local/apache2/conf/httpd.conf
# pidfile: /usr/local/apache2/logs/httpd.pid

을 넣어주고 다시 실행하면 된다.
service apachectl start 씨리즈 명령어 완성


3. mod_jk 설정 

http://apache.tt.co.kr//tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.32-src.tar.gz 

./configure --with-apxs=/usr/local/apache2/bin/apxs
apxs 옵션은 @APACHE2_HOME/bin/apxs으로 설정(추후 다른 옵션 공부 필요)

make 후 install 보다는 native/apache-2.0 에 있는 mod_jk.so 파일을 $APACHE2_HOME/modules 에 복사하는 방법을 이용

 # conf/httpd.conf 파일 수정
LoadModule jk_module modules/mod_jk.so 추가

<IfModule mod_jk.c>
#workers파일 위치
JkWorkersFile conf/workers.properties
#로그 위치
JkLogFile "logs/mod_jk.log"
#로그 레벨
JkLogLevel info
#로그 문자열 포멧
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat "[%w %V %T]"
#url 매핑 
JkMount /* loadbalancer
</IfModule>
 
 # conf/workers.properties 파일 신규 생성

worker.list=loadbalancer

worker.tomcat1.type=ajp13
worker.tomcat1.host=192.168.0.1
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=1

worker.tomcat2.type=ajp13
worker.tomcat2.host=192.168.0.2
worker.tomcat2.port=8009
worker.tomcat2.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2

ajp13은 mod_jk에서 사용하는 프로토콜이다.


P.S 추가

mod_jk를 사용하지 않고 mod_proxy 및 mod_proxy_balancer를 이용하여 구성할 수 도 있다.
apache2 설치 옵션에서 --enable-proxy를 설정하면 mod_proxy 패키지가 설치되고

<VirtualHost *:80>
    ServerAdmin       admin@mydomain.co.kr
    ServerName        ad.ospserver.net
    ErrorLog          /usr/local/apache2/logs/ad.ospserver.net-error_log
    CustomLog         /usr/local/apache2/logs/ad.ospserver.net-access_log common

    <Proxy balancer://wpCluster>
      BalancerMember http://IP1:8080/docs
      BalancerMember http://IP2:8080/docs
    </Proxy>
    <Proxy balancer://apiCluster>
      BalancerMember http://IP3:8080/examples
      BalancerMember http://IP4:8080/examples
    </Proxy>
    ProxyPass /docs balancer://wpCluster
    ProxyPassReverse /docs balancer://wpCluster
    
    ProxyPass /examples balancer://apiCluster
    ProxyPassReverse /examples balancer://apiCluster
</VirtualHost>

와 같이 httpd.conf에 가상호스트 설정을 할 수 있다.
그렇담 과연 mod_jk와 mod_proxy의 차이점은 무엇인가?

<참조>
http://docs.codehaus.org/display/JETTY/Configuring+AJP13+Using+mod_jk
http://masamune.tistory.com/162 
 
신고

'07.Web' 카테고리의 다른 글

Tomcat 에서 ROOT context으로 webapps 실행하기  (0) 2012.02.20
Tomcat, Jetty and Winstone  (0) 2011.08.17
CentOS 5.4 + Apache 2.2 + Tomcat 6.0 + mod_jk 정리  (0) 2011.07.14
Apache ? Tomcat?  (0) 2011.06.03
java -jar hudson.jar  (0) 2011.05.28
REST CXF  (0) 2011.05.13
Posted by Stewie

MySQL migration toolkit

11.DB 2011.06.21 14:32
현재 하는 업무상 oracle DB를 AWS의 mySQL로 migration 할 일이 생겼다.
MySQL을 써본 경험이 많지 않기 때문에 그냥 하면 되지 뭐 라고 생각했는데

function, sequence, column type 등 다른 점이 생각보다 많았다.

즉, todd따위로 그냥 DDL 스크립트만 쭉 뽑아다가 할 수 있는 수준이 아니다.

그래서 찾아본 것이 MySQL migration toolkit
인스톨 과정에서 JDK가 아닌 JRE를 요구 하는 바람에 JRE를 살짝 설치해주고
그렇게 시작해보았다.

결국 스키마 정도와 데이터? 정도만 마이그가 되고
기타 문제가 되는 다른 부분에 대한것은 manual로 작업을 해야할 터인데...
과연 어떻게 이 난관을 극복해야 할 것 인지는 아직 고려중이다.
신고

'11.DB' 카테고리의 다른 글

MySQL migration toolkit  (0) 2011.06.21
SQL group by 해도 group으로 묶어서 컬럼 가져오기  (0) 2011.02.09
ORA-28000: the account is locked 오류시  (0) 2009.10.14
Posted by Stewie

AWS RDS 설정

분류없음 2011.06.16 15:43

1. MySQL vs. Oracle 선택
2. CDIR 설정 (DB를 access 할 수 있는 IP)
참고 http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
0.0.0.0/0 으로 하면 모든 IP에 개방

끗... -_-;
 
신고
Posted by Stewie


티스토리 툴바