자바 소스를 컴파일하면 바이트 코드로 쓰여진 클래스파일이 만들어집니다. 이 클래스파일에는 유용한 정보가 많이 담겨 있기 때문에 이를 잘 활용하게 되면 소스코드로 불가능한 것도 가능합니다.
그 첫번째로 디컴파일(Decompile)입니다. 디컴파일은 클래스파일로 소스파일을 만드는 과정을 말하는것으로 가장 널리 사용되는 디컴파일러에는 JAD가 있습니다.
자바는 플랫폼 독립성을 위해 C/C++와 같이 바이너리 컴파일을 하는게 아니라 중간 바이트코드로(Intermediate Byte Code)로 컴파일 되기 때문에 이렇게 디컴파일이 가능한 것 입니다.
하지만 디컴파일된 코드를 다시 컴파일 하는것은 문제가 발생할 수 있습니다. 왜냐면 디컴파일 과정에 정적변수와 같은 것들이 실제값으로 치환되면서 발생하는 모호성(Obfuscation) 때문입니다. 이 모호성을 잘 이용하게 되면 자바 디컴파일을 막는 효과도 가져올 수 있습니다. Reflection이나 Serialization 과 같은 기술을 적절히 활용하는것이 좋으며 이를 위한 툴로는 Zelix KlassMaster가 널리 사용됩니다.
반면에 장점도 있습니다.
코멘트가 없는 소스를 얻을 수 있기 때문에 정확한 LOC를 얻을 수 있습니다.
바이트코드로 바뀌는 중에 최적화가 이루어져서 메소드에 대한 정리가 가능합니다. 예를 들어 단 한번만 호출되는 메소드인 경우에는 호출하는 코드에 포함되어져 버립니다.
옵션값을 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
애플리케이션을 개발하다 보면 설정정보를 저장해야 하는 경우가 꼭 있습니다. 이런 경우 정보가 간단하면 *.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 변수를 선언합니다.
간단히 설명을 해보겠습니다. 먼저 sample.properties파일을 읽어들이고 나서 Key1, Key2에 해당하는 값을 읽어 들여서 출력합니다. 그리고 Key1에 해당하는 값을 변경하고 이를 저장합니다.
(폴더를 새로고침하면 파일이 실제로 변경되었음을 확인할 수 있습니다.)
두번째로 sample2.properties 파일을 읽어들이고 다시 Key1에 맞는 값을 읽어 들입니다. properties 파일이 다르기 때문에 값이 다름을 확인할 수 있습니다.
properties 파일에 대한 처리는 간단하지만 꼭 필요한 기능입니다. 위 프레임워크를 이용하게 되면 아래처럼 프로퍼티에 주석을 단다거나 변수를 사용하는것도 간단하게 구현할 수 있습니다.
지난번에 성공적으로 배포해서 브라우저를 이용해 서비스를 테스트 해봤습니다. 에러가 났죠. 에러가 발생한 이유는 권한 때문입니다. IIS7이 사용하는 계정의 사용자가 실제로 애플리케이션이 있는 위치에 접근이 안되기 때문에 에러가 발생했습니다. 이를 해결하기 위해서 IIS7이 사용하는 IIS_IUSRS 사용자를 해당 애플리케이션이 있는 위치에 대한 공유설정에 추가해 줍니다.
다시 한번 브라우저로 테스트 해 보시기 바랍니다. 또 에러가 날겁니다. 하지만 이번에는 이전과 다른 에러입니다. 이 에러가 발생하는 이유는 바로 처리기 맵핑에 있습니다. 저희가 배포한 확장자가 .svc인 WCF서비스를 처리할 수 있는 기능이 IIS에 맵핑되어 있지 않습니다.
그럼 적당한 맵핑기를 설치해 보겠습니다. 다시 프로그램 제거 또는 변경 > Windows 기능 사용/사용 안함으로 가서 Microsoft .NET Framework 3.0의 WCF HTTP Activation이 설치되어 있는지 확인해 보시기 바랍니다.
위 기능이 설치가 되면 IIS의 처리기 매핑기에서 아래처럼 .svc에 대한 처리기가 연결되어 있는것을 확인할 수가 있습니다.
이제 모든 준비가 끝난것 같습니다. 다시 브라우저를 이용해서 테스트해 보겠습니다. 이전에 배포한 ProductsService를 구현한 ProductsServiceImpl 서비스에 대한 정보가 나타납니다.
IIS에 서비스를 호스팅 했으니 이제는 클라이언트를 구현해서 서비스를 테스트해봐야 겠네요. :-)
.NET Framework 3.0 WCF에서 서비스의 프록시 클래스를 만드는데 사용하는 유틸리에 svcutil.exe 가 있습니다. 이 유틸리티를 처음 실행하면 다음과 같은 에러가 발생합니다.
svcutil ProductsService.dll
그래서 구글링으로 찾아보니 다음과 같은 처리를 해줘야 하더군요.
명령어 창을 연다.
C:\Program Files\Microsoft SDKs\Windows\V6.0A\Bin 폴더로 이동한다.
sn -Vr svcutil.exe 를 실행한다.
이 에러는 svcutil이 Strong Name으로 검증이 안되서 발생한다고 하는데 이게 정확히 뭘 의미하는지는 잘 모르겠습니다. 더 찾아봐야 겠습니다. 제가 해결책을 찾은 곳은 여기 입니다. 이렇게 하고 나서 다시 svcutil로 서비스의 프록시 클래스를 생성해 봤습니다.
wsdl과 xsd 파일들이 잘 생성된것을 확인할수 있었습니다. 이제 이 파일들을 가지고 실제로 사용할 프록시 클래스를 만들어 보겠습니다.
프록시 클래스인 Products.cs 파일이 잘 만들어 진게 보이네요. 알고나면 간단한데 왜 처음 봤을때는 이리 어려운지..간단하게 svcutil로 WCF 서비스의 프록시 클래스 만드는걸 정리해 봤습니다. 위에서 사용한 샘플코드는 일전에 올린 예제에 같이 들어있습니다. 혹시 없으면 다음 포스트인 클라이언트 만들기에서 올려드리겠습니다. 열공하세요. ^^
이제 본격적으로 책의 예제를 실행하기 위한 환경구성에 들어가려 합니다. 책이 없어도 개발환경을 꾸미는 연습으로 따라 하셔도 됩니다.
Microsoft Enterprise Library 설치 MS Enterprise Library는 .NET을 가지고 엔터프라이즈 시스템을 개발할 때 사용할 수 있는 여러가지 유용한 기능을 가지고 있는 일종의 비즈니스 프레임워크라고 부를수 있습니다. 제가 사용한건 2006년 1월 버전(책의 CD버전)입니다만 최신버전은 2007년 5월에 릴리즈된 Enterprise Library 3.1 입니다.
setup을 실행해 보면 다음과 같이 캐싱, 로깅, 예외처리, 보안과 같은 여러 모듈이 들어있습니다. 그중에서 예제에서 사용하는 부분은 데이터에 대한 부분입니다.
다음을 누르면 설치가 진행되고 중간에 컴맨드 창이 열리면서 필요한 파일들이 설치가 됩니다.
Microsoft Enterprise Library 설정 설치가 완료되었으면 샘플 DB를 설정하기 위한 작업을 진행합니다. 메뉴에서 Enterprise Library Configuration 을 실행합니다. 왼쪽 트리에서 마우스 컨텍스트 메뉴를 이용해 새로운 Data Access Application Block을 생성합니다.
이때 Name과 ProviderName은 다음과 같습니다. 참고하세요.
이번에는 Database 부분을 수정합니다. 주의할건 수정할 부분이 Name이 아니라 Value 라는것.
그 밑에 있는 Server와 Integrated Security 부분은 기본 설정을 그대로 사용합니다. Server의 경우 SQL Server Expression을 사용하는게 기본설정이고 Integrated Security는 SSPI가 기본입니다.
간단하게 Enterprise Library 설치와 설정을 정리해봤습니다. 책이 마무리 되면 좀 더 많은 기능을 써보고 정리해 보려합니다. 공부할것 참 많네요. ^^
어제 "WCF 책 번역 마무리 작업이 한창 진행중이다"라고 포스팅을 했습니다. 오늘은 그에 이어서 Windows Vista에서 WCF 예제를 실행하기 위한 개발환경 꾸미기에 대해 써보려고 합니다.
책에서 가이드 하고 있는 WCF 개발환경은 책이 쓰여진 시점을 기준으로 하기 때문에 지금하고 많이 다릅니다.
.NET Framework 3.0 설치
Visual Studio 2005 Extentions for .NET Framework 3.0 설치
Microsoft Enterprise Library 설치
AdventureWorks Database 설치
하지만 지금은 Visual Studio 2008 베타버전이 이미 나와있기 때문에 귀찮게 Visual Studio Extention을 따로 설치할 필요가 없어졌습니다. 이미 2008에 .NET 3.0을 위한 프로젝트 템플릿이 모두 들어있습니다. .NET Framrwork 3.0도 Vista에는 이미 설치되어 있죠. 그러니 이렇게 줄어 듭니다.
Microsoft Enterprise Library 설치
AdventureWorks Database 설치
즉 Windows Vista + Visual Studio 2008을 사용하면 WCF를 개발에 빌요한 환경을 즉시 갖출수가 있습니다. 이후 WCF를 공부하실 분들은 저 궁합으로 사용하시길 권장합니다.
스프링은 그 기능에 따라 모듈을 단위로 구분할 수가 있는데 총 7개의 모듈로 이루어져 있다 - Core, Context, DAO, ORM, AOP, Web, MVC
모든 모듈은 Core를 기반으로 하며, 이 외의 모듈은 반드시 사용해야 하는것은 아니다. 필요에 따라 사용하면 된다.
Core
프레임웍의 근간이 되는 부분으로 Ioc와 Dependency Injection과 같은 스프링의 핵심이 되는 특징을 제공한다. BeanFactory를 통해 실제 로직의 구현과 설정을 분리할수 있게 해준다.
Context
JNDI, i18N, 서블릿 컨테이너, 리소스 로딩등과 같은 프레임워크로 제공해야 하는 여러 특징들을 제공한다.
DAO
벤더별로 JDBC코딩을 하지 않아도 되도록 JDBC 추상화 기능과 POJO에서 트랜젝션 관리를 할수있는 기능을 제공한다.
ORM
J2EE에서 즐겨 사용되는 Hibernate, iBatis, JDO, JPA와 같은 OR 멥핑 API와 연계할수 있는 통합 레이어를 제공한다. 이러한 API들과 연계할수 있는 트랜젝션 서비스도 제공한다.
AOP
스프링은 AOP Alliance를 따른 AOP를 제공하며 소스 수준의 메타데이터 프로그래밍을 지원한다.
Web
Multipart 파일업로드, 서블릿 리스너를 이용한 IoC 컨테이너등 웹 어플리케이션을 위한 기능을 제공한다. WebWork이나 Struts같은 웹 프레임워크와 통합도 지원한다.
스프링 프레임워크로 무엇을 할수있는지 알아보는 가장 좋은 방법은 실제로 스프링으로 작성된 어플리케이션을 실행해 보는것이다. 스프링은 6개의 샘플 어플리케이션을 제공한다. 각 샘플이 보여주는 스프링의 특징을 간략히 알아보자.
countries
페이지 리스트 네비게이션
로케일
뷰를 이용한 페이지 구성
PDF와 엑셀파일 생성 imagedb
BLOB/CLOB 처리
네이티브 연결
파일업로드
벨로시티(Velocity)와 통합 jpetstore
iBATIS 연동
스프링 웹 MVC
스프링기반의 원격처리 petclinic
Hibernate 연동
JMX
JTA petportal
포틀릿 showcases
dynamic : 그루비(groovy) 연동
formtags : MVC 폼 태그
java5-dao :
mvc-connvention
각 샘플을 돌려보기 위해서는 JBoss나 Tomcat과 같은 컨테이너, MySQL이나 HSQL과 같은 데이터베이스가 필요하다.
JPetStore 설치 및 실행
JPetstore는 J2EE의 대표적인 샘플 애플리케이션 PetStore를 스프링과 iBATIS 기반으로 커스터마이징한 버전이다. 간단하게 HSQL 데이터베이스와 톰캣을 이용하여 JPetstore를 실행해 보자. 실행단계를 스텝바이 스텝으로 적어보면 다음과 같다.
- JDK 1.4.x 이상 설치
- JAVA_HOME 변수를 환경변수에 추가
- ANT 1.5 이상 설치
- ANT의 실행파일을 Path에 추가
- %SPRING_HOME%/samples/jpetstore/ant warfile 로 war 파일 생성
- %SPRING_HOME%/samples/jpetstore/dist/jpetstore.war 파일을 Tomcat의 webapp로 복사하고 톰캣을 실행한다.
- %SPRING_HOME%/samples/jpetstore/db/hsqldb/server.bat 로 HSQL DB실행
- 웹브라우저에서 http://localhost:8080/jpetstore URL 입력
모든 단계가 제대로 수행되고 나면 아래와 같은 결과 화면을 볼수있다. 다른 샘플도 비슷한 단계를 통해서 실행이 가능하니 직접 실행해 보기 바란다.
스프링 프레임워크를 제대로 이해하기 위해서는 많은 공부가 필요하다. 관련 서적들이 시중에 많이 나와있어서 이를 소개한다.
첫번째 소개할 책은 Manning사의 유명한 in Action 시리즈의 스프링 버전인 스프링 인 액션이다.
원서를 번역한 책으로 에이콘에서 출판되었다. in Action 시리즈 답게 실용적으로 잘 쓰여진 책이다. 다만 스프링의 버전이 1.2.7을 기준으로 하는게 아쉽다. 반드시 2.0을 써야 하는 분이 아니라면 무리 없을거 같다.
두번째 소개할 책은 자바지기로 유명한 박재성님이 직접 쓰신 Spring 프레임워크 워크북이다.
워크북이라는 말에 번역서인줄 알았는데 저서라서 조금은 놀라기도 했다.
내가 알기로는 스프링관련한 저서는 유일하다. 국내서가 드문 현실을 미루어 봤을때 내용을 떠나서 참 반가운 책이다.
스프링 프레임워크는 Java/J2EE 애플리케이션을 개발하기 위한 프레임워크이다. 이 프레임워크은 로드존슨(Road Jonhnson)이 Expert One-on-One J2EE Design and Development라는 책을 2002년도에 처음 출간하면서 부터 시작되었다. 이 책에는 스프링이 가져가고자 하는 철학이 모두 담겨있으니 꼭 한번씩 읽어보기를 권한다.
스프링 프레임워크의 공식 사이트에 가보면 "우리의 미션(Mission Statement)"이 자랑스럽게 쓰여있다. ^^
이를 읽어보면 스프링의 특징을 파악하는데 많은 도움이 된다.
J2EE는 사용하기 쉬어야 한다.
클래스보다는 인터페이스를 사용해야 한다.
JavaBean이 어플리케이션을 설정하는데 가장 좋다.
OO 디자인이 중요하다.
Java는 Exception을 처리가 너무 많다.
Testability가 중요하다.
스프링 프레임워크의 특징
스프링에 대해 본격적으로 들어가기에 앞서 간단하게 스프링이 갖고 있는 특징을 한번 정리해 보자.
The most complete lightweight container
A common abstraction layer for transaction management
A JDBC abstraction layer
Integration with Toplink, Hibernate,JDO,and iBATIS SQL Maps
AOP functionality
A flexible MVC web application framework
각 특징이 뭐라고 구구절절 설명하지 않고 키워드만 뽑아봐도 스프링이 J2EE의 주요 프레임워크나 개념들과 깊은 관련이 있다는걸 알수있다.
스프링 프레임워크를 사용하면 뭐가 좋은가 ?
스프링을 사용하는데는 여러가지 이유가 있겠지만 아무래도 가장 큰 부분은 개발이 쉬어진다는 사실일 것이다. 코딩-테스트로 이루어지는 작업에 EJB를 사용하면서 코딩-배포-테스트로 복잡해지고 이 과정에서 작업시간이 많이 걸린다. 이과정을 단순화함으로서 다양한 장점들을 얻을수가 있게된다.
위 4가지를 다 설치하고 나면 Visual Studio의 프로젝트 템플릿에 WCF, WPF, WWF에 대한 것들이 추가된다. Windows 2003Server를 기준으로 위와 같은 환경을 구성하기 위해서는 최소 20기가 이상의 디스크 용량이 필요하다. 만약 DB와 연동하기 위해서 SQL Server를 설치한다면 이는 별도로 더 고려해야 한다.