노무현 대통령 배너
생산성 향상이라는 말만 나오면 뭔가 '멋지고 화려한것'을 찾기 쉽습니다. 굳히 No Silver Bulet이란 용어를 언급하지 않아도 그런 것은 없다는걸 이미 짐작 하셨을거 같네요.
오히려 기본으로 돌아가는게 더 현명합니다.

Sqlite와 같은 파일기반 데이터베이스를 사용하자.
Sqlite는 임베디드 DB로 따로 인스턴스를 두지 않고도 애플리케이션 내에 내장해서 사용이 가능합니다.  C로 엔진이 개발되어 빠른 속도를 자랑합니다. 하지만 몇가지 단점도 있습니다.
  - Sqlite 에 대한 JDBC 드라이버가 전혀 업데이트 되지 않고 있습니다. 하지만 동작은 잘 합니다.
  - 파일기반이기 때문에 여기에서 오는 성능저하가 한계입니다. 하지만 SSD와 같은 빠른 하드를 쓴다면
     어느정도 커버가 가능합니다.
  - 참조 URL: Sqlite and Web application , Sqlite web app performace

컨테이너와 개발환경에 대한 동기화를 자동으로 하자.
스프링이 나오면서 lightweight 컨테이너가 많이 쓰이고 있지만 아직도 개발한 소스를 WAS에 배포하기 위해 컨테이너를 재시작하는 일이 많습니다. RoR에서 개발하는 것 처럼 소스에 대한 반영이 쉽다면 편해질거 같습니다.
  - 참조 URL: JRebel

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
TAG j2ee, java
인사이트에서 Java 세상을 덮친 Eclipse 3판의 부록에 실린 이클립스 단축키 일람표를 PDF로 제공해 주셨네요. 하나 인쇄해서 붙여놓고 얼른 외우세요. 빨리 외우고 떼어 버려야지. ^^






크리에이티브 커먼즈 라이선스
Creative Commons License
네이버에서 개발자를 위한 나눔고딕 코딩체를 개발해서 무료로 배포하고 있습니다. 저도 얼른 다운받아서 설치하고 이클립스에 적용해 봤습니다. 확실히 0과 O, L과 I가 구분되는게 보이네요.

[적용 전]

[적용 후]

사소한 타이포 에러로 몇 시간을 날려 본 분이라면 급공감 할거 같습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
TAG 개발
바이트코드가 어떻게 이루어졌는지 직접 확인하고 싶다면 바이트 코드 뷰어를 사용해야 합니다. 일반 텍스트 에디터로 보기에는 아무래도 어렵습니다. 바이트코드 뷰어로 유명한게 jClassLib 입니다.
이름이 Lib로 끝나서 UI가 없는줄 알았는데 그건 아니더군요. ^^

간단하게 사용해 보도록 하겠습니다. 먼저 테스트를 위해 간단한 자바 코드 샘플을 만들었습니다.

jClassLib를 다운받아서 압축을 해제하면 jclasslib_home/bin/jclasslib.exe 파일을찾을 수 있습니다. 실행하면 GUI 인터페이스가 나타납니다. HelloJava.class를 선택합니다.

왼쪽의 트리에서 Methods 노드를 확장해 보면 두개 메소드가 나타납니다. <init>는 생성자를 나타내며 main 메소드가 있음을 바이트코드에서도 확인할 수 있습니다.





크리에이티브 커먼즈 라이선스
Creative Commons License
자바 소스를 컴파일하면 바이트 코드로 쓰여진 클래스파일이 만들어집니다. 이 클래스파일에는 유용한 정보가 많이 담겨 있기 때문에 이를 잘 활용하게 되면 소스코드로 불가능한 것도 가능합니다.

그 첫번째로 디컴파일(Decompile)입니다. 디컴파일은 클래스파일로 소스파일을 만드는 과정을 말하는것으로 가장 널리 사용되는 디컴파일러에는 JAD가 있습니다.
자바는 플랫폼 독립성을 위해 C/C++와 같이 바이너리 컴파일을 하는게 아니라 중간 바이트코드로(Intermediate Byte Code)로 컴파일 되기 때문에 이렇게 디컴파일이 가능한 것 입니다.

하지만 디컴파일된 코드를 다시 컴파일 하는것은 문제가 발생할 수 있습니다. 왜냐면 디컴파일 과정에 정적변수와 같은 것들이 실제값으로 치환되면서 발생하는 모호성(Obfuscation) 때문입니다. 이 모호성을 잘 이용하게 되면 자바 디컴파일을 막는 효과도 가져올 수 있습니다. Reflection이나 Serialization 과 같은 기술을 적절히 활용하는것이 좋으며 이를 위한 툴로는 Zelix KlassMaster가 널리 사용됩니다.



반면에 장점도 있습니다.
  • 코멘트가 없는 소스를 얻을 수 있기 때문에 정확한 LOC를 얻을 수 있습니다.
  • 바이트코드로 바뀌는 중에 최적화가 이루어져서 메소드에 대한 정리가 가능합니다. 예를 들어 단 한번만 호출되는 메소드인 경우에는 호출하는 코드에 포함되어져 버립니다.
  • JVM의 스펙이 요구하는 형태로 정형화 되기때문에 호출관계에 대한 분석이 용이합니다.


크리에이티브 커먼즈 라이선스
Creative Commons License
윈도우를 쓰다보니 명령줄은 잘 안쓰지만 시스템을 연동할때는 명령줄 인터페이스가 필요할때가 많습니다. Ant와 같은 명령줄 인터페이스를 쉽게 만들 수 있게 해주는 오픈소스가 Commons CLI 입니다.

Commons CLI를 이용해서 명령줄 인터페이스를 만드는 과정은 명령줄 옵션 정의, 옵션 값 파싱, 옵션에 따르는 처리를 정의하는것으로 이루어 집니다.

1.명령줄 옵션 정의
Options options = new Options();
options.addOption("t", false, "display current time");
options.addOption("d", true, "get directory");

Options 객체는 Option 객체를 갖으며 각 Option 객체는 옵션 플래그, 옵션이 값을 가지는지 여부를 나타내는 boolean 값, 옵션에 대한 설명으로 만들어 집니다.

위에서 정의한 옵션은 명령줄에서 --t  --d C:\download 와 같이 줄 수가 있습니다.

2.옵션값 파싱
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse( options, args);

옵션값을 String[]인 args로 받았다면 CommandLineParser를 이용해서 옵션값을 파싱하는게 가능합니다. 파싱 결과는 CommandLine 객체로 구해집니다.

3.옵션에 대한 처리
            if(cmd.hasOption("d")) {
                System.out.println("d option value: "+cmd.getOptionValue("d"));
            }

옵션이 주어졋는지 여부는 CommandLine 객체의 hasOption() 메소드로 알 수 있습니다. 옵션이 주어진 경우에는 getOptionValue로 실제 값을 구할 수 있습니다.

이 외에도 옵션에 대한 도움말도 처리해야 하는데 HelpFormatter를 이용하면 간단히 깔끔하게 도움말을 출력할 수 있습니다.
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp( "sampleCLI", options );

위 처리에 대한 결과는 다음과 같습니다.
usage: sampleCLI
 -cd,--directory <arg>   get current directory
 -d <arg>                get directory
 -p <package>            get package
 -t                      display current time






크리에이티브 커먼즈 라이선스
Creative Commons License
애플리케이션을 개발하다 보면 설정정보를 저장해야 하는 경우가 꼭 있습니다. 이런 경우 정보가 간단하면 *.properties 파일을 주로 사용하지만 복잡하다면 .xml 파일을 써야 하죠.
이런때 쓰면 딱 좋은 오픈소스가 아파치 프로젝트의 Commons Configuration 입니다.

Conmmons Configuration이 지원하는 파일 포맷이 다양하기 때문에 상황에 맞춰 사용가능하며 동시에 같이 사용하는것도 가능합니다.
  • Properties files
  • XML documents
  • Windows INI files
  • Property list files (plist)
  • JNDI
  • JDBC Datasource
  • System properties
  • Applet parameters
  • Servlet parameters
그럼 *.properties 파일을 이용해서 설정정보를 읽어들이고 저장할때 간단히 사용할 수 있는 유틸 클래스 ConfigUtil을 한번 만들어 보겠습니다.

1.ConfigUtil 클래스
싱글턴으로 만들어야 사용하기 편하니 static 변수 instance를 선언하고 Configuration 프레임웍에서 properties파일을 나타내는 PropertiesConfiguration 변수를 선언합니다.

    private static ConfigUtil instance = new ConfigUtil();
    private static PropertiesConfiguration propertyConfig;

파일을 읽어들이는 load 메소드를 정의합니다.

    public void load(String fileName)
            throws ConfigurationException {
        propertyConfig = null;
        propertyConfig = new PropertiesConfiguration();
        propertyConfig.load(new File(fileName));
    }

특정 키를 주고 키에 해당하는 값를 읽어들이는 getProperty 메소드를 정의합니다.

    public String getProperty(String key) {
        String value = propertyConfig.getProperty(key) == null ? ""
                : propertyConfig.getProperty(key).toString();
        return value;
    }

특정 키에 해당하는 값을 변경하기 위한 setProperty 메소드를 정의합니다.

    public void setProperty(String key, Object value) {
        propertyConfig.setProperty(key, value);
    }

프로퍼티 파일을 다시 저장할 save 메소드를 정의합니다.

    public void save(String fileName) throws ConfigurationException {
        propertyConfig.save(new File(fileName));
    }

2.ConfigKey 인터페이스
이번에는 프로퍼티의 키들을 저장해놓고 상수로 사용하기 위한 인터페이스 ConfigKey를 정의합니다.

public interface ConfigKey {
    String KEY1 = "key1";
    String KEY2 = "key2";

}

3.ConfigUtil 테스트
이제 테스트를 할 때가 되었습니다. ConfigUtilSample 클래스를 만들어서 간단히 테스트 해 보겠습니다.

    public static void main(String[] args) throws Exception{
        String fileName = "sample.properties";
        // #1
        ConfigUtil.getInstance().load(fileName);
       
        System.out.println("Key1 Value=" +  
                                ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));

        System.out.println("Key2 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY2));
       
        ConfigUtil.getInstance().setProperty(ConfigKey.KEY1, "zzz");
        System.out.println("Key1 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
        ConfigUtil.getInstance().save(fileName);
       
        // #2
        ConfigUtil.getInstance().load("sample2.properties");
        System.out.println("Key1 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
    }

sample.properties파일과 sample2.properties 파일의 내용은 다음과 같습니다.
sample.properties
key1 = aaa
key2 = bbb

sample2.properties
key1 = ccc
key2 = ddd

위 샘플의 실행결과를 먼저 보면 다음과 같습니다.
Key1 Value=aaa
Key2 Value=bbb
Key1 Value=zzz
Key1 Value=ccc
간단히 설명을 해보겠습니다. 먼저 sample.properties파일을 읽어들이고 나서 Key1, Key2에 해당하는 값을 읽어 들여서 출력합니다. 그리고 Key1에 해당하는 값을 변경하고 이를 저장합니다.
(폴더를 새로고침하면 파일이 실제로 변경되었음을 확인할 수 있습니다.)

두번째로 sample2.properties 파일을 읽어들이고 다시 Key1에 맞는 값을 읽어 들입니다. properties 파일이 다르기 때문에 값이 다름을 확인할 수 있습니다.

properties 파일에 대한 처리는 간단하지만 꼭 필요한 기능입니다. 위 프레임워크를 이용하게 되면 아래처럼 프로퍼티에 주석을 단다거나 변수를 사용하는것도 간단하게 구현할 수 있습니다.
# properties can reference other properties

base.prop = /base

first.prop = ${base.prop}/first


크리에이티브 커먼즈 라이선스
Creative Commons License
자바 VM이 여러개 설치하고 개발 하다 보니 이클립스가 어떤 VM을 사용하는지 헷갈릴때가 있습니다.
그럴때는 vm을 지정해주고 이클립스를 실행하는게 확실하죠.
eclipse -vm c:\jre\bin\javaw.exe        
eclipse -vm c:\jre\bin\client\jvm.dll
eclipse -vm c:\jre\bin

명령줄 보다는 아이콘을 클릭하는게 익숙하니 그럴때는 eclipse.ini 파일에 추가해 놓는것이 편리합니다.

eclipse.ini

-vm
c:\jre\binc:/jre/bin/javaw.exe

크리에이티브 커먼즈 라이선스
Creative Commons License
요즘에는 웹기반의 RSS리더를 사용하는게 일반적입니다. 저는 구글리더를 쓰는데 글의 전문을 읽기 위해 매번 새창이나 새 탭을 여는게 불편해서 뭐 좋은 툴이 없나 찾아보다 파이어폭스 플러그인중에 Better GReader라는 툴을 찾았습니다. 그리스 몽키를 이용한 부가 기능으로 딱 제가 찾던 기능을 갖고 있네요.

설치전 화면으로 글의 일부만 보입니다.

부가기능을 설치하면 이렇게 바뀌게 됩니다.

전체 페이지가 보입니다. 이미지까지 잘 보이네요.



크리에이티브 커먼즈 라이선스
Creative Commons License
가끔 PDF 파일을 Word로 바꿀 필요가 있습니다. 이럴때 사용하면 좋은 프로그램을 하나 소개합니다. Able2Extract 라는 프로그램인데 이미지까지 정확한 위치로 변환해 주기 때문에 유용합니다.
트라이얼 버전은 한번에 3페이지만 변환이 되는 제약이 있습니다만 어느정도 변환이 되는지는 확인 가능합니다.

어느정도까지 정확히 변환해 줄까요 ? 이번에 제가 번역중인 HPSD 1장을 변환해 봤습니다. 아래 있는 첫번째 페이지가 원본 PDF 입니다.

아래 이미지가 워드로 변환한 것입니다. 거의 유사하죠. 이 정도면 95% 이상 완벽히 변환한다고 볼 수 있을거 같습니다. 다만 안좋은게 워드 파일의 용량이 좀 커진다는겁니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
TAG PDF
이번에 아래 이미지의 자동화라고 표시되어 있는 부분에 해당하는 도구 개발을 사내에서 검토하고 있습니다. 혹시 아래 영역에 대한 자동화를 지원하는 오픈소스를 알고 계신분 있으신가요 ?
중요한 정보를 알려주시는분에게는 개인적으로 후사하겠습니다. ^^

사용자 삽입 이미지

크리에이티브 커먼즈 라이선스
Creative Commons License
오랜만에 닷넷 관련한 기사하나 올립니다.

정책 주입 응용 프로그램 블록을 WCF 서비스와 통합

크리에이티브 커먼즈 라이선스
Creative Commons License
TortoiseSVN을 사용하려고 가이드를 만들까 하다가 깡후니의 블로그에서 찾았습니다.


크리에이티브 커먼즈 라이선스
Creative Commons License

WCF를 이용한 HTTP 프로그래밍

Development/기술 2008/05/23 08:34 posted by k16wire
MSDN에 WCF와 .NET Framework 3.5를 이용한 HTTP 프로그래밍에 대한 기사가 올라왔습니다. RSS와 ATOM으로 Feeding 하는 부분이 재미있어 보이네요.
WCF와 .NET Framework 3.5를 사용한 HTTP 프로그래밍


크리에이티브 커먼즈 라이선스
Creative Commons License
윈도우에서 작업관리자로 보게되면 무슨 프로세스가 그리 많은지..그중에서 특정 프로세스만 멈추고 싶을면 어떻게 해야 할까요 ? 서비스로 등록되어 있는거라면 서비스를 멈추면 됩니다만 만약 그게 아니라면..^^

MS TechNet에서 찾은 Process Explorer는 바로 이런경우에 편리하게 쓸수 있는 프로그램입니다.
사용자 삽입 이미지
탐색기 형태로 어떤 프로세스가 내 CPU를 사용하는지 보다가 잠깐 멈춰놓을수 있으니 정말 편리하더군요.
그 외에 어둠의 용도도 많이 있으니 직접 써보시기를 권해드립니다. ^^

크리에이티브 커먼즈 라이선스
Creative Commons License
사용자 삽입 이미지
PMD는 자바 소스코드를 자동으로 리뷰하여 잠재적인 결함을 찾아주는 도구입니다. 오픈소스 프로젝트로 개발되고 있으며 4.2.1까지 나와 있습니다.
PMD만으로도 이용할 수 있지만 이클립스, JBuilder와 같은 IDE와 연동하여 이용하는게 보통이며 Ant, Maven과 같은 빌드툴과 연동하여 CI를 지원하는 환경을 구축할때도 유용하게 사용할 수 있습니다.

PMD를 이용하여 찾을 수 있는 결함에는 다음과 같은 유형들이 나올수 있습니다.
  • 잠재적 버그
  • 사용하지 않는 코드
  • 너무 복잡한 코드
  • 중복된 코드
사실 이런 결함을 눈으로 찾을 수도 있지만 개발중에 사전에 정의해 놓은 룰셋을 기반으로 자동으로 체크해 준다면 개발자는 문서로 된 컨벤션을 확인하느라 고생하지 않고 프로젝트 표준에 적합한 코드를 작성하는게 가능해 집니다.

이클립스 플러그인형태로 PMD를 사용해 보도록 하겠습니다. PMD 이클립스 플러그인을 설치하는 가장 손쉬운 방법은 Update 사이트를 이용하는것입니다.
  1. 이클립스를 실행한다.
  2. Help -> Software Updates -> Find and Install 선택
  3. Next를 누르고 New remote site를 선택
  4. Name에 PMD, URL에 http://pmd.sf.net/eclipse를 입력하고 엔터를 누른다.
사용자 삽입 이미지

몇가지 물어보는 과정을 거치고 나면 설치가 완료되고 이클립스를 재시작 하라는 메시지가 나옵니다. 재시작하고 Window -> Preferences로 가보면 PMD라는 메뉴가 추가된걸 확인할 수 있습니다.
사용자 삽입 이미지

PMD를 가지고 자바소스를 리뷰해 보도록 하겠습니다. 테스트로 사용할 솔스는 PetStore 2.0 입니다. 이클립스에서 자바 프로젝트를 하나 만들어서 PetStore 소스를 임포트합니다. Package Explorer에서 검토할 소스를 선택하고 PMD -> Check code with PMD를 선택합니다.
사용자 삽입 이미지

해당  소스가 위반하는 룰에대한 현황을 Violations Overview에서 볼 수 있습니다. 너무 많은 Violation이 있으면 Priority 수준을 1~5까지 선택적으로 볼수 있습니다. 오른쪽 상단의 여러색의 원형 블릿을 누르면 이를 조정하는게 가능합니다.
사용자 삽입 이미지

소스파일 하나가 아닌 프로젝트 전체에 대해 검사를 수행하고 그 결과를 보고 싶을수 도 있습니다. 만약 개발리더나 아키텍트라면 이런 일을 수행해야 할거 같습니다. 프로젝트를 선택하고 PMD ->Generate reports를 누릅니다. 그러면 reports 폴더가 생기면서 프로젝트 전체 소스에 대한 검사결과 레포트를 생성해 줍니다.
사용자 삽입 이미지

이렇게 진행하는건 IDE를 이용하여 개발을 진행하면서 PMD를 사용하는 경우라 말할수 있습니다. 이와 병행하여 빌드에 PMD를 끼워넣어서 같이 실행되도록 할 수도 있습니다. 다음번에 이에 대해 알아보도록 하겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
TAG PMD

WCF 라우터 만들기

Development/기술 2008/04/30 09:46 posted by k16wire
MSDN에 "WCF 라우터 만들기"라는 기사가 올라왔네요. 읽어보심 참고가 되실듯합니다.
WCF 라우터 만들기


크리에이티브 커먼즈 라이선스
Creative Commons License
TAG WCF

MDA툴 AndroMDA - 코딩

Development/자동화 2008/04/07 15:50 posted by k16wire
지난번에 작성한 모델을 가지고 코드를 생성합니다. 혹시 모델링이 힘드신 분을 위해 Magic Draw로 작성한 timeracker.xmi를 첨부합니다.



C:\timetracker 폴더에서 명령줄 창을 열고 다음과 같이 입력합니다.
mvn install
사용자 삽입 이미지

빌드가 성공적으로 끝나게 되면 common\target\src\org\andromda\timetracker 밑에 모델링한 클래스들이 생성되어 있는걸 확인할 수 있습니다.
  • UserService.java : 서비스 메소드에 대한 인터페이스
  • UserServiceImpl.java : 개발자가 실제로 비즈니스 로직을 구현하는 클래스
  • UserServiceException.java
  • UserVO.java
  • UserDaoImpl.java
이클립스에서 AndroMDA로 만든 프로젝트를 읽어들여 보겠습니다. 이클립스를 실행하고 timetracker 프로젝트를 import 합니다.
File > Import > Existing Projects into Workspace
사용자 삽입 이미지

지금부터는 이클립스를 이용하여 개발을 진행하면 됩니다. 개발이 진행되고 나면 Maven을 이용하여 JBoss에 배포하고 테스트하는게 가능합니다. handleGetAllUsers 메소드를 다음과 같이 구현합니다.
Collection userVOs = getUserDao().loadAll(UserDao.TRANSFORM_USERVO);
return (UserVO[])userVOs.toArray(new UserVO[0]);


크리에이티브 커먼즈 라이선스
Creative Commons License
TAG AndroMDA, MDA

MDA툴 AndroMDA - 모델링

Development/자동화 2008/04/07 13:13 posted by k16wire
안드로메다를 가지고 개발을 시작하기 위해서는 먼저 모델링을 해야 합니다. Magic Draw를 가지고 모델링하고 나중에 이 모델을 가지고 코드를 생성해 보겠습니다.

UML 모델링
UML 모델을 그리기 위해서 모델링 툴이 필요합니다. 안드로메다에서 권장하는 툴은 Magic Draw입니다. Magic Draw는 모델링 범위가 제한되어 있지만 자유롭게 사용이 가능한 Communitey edition을 제공합니다.
MagicDraw 9.5 SP1.1 Community edition Download(15.6 MB)
사실 안드로메다와 사용가능한 모델링 툴은 더 많이 있습니다. 더 자세한 정보는 다음 URL을 참고하세요.
CASE tools that have been tested for AndroMDA compatibility
MagicDraw를 설치하고 나면 프로그램을 실행하고 나서
C:/timetracker/mda/src/main/uml/timetracker.xml파일을 열어서 모델링을 시작합니다.
timetracker.xml 파일을 로딩하기 위해서는 안드로메다에 대한 UML 프로파일을 필요로 하는데 이를 설정해 주어야 합니다. andromda의 Magic Draw UML Profile은 Maven Repository에 이미 들어있습니다.
.m2\repository\org\andromda\profiles
timetracker.xml 파일 안에 보면 아래와 같이 UML Profile에 대한 경로가 지정되어 있는걸 찾을 수 있습니다.
<mdElement elementClass='FileProperty'>
  <value>&lt;maven2.repository&gt;\org\andromda\profiles\uml14\
andromda-profile\3.2\</value>
  <selectionMode xmi.value='0'/>
</mdElement>
이 timetracker.xml 파일을 MagicDraw가 읽어들이기 위해서는 Maven과 Maven2에 대한 환경번수를 지정해 줘야합니다. 처음 파일을 읽어들일때 물어보는대로 경로를 찾아줘도 되며 미리 설정을 해도 됩니다.

MagicDraw를 실행하고 메뉴에서 [선택사항] >[환경변수]를 선택하여 다음과 같이 메이븐 레파지터리를 추가 합니다. 그러면 MagicDraw가 자동으로 UML Profile을 읽어들이게 됩니다.
사용자 삽입 이미지

timetracker.xml 파일을 MagicDraw에서 성공적으로 읽어들이면 다음과 같은 화면을 볼 수가 있습니다.
사용자 삽입 이미지

이제 모델링을 시작할 준비는 모두 끝났으니 실제로 모델을 작성해 보겠습니다. 처음 만들것은 ValueObject인 UserVO입니다.
  1. 마우스 오른쪽 버튼을 눌러서 [새요소] > [패키지]를 선택하여 org.andromda.timetracker 패키지를 만들고 그 밑으로 vo 패키지를 생성합니다.
  2. vo 패키지에서 [새 다이어그램] > [클래스다이어그램]을 선택합니다. 다이어그램의 이름은 Value Object 입니다.
  3. 다이어그램의 왼쪽 툴바를 이용해 아래 그림에서 보이는것처럼 UserVO 클래스와 UserVO[]클래스를 생성합니다.
  4. UserVO 클래스의 스테레오 타입은 <<ValueObject>>이며 id,username,firstName,lastName 네개의 속성을 갖습니다.
사용자 삽입 이미지

이번에는 UserService 서비스를 생성하겠습니다.
  1. service 패키지를 생성합니다.
  2. service 패키지에서 services 이름을 갖는 클래스 다이어그램을 생성합니다.
  3. 스테레오 타입이 <<Service>>이고 이름이 UserService인 클래스를 다이어그램에 추가합니다.
  4. public UserVO[] getAllUsers() 오퍼레이션을 클래스에 추가합니다.
사용자 삽입 이미지

이번에 생성할 클래스는 User 엔티티입니다.
  1. domain 패키지를 생성합니다.
  2. domain 패키지에서 Domain Objets 이름을 갖는 클래스 다이어그램을 생성합니다.
  3. 스테레오 타입이 <<Entity>>인 User 클래스를 다이그램에 추가합니다.
  4. 클래스 속성에서 꼬리표 값이 andromda.persistence.table에 USER라고 값을 입력합니다.
  5. username, firstName, lastName 속성을 User 클래스에 추가합니다.
사용자 삽입 이미지

User 엔티티 UserVO 간에 Dependency 관계를 맺어줍니다. Value Object 클래스 다이어그램에 domain 패키지에 있는 User 클래스를 가져와서 의존성 관계로 연결합니다.
사용자 삽입 이미지

UserService 서비스와 User 엔티티간에도 의존성 관계를 연결합니다. services 클래스 다이어그램은 다음과 같이 변경됩니다.
사용자 삽입 이미지

이것으로 모델링이 끝났습니다. 다음에는 이 모델을 가지고 코드를 생성해 보겠습니다.


크리에이티브 커먼즈 라이선스
Creative Commons License
TAG AndroMDA, MDA

Java Coding Convention

Development/기술 2008/03/23 03:16 posted by k16wire
개발할때 코딩 컨벤션 참 중요합니다. 그런데 너무 많으면 오히려 개발자들이 잘 안봐서 문제가 됩니다.
일반적인 자바 코딩 컨벤션은 SUN의 컨벤션입니다.
Code Conventions for the Java Programming Language
하지만 양이 좀 많죠. 한 페이지로 정리한 컨벤션도 있더군요.
Java Coding Conventions on One Page
사용자 삽입 이미지






크리에이티브 커먼즈 라이선스
Creative Commons License

MDA를 지원하는 툴

Development/자동화 2008/03/10 08:11 posted by k16wire
MDA는 그 특성상 실용적으로 구현하기 위해서는 툴 사용이 필수적입니다. MDA를 지원하는 툴을 찾아봤습니다.

상용 도구
  • ALTOVA : MagicDraw 에 번들로 제공되지만 다른 UML 도구도 아답터 형태로 지원이 가능.
  • MCC(Model Component Compiler) : InferData사의 상용 MDA 도구로 J2EE에 대한 코드 생성만을 지원
  • OptimalJ : 컴퓨웨어사 상용 MDA 도구로 PSM 변환을 위해 패턴화된 노테이션을 지원. 기존 UML 과는 조금 다른 노네이션을  사용한다.
  • SosyInc Modeler and Transformation Engine : UML 모델을 기반으로 사전에 정의된 애플리케이션 아키텍처와 비즈니스 규칙을 기반으로 GUI를 생성해주는 변환 엔진
  • Model-in-Action : Mia 소프트웨어가 지원하는 도구로 코드 생성, 모델변환을 지원.
  • MetaEdit+ : 언어정의와 코드 생성을 위한 통합 모델링 도구. 메타모델과 모델을 위한 XML과 SOAP/Webservice 인터페이스 지원.
  • MDAWorkbench : 텍스트와 모델 변환 툴셋. 모든 종류의 메타모델 지원. Eclipse의 EMF를 기반으로 한다. 세가지 에디션 지원(Free, Academic, Profession)
  • iQgen : 템플릿 기반의 도구로 XMI, XML, ECore와 같은 여러 포멧의 모델 지원, JSP 템플릿으로 템플릿 작성 지원
  • Acceleo : Eclipse기반의 도구로 메타모델 지원
  • jmatter :

오픈소스
  • AndroMDA : UML/XMI로부터 J2EE 코드를 생성하는 오픈소스 템플릿 툴. VTL 스크립트를 지원하며 넷빈의 MDR을 지원
  • Groovy MDA : 스크립트 언어인 그루비를 이용해서 UML로부터 코드를 생성해 내는 도구
  • Sculptor : MDSD, DDD를 지원하는 스프링 프레임워크 기반의 코드 생성을 지원하는 MDA 도구
  • Taylor : 루비온레일스를 기반으로 하는 MDA도구로 J2EE 애플리케이션 코드를 생성
  • OpenArchitectureWare : XMI와 통합되어 코드를 생성해주는 템플릿 기반의 프레임워크
  • Kermeta : OCL 지원, 이클립스 EMF의 확장셋, 이클립스 워크벤치형태로 메타 프로그래밍 환경
  • MOFScript :
  • MTF(The IBM Model Transformation Framework) :
  • The ATL Engine : 아틀라스 그룹에서 지원하는 모델 변환 언어와 툴킷, 이클립스 서브 프로젝트
  • General Model Transformer(GMT) : 이클립스 서브 프로젝트로 이클립스 플랫폼 기반의 모델 변환 기술.
  • OpenMDX : J2EE와 .NET에 대한 코드 생성을 지원하고 XMI를 지원하는 도구와 통합이 가능한 MDA 환경
  • XDoclet : 속성기반의 J2EE 코드 생성 도구. MDA 도구는 아니지만 활용도가 높음
  • Middlegen : JSBC, Velocity, Xdoclet, Ant 기반의 데이터베이스 코드 생성 도구
Reference : http://www.modelbased.net/mda_tools.html

크리에이티브 커먼즈 라이선스
Creative Commons License

'Development > 자동화' 카테고리의 다른 글

MDA툴 AndroMDA - 코딩  (0) 2008/04/07
MDA툴 AndroMDA - 모델링  (0) 2008/04/07
MDA를 지원하는 툴  (0) 2008/03/10
MDA툴 AndroMDA - 샘플 애플리케이션 TimeTracker  (0) 2008/03/07
MDA툴 AndroMDA - 설치 및 설정  (0) 2008/03/06
MDA툴 AndroMDA - 개요  (0) 2008/03/06
TAG MDA
안드로메다에는 빨리 안드로메다를 경험해 볼 수 있도록 간단한 근태관리 시스템을 샘플 애플리케이션으로 제공하고 있습니다. 다음 그림은 기존에 사용하던 타임카드를 나타냅니다.

사용자 삽입 이미지

다운로드 및 설치
안드로메다 사이트에 가서 샘플애플리케이션을 다운로드 받아서 C:\timetracker-completed폴더에 압축을 해제합니다. 폴더를 변경하면 샘플내의 pom.xml 파일을 변경해줘야 합니다.
C:\timetracker-completed폴더로 이동하여 명령줄 창에서 다음과 같이 입력하고 실행합니다.
mvn install
그러면 TimeTracker가 필요로 하는 모든 jar 파일을 자동으로 다운로드 하여 로컬 저장소에 넣어놓습니다.
사용자 삽입 이미지
C:\timetracker-completed\pom.xml 파일에 오류가 있는거 같습니다. 파일내용중에 <modules/>에 대한 부분이 있는데 pom.xml 파일을 열어서 아래와 같이 app 모듈을 주석처리 하셔야 위와같은 결과를 볼 수 있습니다.
<modules>
        <module>mda</module>
        <module>common</module>
        <module>core</module>   
        <module>web</module>  
        <!--module>app</module-->        
</modules>

Database 만들기

MySQL 데이터베이스에 timetracker라는 이름의 데이터베이스를 생성합니다. 그리고 timetracker라는 아이디를 가진 사용자를 생성하여 timetracker 데이터베이스에 대한 모든 권한을 줍니다. 사용자 암호 역시 timetracker 입니다. 그리고 나서 명령줄 창에서 다음 명령어를 실행합니다.
mvn -f core/pom.xml andromdapp:schema -Dtasks=create
쿼리문이 실행되면 timetracker 데이터베이스에 테이블이 생성됩니다.
사용자 삽입 이미지
MySQL 데이터베이스에 대한 드라이버가 없다는 오류가 발생할 수 도 있습니다. 이 경우에는 MySQL의 JDBC 드라이버 파일인 mysql-connector-java-5.0.8-bin.jar를 maven의 lib 폴더에 넣어주면 인식합니다.

샘플 데이터 추가
샘플 데이터가 들어있는 쿼리 파일은 C:\timetracker-completed\app\src\main\sql에 들어 있습니다.
static-data-insert.sql
test-data-insert.sql
이 쿼리파일을 이용해서 샘플데이터를 timetracker 데이터베이스에 추가합니다.

애플리케이션 배포
이제 Timetracker를 JBoss 서버에 배포하려고 합니다. 배포를 위한 EAR를 만들기 위해 다음과 같이 명령줄 창에서 입력하고 실행합니다.
mvn -f app/pom.xml -Ddeploy
app/pom.xml 파일에도 약간의 오류가 있습니다. pom.xml 파일 중간에 보면 <version>이 빠져 있는 부분이 2군데 있습니다. 이 부분을 추가해줘야 합니다.
<dependency>
                <groupId>${pom.groupId}</groupId>
                <artifactId>timetracker-common</artifactId>
                <version>${pom.version}</version>   
                <exclusions>
                    <exclusion>
                        <groupId>${pom.groupId}</groupId>
                        <artifactId>timetracker-mda</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.andromda.profiles.uml14</groupId>
                        <artifactId>andromda-profile</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>commons-digester</groupId>
                <artifactId>commons-digester</artifactId>
                <version>1.7</version>                  
                <exclusions>
                    <exclusion>
                        <groupId>xml-apis</groupId>
                        <artifactId>xml-apis</artifactId>
                    </exclusion>
                </exclusions>
</dependency>
명령이 성공적으로 실행되면 다음과 같이 JBoss의 default\deploy 위치에 timetracker-1.0-SNAPSHOT.ezr이 배포되었음을 알려줍니다.
사용자 삽입 이미지

애플리케이션 테스트
이제 JBoss를 실행하고 TimeTracker를 테스트해 볼 순서가 되었습니다. JBoss의 %JBOSS_HOME%\bin\run.bat 파일을 실행합니다. JBoss가 실행되고 TimeTracker가 올라오는것을 로그로 확인할 수 있습니다. 브라우저를 실행하고 다음 URL을 입력하여 TimeTracker를 시작합니다.
http://localhost:8080/timetracker
사용자 삽입 이미지

Username은 nbhatia, Password는 cooldude로 입력하고 Log In을 눌러서 TimeTracker로 로그인 합니다.
Search timecards를 눌러서 현재 타임카드를 조회해 볼 수 있습니다.
사용자 삽입 이미지

지금까지 안드로메다로 애플리케이션을 개발하는 방법에 대해 TimeTracker라는 샘플 애플리케이션을 통해서 살펴봤습니다. 다음에는 좀 더 상세하게 들어가 보도록 하겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
TAG MDA

MDA툴 AndroMDA - 설치 및 설정

Development/자동화 2008/03/06 08:52 posted by k16wire
안드로메다를 직접 써보도록 하겠습니다. 안드로메다를 사용하기 위해서 미리 설치/설정 해야 하는 사항이 몇가지 있습니다.

안드로메다를 사용하기 위해 설치해야 하는 도구
  1. JDK : 1.4이상, 필수
  2. Maven : Maven 2.0, 필수
  3. JBoss or Tomcat : 직접적으로 관련은 없지만 생성한 코드를 배포할때 사용, 선택
  4. MySQL : 직접적으로 관련은 없지만 코드를 생성하여 테스트 할때 필요, 선택
  5. Eclipse : 생성된 코드 테스트를 위해 필요, 선택
환경설정
  • 환경변수 추가 : JAVA_HOME, MAVEN_HOME, JBOSS_HOME, CATALINA_HOME, PATH
  • path에 추가 : java와 maven의 bin 위치를 path에 추가
각 환경변수들은 위에서 설치한 도구들의 홈 디렉토리를 가리키는 변수들입니다.

Maven 설정
먼저 홈 디렉토리에 build.properties 파일을 추가합니다. 윈도우즈라면 홈 디렉토리 위치는 C:\Documents and Settings\[계정] 입니다.
build.properties 파일은 Maven을 위한 리모트 레파지터리 위치를 정의하는 파일로 파일 내용은 다음과 같습니다.
maven.repo.remote=http://repo1.maven.org/maven/,
http://www.ibiblio.org/maven,http://team.andromda.org/maven
Maven AndroMDA 플러그인 설치
  1. AndroMDA 플러그인 다운로드
  2. maven 레파지터리(C:\Documents and Settings\your user name\.m2\repository)에 압축을 풀어서 복사
  3. 임시폴더를 만들어서 다음 내용을 갖는 pom.xml 파일을 만듭니다.
  4. 인자없이 mvn을 실행합니다.
  5. 임시폴더를 삭제합니다.


more..


Maven의 컴맨드 라인 명령어에 익숙하지 않으신 분들은 Command Line Reference를 참고하시면 이해에 도움이 될거 같습니다.

Eclipse 설정
이클립스를 설치하고 나서 클래스 변수에 maven 레파지터리(C:\Documents and Settings\your user name\.m2\repository)를 M2_REPO로 정의해야 합니다.

이 정도면 안드로메다를 사용하는데 필요한 설치/설정은 된거 같습니다. 다음에는 안드로메다가 제공하는 샘플을 가지고 직접 사용해 보겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

MDA툴 AndroMDA - 개요

Development/자동화 2008/03/06 08:52 posted by k16wire
안드로메다라고 부르는 AndroMDAUML 모델을 기반으로 J2EE, .NET 코드 생성을 지원하는 템플릿 기반의 프레임워크 입니다. 다른 MDA 도구와 달리 Spring, jBPM, Struts, JSF, Hibernate와 같은 프레임워크에 코드 생성을 직접 지원합니다. 원하는 UML 도구로 생성한 모델을 기반으로 코드를 생성 할 수 있습니다.

사용자 삽입 이미지

현재 안드로메다 최신버전은 4.0입니다면 여기서는 3.2버전을 기준으로 기본적인 특징들을 살펴보겠습니다.
UML 버전
안드로메다는 현재 UML 1.4를 지원합니다.(2008/02/19 현재) UML 2.0은 개발중에 있습니다.
UML 툴 지원
MagicDraw, Poseidon, Enterprise Architect를 지원합니다. 더 자세한 UML툴에 대한 안드로메다 호환성 테스트 결과는 CASE tools that has been tested for AndroMDA compatibility를 참고하세요.
카트리지
AndroMDA 4.0이 현재 지원하는 카트리지를 나열해 보겠습니다.
  • Spring
  • EJB 2/3
  • Webservices
  • JSF
  • XSD
  • .NET
  • Hibernate
  • Struts
기존 카트리지를 수정해서 자신만의 카트리지를 만들수도 있습니다. 메타 카트리지라고 부르는 기존 카트리지를 카트리지 툴킷을 이용해서 수정하게 되면 새로운 카트리지를 만들 수 있고 이 카트리지로 UML 툴을 이용해서 소스 생성이 가능합니다.
IDE
안드로메다는 이클립스 플러그인 형태로 설치가 됩니다.
템플릿
Velocity, FreeMarker를 지원합니다.
텍스트 생성
소스코드, SQL, HTML, O/R 맵핑 파일 생성이 가능합니다.

이런 특징을 갖고 있는 안드로메다로 어떤일을 할 수 있는 걸까요 ? 다음과 같은 아키텍처를 갖는 엔터프라이즈 애플리케이션을 만든다고 가정 해 보겠습니다.
사용자 삽입 이미지

레이어드 아키텍처는 아키텍처를 정의하는데 가장 많이 사용되는 아키텍처 스타일입니다. 각 레이어별 설명은 생략하겠습니다. 이런 아키텍처를 가진 애플리케이션을 안드로메다로 개발하려면 각 레이어 별로 사용하는 기술셋이 맵핑되어야 합니다.
사용자 삽입 이미지

안드로메다를 이용하면 오른쪽에 나와있는 기술셋으로 구현된는 J2EE 애플리케이션을 모델로부터 생성해 내는게 가능합니다. 프레임워크를 위한 설정파일은 자동으로 생성되며 개발자는 비즈니스 로직 구현에만 전념하면 됩니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
TAG AndroMDA, MDA
AgitarOne이 만들어 주는 테스트 코드는 어느정도 수준일까요 ? 소스코드에 따라서 달라지기 때문에 여러 소스를 가지고 확인해 보도록 하겠습니다.

먼저 간단한 Value Object 수준의 Java Bean 클래스를 가지고 테스트 코드를 만들어 봤습니다. (AddressBean.java)
생성자와 각각의 getter, setter 쌍들에 대한 테스트 메소드가 생성되는 군요.
사용자 삽입 이미지

이번에는 좀 더 복잡한 메소드 내에 if 문이 있는 경우의 소스를 가지고 테스트 코드를 만들어 보겠습니다. (AutoCompleteBean.java)
사용자 삽입 이미지

메소드의 인자가 객체여서 인자를 만드는 로직이 복잡하기는 한데 다른 부분만 비교해 보니 if 문에 의한 경우의 수만큼 테스트 코드가 생성됩니다.
사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지

이번에는 for 루프와 if문이 같이 있는 더 복잡한 경우를 가지고 테스트 코드를 만들어 봤습니다. (CaptchaValidateFilter.java)

결과는 기대했던것 보다 테스트 코드의 양이 적게 나왔습니다. if문의 모든 경우와 for문의 모든경우의 곱이 나올거라 생각했는데 막상 결과를 보니 for문의 경우의 수만큼만 생성해줍니다. 코드를 보니 내부에 if문의 경우의 수도 모두 만족하고 있네요. (그래서 더이상 만들필요가 없었나 봅니다.)
사용자 삽입 이미지

하단의 뷰를 보면 각 테스트 클래스 별로 현재 상태와 테스트 커버리자가 보여집니다.
사용자 삽입 이미지

이외에도 Framework 기반의 코드나 EJB 등등에 대한 검토가 더 필요할 거 같습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License