JCF TEAM BLOG

관리자 글쓰기
블로그 »
블로그 »
Though iBATIS is one of a very popular ORM framework, it has some irritatating problems that every developers have suffered for a long time. Whenever sqlMap file is modified, one should undergo the tedious process of restarting the application so that the modifications actually take effect.
So I made a little extension to Spring framework's SqlMapClientFactory class in order to monitor file modification and re-initialize sqlMapClient accordingly. Basic implementation ideas are :
1. don't change original classes of Spring Framework nor iBATIS library.
2. should run with iBATIS 2.3.0 for jdk 1.4 and iBATIS 2.3.2 or later for jdk 1.5 or higher.
 (with the nice feature of Spring 2.5.5+ SqlMapClientFactoryBean's wildcard matching while preserving compatibility with old libraries.)
3. assuming default singleton scoped beans, SqlMapClientFactoryBean creates new SqlMapClient instance only when Spring initializes the applicationContext. The object (sqlMapclient) injected to other beans cannot be replaced while the application is up. It should be replaced with a proxy. The proxy, sitting in as the product of the factory, deligates all the received messages to the real sqlMapClient object, which can be replaced whenever the mapping files are modified.
4. make list of files to monitor from SqlMapClientFactoryBean's properties and sqlMapConfig files.

Limitations
The list of files to monitor is determined on startup. It doesn't detect added files while running, and emits warning messages for removed files. For example, with a sqlMap file registered to a sqlMapConfig file, it is not monitored but those changes work when refreshed.

Requirements
iBATIS sqlmap 2.3.0, Java 1.4, Spring 2.5+
or
iBATIS sqlmap 2.3.2+, Java 1.5+, Spring 2.5.5+

Installation
1. replace SqlMapClientFactoryBean with newly created RefreshableSqlMapClientFactoryBean in applicationContext configuration file
2. specify modification detection check interval in milliseconds.
3. add backport-util-concurrent-3.1.jar to classpath.

configuration example
<bean id="sqlMapClient" class="jcf.dao.ibatis.sqlmap.RefreshableSqlMapClientFactoryBean"> 
   <property name="configLocation" value="classpath:jcf/dao/ibatis/sqlmap/sqlmap-config.xml" /> 
   <property name="dataSource" ref="dataSource" />
 
   <!-- Java 1.5 or higher and iBATIS 2.3.2 or higher REQUIRED --> 
   <property name="mappingLocations" value="jcf/dao/\*\*\/T\*.xml" /> 
   <!-- <property name="mappingLocations" value="file:///D:/Type.xml" />-->
  <property name="checkInterval" value="1000" /> 
</bean>

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
author image
setq
2009/06/22 18:38 2009/06/22 18:38

(go to top)

블로그 »

정말 오래간만의 포스팅입니다. 오랜 동안의 공백기간 이후 이 사이트도 또 잠깐이나마 정상화할 수 있지 않을까 하는 기대를 해보면서 올려봅니다.

오랜 기간 숙원사업(?) 이었던 스프링과 iBATIS sqlMap을 이용해서 애플리케이션 개발/운영할 때 변경사항이 발생할 때마다 서버를 올렸다 내렸다하는 번거로움을 해소하기 위한 방법을 알려드리겠습니다.

일단 JCF 3.5 릴리즈에는 들어갈 것 같고요, 이미 여기저기서 아는 분들은 각자 만들어서 사용하고 계실만한 간단한 방법이긴 합니다만 그래도 정식 배포본에 들어가게 되었으니 언급은 하고 넘어가야겠지요?

- 착안
1. iBATIS 자체를 뜯어고치지는 않는다. 대신 스프링의 SqlMapFactoryBean을 교체 (IoC 컨테이너라 편리)
2. 실행 중 sqlMapClient를 교체하기 - 프록시 처리 및 수행 성능을 고려한 concurrency 처리
3. sqlMap 또는 sqlMapConfig의 xml이 변경되면 자동으로 리로드하도록 파일 감시.
4. Java 1.4, iBATIS 2.3.0, Spring 2.x 조합과 Java 1.5+, iBATIS 2.3.2+, Spring 2.5.5+ 조합간의 차이 처리


나머지는 Javadoc으로 대신합니다. (가만 보니 수동 리로딩에 대한 언급은 빠져있군요.)


 
RefreshableSqlMapClientFactoryBean
iBATIS sqlmap 클라이언트의 sqlMap 및 sqlMapConfig 파일의 변경을 감지, 실시간 적용하는 팩토리 빈.

개요
iBATIS + Spring 개발시 쿼리 매핑 파일이 변경되면 웹애플리케이션 서버를 재기동해야 적용이 됐었다. 이러한 불편을 없애기 위해 매핑 파일 변경을 실시간으로 감시, 적용하는 모듈을 제공한다.
감시 대상 이 모듈은 iBATIS sqlmap 클라이언트의 sqlMap 및 sqlMapConfig 파일의 변경을 감지, 실시간 적용해준다.

제약사항
감시 대상 파일들은 스타트업 당시에 결정된다. 그러므로 추가된 파일들에 대해서는 감지가 되지 않고, 삭제된 파일들에 대해서는 경고 메시지가 나온다. 예를 들어, sqlMapConfig에 sqlMap 파일이 추가되거나 하면 해당 맵이 적용되기는 하지만, 실시간 변경 감지 대상으로 추가되지는 않는다.

요구사항
iBATIS sqlmap 2.3.0, Java 1.4, Spring 2.5 이상 또는 iBATIS sqlmap 2.3.2 이상,
Java 1.5 이상, Spring 2.5.5 이상

적용 순서
1. Spring의 applicationContext 설정 파일 중 sqlMapClient를 얻기 위한 SqlMapClientFactory 빈을 신규 클래스로 교체한다.
2. 변경 감지 시간 간격 (1000분의 1초 단위)를 지정한다.

 <bean id="sqlMapClient" class="jcf.dao.ibatis.sqlmap.RefreshableSqlMapClientFactoryBean">
     <!-- <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">-->
     <property name="configLocation" value="classpath:jcf/dao/ibatis/sqlmap/sqlmap-config.xml" />
     <property name="dataSource" ref="dataSource" />
 
     <!-- Java 1.5 or higher and iBATIS 2.3.2 or higher REQUIRED -->
     <property name="mappingLocations" value="jcf/dao/\*\*\/T\*.xml" />
     <!-- <property name="mappingLocations" value="file:///D:/Type.xml" />-->
 
     <property name="checkInterval" value="1000" />
 </bean>
 
3. 라이브러리 추가
backport-util-concurrent-3.1.jar
테스트 기존의 applicationContext에 등록되어 있던 sqlMapClient에 해당하는 mappingFile들을 편집하거나, sqlMapConfig 파일 또는 그 파일에 등록된 mappingFile(sqlMap 파일)들을 편집하면 주어진 변경감지 시간 후 변경사항이 적용된다.


Author:
setq

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
author image
setq
2009/04/23 15:37 2009/04/23 15:37

(go to top)

블로그 »
JCF 3.5 릴리즈 관련해서 마인드맵을 작성해 보았습니다.
http://www.mindmeister.com/12023657
크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
그래도 꿈이 있어서 행복하다^^
2008/11/12 15:35 2008/11/12 15:35

(go to top)

블로그 »

KSUG에 좋은 글이 있어서 소개하고자 합니다.

최근 다수의 회사들이 생산성, 재사용성, 유지보수성, 품질보증 등 자사의 애플리케이션을 견고하게 하고 아웃소싱을 통해 개발되는 애플리케이션을 수치화, 정량화된 데이터를 통해 통제하고자 전사 표준 프레임워크를 구축하거나 도입하고 있습니다. 이와 같이 전사 표준 프레임워크를 구축하고 도입하는데 있어서 고려해야 할 사항들에 대하여 잘 정리하고 있습니다. 저희가 새롭게 시작하고자 하는 일에 많은 도움이 되는 내용들이 있어서 나름대로 느끼는바가 많습니다.

그럼 시작...

어느 정도 규모가 있는 소프트웨어 관련 회사라면 생산성, 유지보수성을 높이고 개발자의 학습비용을 줄이기 위해 전사 표준 프레임웍을 도입하고 있습니다. 그리고 잘 아시듯이, 그런 프레임웍들은 대부분 자바의 오픈소스 프레임웍들의 기반으로 해서 추가, 확장 개발되어 있습니다. 그동안 제가 몇 개의 전사표준 프레임웍을 접하면서 최종 어플리케이션 개발자로써 가지게 된 생각을 정리해 봅니다.

  아래 내용은 어느 특정 회사의 프레임웍에만 초점을 두고 있는 내용은 아닙니다. 구체적인 코드의 예까지 들고 싶은 내용도 있지만, 여러 프레임웍에 해당하는 내용일지라도 공개적인 웹사이트에 그렇게 자세한 내용을 올릴 수 있는 전사표준 프레임웍은 오픈소스정책을 펴고 있는 애니프레임 밖에 없습니다.  그래서 지나치게 특정 프레임웍의 대한 비판으로만 해석될까봐 코드 예시는 이 글에는 포함시키지 않았습니다.


  첫째, 기존 오픈소스가 제공하는 있는 기능을 중복구현하거나 감싸서 개발할 때는 그 의도를 어플리케이션 개발자에게 알려야 합니다. 오픈소스에서 유사한 이런 것이 있는데, 이런 이유 때문에 따로 작성했다던지, 래핑을 시켰다는 것을 명시해 두면 어플리케이션 개발자들이 그 모듈을 활용하는 할 때 도움이 될 것입니다.


more..


  둘째, 사내에서 만든 기존 모듈도 지속적으로 개선하고, 때로는 과감히 버릴 수도 있어야 한다고 생각합니다. 기존 모듈의 가치를 지나치게 높게 평가하지 않고, 인터페이스와 구현을 끊임없이 재검토 되어야 합니다. 팀 내에서 높은 직급의 사람이 만들었던 코드라도 마찬가지어야 할 것입니다.

 

more..


  셋째, 프레임웍의 개발단계에서도  결정사항과 주요 설계의 의도들에 대한 것들은 문서로 남겨지고 공유되어서, 어플리케이션 개발자들의 피드백을 받아야 한다고 생각합니다. 보통 모듈 공개 이후에 개발자들이 웹단의 프레임웍 선택 기준이라던지, 모듈의 설계에 대해서 많이 문의를 합니다.  그 때도 답변 담당자가  검토과정을 알지 못하면 상세한 대답을 하기가 어려울 것입니다. 'XX 프레임웍은 검토했던 담당자가 지금 여기에 없어서 저도 자세히는 모르겠네요. '라거나 '지금은 그 때 그 모듈을 작성했던 개발자가 없어서 확실히는 모르겠으나, 제 추측으로는...'라는 내용이 포함된 답변을 본적도 있습니다. 프레임웍 개발팀 내부의 업무 인계나 개발자들의 반복적인 문의를 잘 처리하기 위해서라도 그런 내용의 정리, 공유는 필요합니다. 그리고 그런 문의들은 결정사항이 확정된 후에 그것을 돌이킬 수 없을 때가 아닌, 검토 과정 중에서 받아서 실무 개발자들의 경험을 충분히 활용하고 더 많은 사람들의 지식을 모을 수 있어야 합니다.

 

more..


  넷째,  배포되는 모듈과 샘플들은  최종 확정 전에 엄격한 설계 검토와 코드리뷰가 이루어 져야 합니다.

 

more..

  다섯째, 프레임웍을 현장에서 적용할 때 선택할 수 있는 사안들이 유연하게 제공되고, 각각의 장단점과 선택의 기준등이 제시되었으면 좋겠습니다. 전사표준 프레임은 개발자들을 가두어 두는 벽이 되어서는 안 되고, 든든하게 딛고 뛸 수 있는 바닥이 되어야 할 것입니다. 그래서 그런 프레임웍에 모듈의 조합이나 설정 파라미터 등에 있어서 다양한 선택이 존재하는 것은 당연한 일입니다. 그러나 각 프로젝트마다 많은 선택의 조합들을 다 검토할 수 있는 여력이 안 되고, 구체적인 선택기준이 없다면 오히려 그런 선택의 폭들은 짐이 됩니다. 프로젝트에서 목소리 큰 사람의 의견대로 흘러가서 동의하지 못하는 구성원들이 생긴다면 갈등의 소지까지도 될 수 있겠습니다.

 

more..


  여섯번째, 오픈 소스 프레임웍을 매개로 조직의 경계를 넘어선 공동작업을 시도해 보아야 한다고 생각합니다. 회사와 업계를 막론하고 Java 오픈소스 기반의 프레임웍들은 많이 쓰이고 있습니다. 그래서 많은 조직들에서 같은 고민들을 조직마다 따로 동시에 하고 있을 것으로 추측됩니다. 이런 상황에서 적용사례, 활용팁, 문제해결 사례, 프레임웍 간 비교검토 결과 등의 자료 공유와 코드 공유, 공동의 교육과정 개설 같은 일이 이루어 질 수 있다면 상호이익이 될 것입니다. .

 

more..


  지금까지 나온 내용을 정리해보면 다음과 같습니다. 오픈소스 모듈을 래핑하거나 중복된 기능을 구현할 때는 의도를 개발자에게 알리고, 기존 모듈에 대해서도 개선을 해나가면서 때로는 과감히 범용적인 모듈로 교체할 수 있어야 합니다. 그리고 개발과정 중에서도 주요 결정사항과 설계안을 공유해서 피드백을 받고, 최종배포 전에는 설계안과 코드를 엄격하게 검증해야 합니다. 그리고 배포 후에는 유연한 선택 사항들과 구체적인 선택 기준을 제공하는 적용가이드를 제공하고, 회사 조직의 경계를 넘어선 협업도 모색해 보는 것이 좋습니다.

  이런 것들을  이루는데 기술적으로는 스프링 프레임웍이 든든한 토대가 되어줄 것은 확실합니다. 잘 아시는 것처럼  유연한 구조로 인한 확장성, Spring portfoilo에 서 제공하는 폭넓은 기능의 모듈들, 빠른 발전 속도와 안정된 하위호환성, 그리고 세계적으로 많은 사용자로 인한 튼튼한 사용자 층 등이 그 이유입니다. 그리고 스프링프레임웍의 공식포럼들을 이용해서 외국개발자들과도 정보를 주고 받음과 동시에 우리 KSUG(http://forum.ksug.org )의 포럼을 통해서도 조직의 벽을 넘어서서 성과물 공유를 할 수 있을 것입니다.

원문보기

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/07/23 10:33 2008/07/23 10:33

(go to top)

블로그 »

사건을 뒤죽박죽으로 써 놓으면 도대체 뭐가 문제인지 알 수가 없으나
재미로 남겨봅니다.

1. 사건의 발단
quick start를 준비하던 중 갑자기 몇몇 PC에서 maven archetype plugin이 갑자기 동작을 멈추는 사태가 벌어집니다.

[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] org/apache/commons/lang/StringUtils
org.apache.commons.lang.StringUtils
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
        ...

이에 대해 maven archetype:create goal이 DEPRECATED 되었다는 소식을 듣고
mvn archetype:generate 로 전환을 시키기 시작했습니다.
그러나 여기서도 역시 마찬가지 오류가 발생을 합니다.

local repository를 지우고 central repository로 붙어서 해보니 되는 것 같습니다.

그래서 혹시나 하고 internal repository를 엎어보았습니다.

그러나 역시 안됩니다.

프록시 대상 repository들 중에서 엉뚱한 artifact를 올리고 있는 게 있나 해서 하나씩 날려보다가,
velocity 쪽이 pom 파일이 안올라가서 따로 올려놓은 게 보입니다.
왜 그랬었는지 생각이 안나서 그냥 지워보았습니다만
역시 안됩니다.

archetype plugin이 아무래도 velocity와 연관이 있을 것 같아서 좀 더 자세히 알아보고자 구글링을 했더니
velocity:velocity:pom:1.5가 central repository 상에서 pom에 기술된 위치와 다른 엉뚱한 디렉토리에 설치되어 있어서 artifactory에서 거부를 하고 있는 것이었습니다.

좌우당간 해당 velocity-1.5.pom을 받아서 grooupId를 수정한 후, 강제 설치했습니다.

이제 잘 굴러갑니다.


-- 3줄 요약 --
1. archetype:generate가 안되는 현상 발생
2. maven central repository 관리의 문제로 velocity 1.5 pom 파일의 정합성 오류가 있다.
3. internal repository에 수정본 업로드하여 1의 문제 해결

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
author image
setq
2008/05/23 16:13 2008/05/23 16:13

(go to top)

블로그 »
지난번에는 Struts2 라이브러리들 관련해서 처리를 했었는데, 이번에는 jcf 자체의 소스 및 컴파일 옵션의 문제로 1.4에서 동작하지 않았던 문제를 처리하였습니다.

more..


개발버전
3.0-maintenance 일일 빌드
jcf-3.0.1-SNAPSHOT-build-1022 이후 부터 사용 가능합니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
author image
setq
2008/03/11 16:28 2008/03/11 16:28

(go to top)

블로그 »

요즘은 iBATIS에서 ResultSetMetadata 값을 함께 받아오기 위해 aspectj로 처리를 테스트하고 있습니다.

테스트하는 동안 오픈소스 프로젝트의 소스를 건드리지 않는다는 원칙 하에 LTW를 하고 있었으나 애플리케이션 로딩 시간이 지나치게 길어지는 단점이 있어 다시 컴파일 타임에 weaving하기로 했습니다.

아래 pom.xml 설정을 보시면 weaving 결과물로 ibatis-sqlmap.jar에 포함된 클래스 전체가 나오기 때문에 원본 jar는 war 패키지에서 제외시켜버렸습니다. (이렇게 하지 않으면 실행환경에 따라 충돌이 일어날 수 있습니다.)

maven 프로젝트인 경우에는 아래와 같이 설정하면 되지만 eclipse project style로 하자면 미리 weaving 된 ibatis-sqlmap.jar artifact를 배포해서 사용하도록 해야겠습니다.

.
.
        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-sqlmap</artifactId>

            <version>2.3.0</version>
            <scope>provided</scope>
        </dependency>
.
.
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <weaveDependencies>
                        <weaveDependency>
                            <groupId>org.apache.ibatis</groupId>
                            <artifactId>ibatis-sqlmap</artifactId>
                        </weaveDependency>
                    </weaveDependencies>

                    <complianceLevel>${java.version}</complianceLevel>
                    <encoding>${encoding}</encoding>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
.
.

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
author image
setq
2008/02/18 16:14 2008/02/18 16:14

(go to top)

블로그 »

전자정부 개발프레임워크 설문조사 중에서 개발프레임워크가 갖추어야할 필수적인 기술요소에 대한 설문 문항입니다.
사용자 인터페이스와 시스템 인터페이스로 구분한 것과 사용자 인터페이스 기술 중에 특정 벤더의 기술(Flex)이 나온 것이 재미있네요.

사용자 인터페이스
 - X-Internet Adaptor, Ajax 지원, 메뉴관리, Portlet 지원, Flex 지원, Script 지원

시스템 인터페이스
 - Web Services, 각종 연계 Adaptor, Messaging

실행환경
 - Paging, 파일업로드/다운로드, 데이타소스 관리, DB Pooling, ORM, Query, Caching, 트랜잭션,
   Logging, Life Cycle 관리, 예외처리, AOP, 다국어 지원, 암복호화 지원, 권한 관리

개발환경
 - 통합개발환경, 코드생성도구, 단위테스트, 자동테스트 지원, 형상관리, 자동 배포, Hot Deploy

운영환경
 - 관리자 GUI, 운영 모니터링, 리포팅

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
그래도 꿈이 있어서 행복하다^^
2008/02/15 10:20 2008/02/15 10:20

(go to top)

블로그 »
사내에서 JBoss Rules(Drools)을 소개하는 시간을 갖었습니다.
많은 분들이 룰엔진에 대하여 지대한 관심과 기대를 가지고 있는 것을 느낄 수 있었습니다.
아래는 룰엔진 소개시간에 나온 이야기들입니다.

1. Rule 자산화
 - Rule 재사용 방안
 - BRMS 시스템 활용
 
2. 기술이슈
 - Rule을 DB로 관리
 - StatefulSession 개념
 - 유효성첵크 
 - Rule Flow vs. BPM
 - Rule Folw 모니터링
 - Rule Flow 디버깅
 - 어플리케이션 초기 로딩 시간 증가 문제

3. 프로세스 및 생산성
 - 분석, 설계 단계부터 Rule 고려 (코드와 Rule의 분리)
 - 레거시 어플리케이션 Reverse 엔진니어링 방안 (Java2Rule)
 - 룰엔진 사용 여부에 따른 공수 비교
 
4. 적용 분야
 - 대학 학칙
 - 금융 대출상품
 
5. JCF 연동
  - JCF와 Jboss Rules 연동 최적화
크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
그래도 꿈이 있어서 행복하다^^
2008/02/14 16:55 2008/02/14 16:55

(go to top)

블로그 »
Struts2 저장소 배포본이 JDK1.4용은 안 올려져있더군요.
일단 retrotranslator를 이용하여 변환된 라이브러리를 이용하는 것을 가정해서,

실시간으로 빌드파일에서 jdk1.4용으로 변환해주느냐 아니면 배포본 및 repository를 통해서 이미 변환된 라이브러리를 배포하느냐하는 문제가 대두되었는데,

실시간으로 변환해준다는 것은 라이브러리를 관리하는 입장에서야 우선 편하지만 쓰기가 불편합니다.

그럼 배포하려면 어떻게 하겠는가 하니 일단 maven 프로파일을 이용해서 동작 환경이 자바 1.4이면 알아서 관련 라이브러리들로 교체가 되도록 처리는 가능해보입니다만 그룹명은 바꿔줘야할 것 같습니다.
왜냐하면 같은 groupId, artifactId내에서는 classifier를 바꾼다고 하더라도 pom은 동일한 것을 이용하기 때문에
dependency를 입맛에 맞게 변경할 수가 없더군요.

일단 jcf 그룹 내에 적당한 그룹을 만들어 놓고 넣어두도록 하겠습니다.

그리고 retrotranslator를 돌리는 것도 수작업이 많으니 별도 프로젝트를 생성해두도록 하겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
author image
setq
2008/01/10 13:58 2008/01/10 13:58

(go to top)