스프링 프레임크를 사용하기 시작한지는, 만 5년 정도 된것 같다. 아니 정확하게 이야기하면 알기 시작한지 5년이다. 그 동안 몇개의 프로젝트에는 적극적으로 사용해왔고, 사용하려고 했었다.

솔루션을 위한 내부의 기반 프레임워크를 개발하기에도, 그 자체만으로도 스프링은 너무 훌륭하기 때문에, Application의 공통 부분을 위한 기능들만을 최적화하고, 정의하는 것 만으로도 노력대비 좋은 결과들을 낼수 있었다. 다 로드존슨 아저씨가 많은 시간을 들여서 갈고 닦고, 발전시킨 노력의 결과들이다.

시간이 흐를수록 큰 조직에서는 코드와 PC와 씨름하기 보다는 수 많은 회의와 씨름을 하는 일이 많아진다. 더군다나 같이 협업하는 사람들이 많아지면, 본인이 원치 않아도 관리자의 길에서 뛰고 있는 모습을 보게된다. 딱 지금의 나의 모습니다.

공부하지 않고, 적절하게 판단하고 선택하고 방향에 대해서 이야기 할 수 있을까?
많은 고민을 하지만, 역시 시간이 절대적으로 부족하다.

요즘은 코드를 보기가 힘들정도로, 공부할 여유가 별로없다.
하지만, 사둔 책이 아깝다는 이유이든, 공부의 재미를 알았다는 이유이든 개발자로 살아가는 한은
꾸준히 배워야한다.

스프링 3.1은 또 다른 변호들을 이야기 할지는 모르겠다. 이전에 책을 보면서 정리한 내용인데 일단 올려놓는다.

[Spring Framework 3.0 - MVC]

·         스프링은 DespatcherServlet 7개의 Strategy를 기반한 MVC 프레임워크를 제공한다.

·         이중 DespatcherServlet는 가장 기본적이면서도 SpringMVC의 필수적인 기본 Servlet 역할과 스프링의 특징중의 하나인 Light-weight 컨테이너의 역할을 수행한다.

 

1.     @RequestMapping 핸들러 매핑

o    @MVC는 메소드 레벨에서 컨트롤러를 작성할 수 있다.

o    Annotation은 타입(클래스, 인터페이스)레벨뿐 아니라 메소드 레벨에도 적용 가능함.

o    @MVC 핸들러 매핑을 위해서는 DefaultAnnotationHandlerMapping이 필요하다.

o    DefaultAnnotationHandlerMapping은 기본 핸들러 이므로 다른 Handler Mapping bean이 명시적으로 등록이 되지 않았다면, 기본으로 사용이 가능하다.

o    만약, 다른 핸들러 매핑 빈이 등록이 되었다면, DefaultAnnotationHandlerMapping
명시적으로 등록을 해주어야 사용이 가능하다.

2.     Class/Method 결합 Mapping 정보

o    DefaultAnnotationHandlerMapping

·         @RequestMapping 애노테이션을 활용해서 타입레벨과 메소드 레벨 지원하며
타입레벨을 기본으로 삼고, 메소드 레벨의 어노테이션 정보는 타입레벨의 매핑을 세분화 하는데 사용한다.

o    @RequestMapping Annotation

·         Spring[] value(): URL 패턴

1.     String 배열 타입으로 URL 패턴을 지정해서 사용

2.     URL 패턴은 ANT 스타일과 와일드카드를 사용이 가능하다.

·         @RequestMapping("/hellow")

·         @RequestMapping("/admin/**/user")

·         @RequestMapping("/hellow", "/hi")

3.     "{ }"를 사용할때는, "{ }"의 위치에 해당하는 내용을 컨트롤러 Method에서 파라메터로 전달받을 수 있다. "{ }"에 들어가는 변수를 "path variable"이라고 부른다.

·         @RequestMapping("/user/{userid}")

·         RequestMethoe{} method(): HTTP Request Method

1.     Request Method GET, HEAD, POST, PUT, DELET, OPTIONS, TRACE 7개의 HTTP 메소드가 정의되어 있다

2.     HTTP 메소드를 추가하면 요청 메소드에 따라 다른 메소드를 매핑해 줄 수 있다.

·         @RequestMapping(value="/user/add", method=RequestMethod.GET)

3.     정의된 메소드 이외의 사용시 "HTTP 405 - Method Not Allowed"를 받음.

4.     타입레벨에서 URL을 주고 HTTP 요청 메소드를 지정할 경우 URL 생략가능.

·         @RequestMapping(method=RequestMethod.GET)

·         String[] params(): Request Parameter

1.     이것은 요청 Parameter와 그 값을 비교해서 매핑해 주는 것이다.

2.     같은 URL을 사용하지만, Parameter값에 따라 다른 작업을 할 때 사용한다.

·         @RequestMapping(value="/user/edit", params="type=admin")

3.     특정 Parameter 값이 존재하지 않아야 한다는 조건을 둘 경우 사용

·         @RequestMapping(value="/user/edit", params="!type")

·         String[] header(): HTTP 헤더

1.     Header 정보에 따라 매핑이 가능하다.

·         @RequestMapping(value="/view", headers = "content-type="text/*")

 

o    Type level 매핑과 Method level 매핑의 결합

·   타입(클래스오 인터페이스)레벨에 붙는 @RequestMapping은 타입내의 모든 매핑용 메소드의 공통 조건을 지정할대 사용한다.

·   메소드 레벨의 매핑은 클래스 레벨의 매핑을 상속한다.

      1. 컨트롤러가 각각 /user/add, /user/edit, /user/delete URL에 매핑

@RequestMapping("/user")

public class UserController{

@RequestMapping("/add") public String add(){ }

@RequestMapping("/edit") public String edit(){ }

@RequestMapping("/delete") public String delete(){ }

}

2.     타입 레벨의 URL패턴에 * **를 사용하여 매핑 가능

·         /user/*

·         /user/**  

·         타입레벨에서 공통의 매핑을 정의하고, 메소드 별로 세분화 해서 사용

 

o    Method 레벨 단독 매핑

·   공통 매핑 조건이 없을 경우, 조건을 주지 않고 메소드 레벨에 정의해서 사용.

·   이렇게 정의하지 않는다면, 클래스 자체가 매핑이 되지 않는다.

·   만약, @Controller 애노테이션을 붙여서 자동 빈 스캔을 사용할 경우는, 클래스 레벨의 @RequestMapping을 생략할 수 있다.

o    Type 레밸 단독 매핑

·   클래스 레벨의 URL 패턴이 /*로 끝나는 경우, apthem 레벨의 URL 패턴으로 메소드 이름을 사용할 수 있음.

·   아래는 /user/add /user/edit 로 각각 매핑

@RequestMapping("/user/*")

Public class UserController {

@RequestMapping public String add( ) { }

@RequestMapping public String edit( ) { }

}

 

 

 

 

 

Posted by 행복상자

오늘 갑자기 10년전에 리눅스에서 개발하면서 사용했던 Vi 에디터가 생각이 나서 몇가지 자료와 웹사이트를 두루 돌아 다녔다.

Eclipse용은 특별히 강추하는 글들이 없어서, 하나씩 설치해 봐야할 것 같은데, 하필 처음 설치한 것이 유료 버전이어서, 무시 무시한 팝업창에 놀라곤 한다. 그러나 가벼우서 나쁘지는 않다는 것이 나의 첫인상이다.

아래는 오늘 다녀왔던, 그리고 설치한 vim에 대한 링크아 정보 요약이다.


1.     Vim 설치하기

·         Vim 사이트: http://www.vim.org

·         Vim 다운로드: http://www.vim.org/download.php

o    OS Version 별로 download 가능함

o    필요한 버전을 다운해서 설치 가능함

·         Vim User Manual: http://www.vim.org/docs.php

o    다양한 형태의 매뉴얼과 문서가 있음.

o    Vim 5.7을 위한 pdf 매뉴얼은 아래 링크에서 다운로드 가능하나, 추천하지 않음)

·         : ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf

o    아래 사이트는 한번 볼만함: wiki book

·         http://www.swaroopch.com/notes/Vim_en:Table_of_Contents

o    기타 다른 문서는 시간 나는 대로 참조

·         PC버전 설치

o    Windows 버전과 Console 버전이 있음.

o    내가 설치한 것은 Console 버전과 Visual Studio로 제작된 버전

사용하는 큰 문제 없음

o    설치버전을 받지 않고, 압축파일로 묶인 버전 설치

PC에 흔적을 남기기 싫음.

2.     Eclipse Vim Plugin  설치

·         Viable 1.31.10 : http://viableplugin.com/

o    Eclipse.org에서 검색해서 찾음

·         설치 방법: Eclipse에서 아래와 같이 메뉴에서 추가한다.

o    Help > Install New Software > Add > http://viableplugin.com/update_site

·         설치를 하게 되면, 3가지 기본 모듈이 설치가 됨

o    Viable core plugin

o    Viable CDT feature

o    Viable JDT Feature

·         다큐멘트:

o     http://viableplugin.com/documentation/HomePage

·         Eclipse Vim : http://juan.boxfi.com/vim-color-schemes/#eclipse

o    다운하기: http://juan.boxfi.com/wp-content/uploads/2011/03/eclipse.vim_.gz

 

·         간단 사용

o 생각보다 가볍고 잘 동작한다. 명령이나 이에 대한 실행에 대한 분석은 시간이 필요함.

·         유의 사항

o 유료버전으로 라이선스 파일이 정상 설치하지 않으면, 당신을 죽일지도 모른다는
무시 무시한 메시지 창을 5분마다 띄우니 유의 할 것


 

Posted by 행복상자
아주 오래전, 사실은 몇 년전(3~4년전?)인것 같다. 
Twitter를 처음 사용하면서, Twitter의 Open API와 정책들을 살펴보다가, Twitter4J라는 Twitter API를 자바에서 쉽게 사용할 수 있는 라이브러리를 접했었다.
그 당시 몇개의 Library를 검토하다가, 일본인이 만들었더 Twitter4J가 여러가지로 사용하기도 쉽고 적합하다고 판단했었는데, 최근에 개인적으로 다시 살펴볼 일이 있어서, 다시 코드를 분석하게 되었는데, 내가 이전에 기억하던 코드와 전혀 다른 코드들로 구성되어 있었다.

클라스와 메스드들은 모두 Interface로 정의하고, 이를 구현하도록 Class 들이 Re-factoring 되어져 있었다.
코드들도 깔끔하게 정리되어 있고, 정비되어져 있었고, 예제들도 모두 셈플 소스코드를 포함해서 기능별로 나주어져 있었다. (지난 몇년동안 개발자가 많은 노력과 수고를 했던것을 볼수 있었다. 고맙네...) 

아마도, 추측컨데 Twitter4J가 지원하는 플랫폼들이 다양화되면서, 인터페이스와 구현 클래스로 재 구성을 한것으로 보인다. 프레임워크의 패키지 구성을 보면, Google App Engine와 Android 단말을 지원하기 위해서 자바 Package등으로 나누어져 있다.

이를 분석하기 위해서는 먼저 Twitter의 REST API 정책을 다시 한번 살펴 볼 필요가 있다. 지난 2년동안 여러가지 정책이 바뀌고 새로운 기능들이 추가 되었을 것으로 보인다.
전체를 다 살펴보기는 힘들것이고, 개발자 가이드 먼저 살펴 봐야 겠다.


 

'공부하는 것 > Twitter API & Twitter4j' 카테고리의 다른 글

Twitter REST API (2)  (0) 2011.10.24
Twitter REST API (1)  (0) 2011.09.14
Posted by 행복상자
내가 Virtual Box를 블로그를 통해서 소개한지 꽤 오랜 시간이 지났다.
가상화와 관련된 제품들이 많이 나오고, 또 앞으로도 유용하게 사용될 것이라는 점에 대해서는 크게 의심하지 않는 바이다.

내가 이 제품에 대해서 관심을 갖게 된 이유로는 무료로 사용할 수 있으면서도 기능과 버전이 빠르게 올라갈 만큼 사용자가 원하는 기능들을 지속적으로 개발해 나가고 있었기 때문이다. 더군다나 메뉴와 도움말을 한글로 지원하기까지 했다.

이 제품은 원래는 Sun에서 개발하던 제품이었는데, 오라클로 합병하면서 오라클에서 제공하던 오라클 VM 서버 제품군과 중복이 되어서, 추가 개발이 이루어 지지 않을지 걱정했었다. 선과 오라클과의 합병은 개인적으로는 별로 바람직한 방향이 아니고, 단지 비즈니스적으로 주도권을 유지하는 측면으로만 진행될거라 예상했고, 실제로 이러한 우려와 예측은 틀리지 않았다.

이러한 와중에서 며칠전, 지난 12월 22일자로 Virtual Box의 새로운 버전인 4.0 버전이 Release 된것은 굉장히 놀라운 소식이었다.

4.0 버전으로 릴리스 하면서, 추가된 기능과  변경되 몇가지 주요 Feature들은 다음과 같다.

1) File Location 
   - VirtualBox의 Configuration 파일들과 disk 이미지 파일들이 다른 위치(폴더)에서
      관리되었으  나, 4.0에서는 동일한 디렉토리에 저장된다.
   - 기본 Configuration 파일의 확장자가 XML로 관리되었는데, 4.0 에서는 vbox로 변경되었다.
      그러나 내용은 이전과 동일하다.
   - 기본 저장 위치도 이전에는 .VirtualBox 였으나, VirtualBox VMs로 바뀌게 되었다.
      (윈도우즈 계열 OS의 사용자 Profile 디렉토리 아래 저장)
2) User Interface 변경
   - Virtual Machine 설정 화면이 좀더 사용성 있게 바뀌었고 실행되고 있는 또는 저장되어 있는
     이미지에 대한 Preveiw 기능이 들어갔다.
3) 아이콘을 통한 VM 이미지 실행하기
   - 실행을 하기 원하는 OS의 이미지를 바탕화면에서 실행할 수 있도록 아이콘을 생성해 준다.
4) Virtua 이미지 쉽게 삭제하기
   - 이지미 삭제시, 이와 관련된 이미자와 Confituration 파일들을 클릭 한번에 모두 삭제해 준다.
5) 네크워크 Boot와 가상 H/W 칩셋 설정하기
   - 네트워크 Booting을 지원하며, H/W에 대한 칩셋 종류에 대해서 설정 가능하다.
6) 더 많은 Host OS의 메모리의 할 당이 가능하다.
   - 초기의 VirtualBox 버전들에서는 1.5Gbyte 이상의 메모리 할당이 어려웠으나, 4.0에서는
     그 이상의 할당이 가능하다. 만약 32bit OS의 윈도우 7에서 할당한다면, 3Gbyte까지 가능.
7) Open Virtualization Format Archive (OVA) 지원
   - OVA 파일 포맷으로 Import/Export 가 가능하다. VmWare에서 생성한 파일의 사용 가능함.

그리고, 아래는 이번에 Release 된 VirualBox 4.0의 릴리즈 로그이다. 더 많은 변경 사항들은 아래 로그를
확인할 수 있다.

VirtualBox 4.0.0 (released 2010-12-22)

This version is a major update. The following major new features were added:

  • Reorganization of VirtualBox into a base package and Extension Packs; see chapter 1.5, Installing VirtualBox and extension packs, see the manual for more information
  • New settings/disk file layout for VM portability; see chapter 10.1, Where VirtualBox stores its files, see the manual for more information
  • Major rework of the GUI (now called “VirtualBox Manager”):
    • Redesigned user interface with guest window preview (also for screenshots)
    • New “scale” display mode with scaled guest display; see chapter 1.8.5, Resizing the machine’s window, see the manual for more information
    • Support for creating and starting .vbox desktop shortcuts (bug #1889)
    • The VM list is now sortable
    • Machines can now be deleted easily without a trace including snapshots and saved states, and optionally including attached disk images (bug #5511; also, VBoxManage unregistervm --delete can do the same now)
    • Built-in creation of desktop file shortcuts to start VMs on double click (bug #2322)
  • VMM: support more than 1.5/2 GB guest RAM on 32-bit hosts
  • New virtual hardware:
    • Intel ICH9 chipset with three PCI buses, PCI Express and Message Signaled Interrupts (MSI); see chapter 3.4.1, “Motherboard” tab, see the manual for more information
    • Intel HD Audio, for better support of modern guest operating systems (e.g. 64-bit Windows; bug #2785)
  • Improvements to OVF support (see chapter 1.12, Importing and exporting virtual machines, see the manual for more information):
    • Open Virtualization Format Archive (OVA) support
    • Significant performance improvements during export and import
    • Creation of the manifest file on export is optional now
    • Imported disks can have formats other than VMDK
  • Resource control: added support for limiting a VM’s CPU time and IO bandwidth; see chapter 5.8, Limiting bandwidth for disk images, see the manual for more information
  • Storage: support asynchronous I/O for iSCSI, VMDK, VHD and Parallels images
  • Storage: support for resizing VDI and VHD images; see chapter 8.21, VBoxManage modifyhd, see the manual for more information.
  • Guest Additions: support for multiple virtual screens in Linux and Solaris guests using X.Org server 1.3 and later
  • Language bindings: uniform Java bindings for both local (COM/XPCOM) and remote (SOAP) invocation APIs

In addition, the following items were fixed and/or added:

  • VMM: Enable large page support by default on 64-bit hosts (applies to nested paging only)
  • VMM: fixed guru meditation when running Minix (VT-x only; bug #6557)
  • VMM: fixed crash under certain circumstances (Linux hosts only, non VT-x/AMD-V mode only; bugs #4529 and #7819)
  • GUI: add configuration dialog for port forwarding in NAT mode (bug #1657)
  • GUI: show the guest window content on save and restore
  • GUI: certain GUI warnings don’t stop the VM output anymore
  • GUI: fixed black fullscreen minitoolbar on KDE4 hosts (Linux hosts only; bug #5449)
  • BIOS: implemented multi-sector reading to speed up booting of certain guests (e.g. Solaris)
  • Bridged networking: improved throughput by filtering out outgoing packets intended for the host before they reach the physical network (Linux hosts only; bug #7792)
  • 3D support: allow use of CR_SYSTEM_GL_PATH again (bug #6864)
  • 3D support: fixed various clipping/visibility issues (bugs #5659, #5794, #5848, #6018, #6187, #6570)
  • 3D support: guest application stack corruption when using glGetVertexAttrib[ifd]v (bug #7395)
  • 3D support: fixed OpenGL support for libMesa 7.9
  • 3D support: fixed Unity/Compiz crashes on natty
  • 2D Video acceleration: multimonitor support
  • VRDP: fixed rare crash in multimonitor configuration
  • VRDP: support for upstream audio
  • Display: fixed occasional guest resize crash
  • NAT: port forwarding rules can be applied at runtime
  • SATA: allow to attach CD/DVD-ROM drives including passthrough (bug #7058)
  • Floppy: support readonly image files, taking this as the criteria for making the medium readonly (bug #5651)
  • Audio: fixed memory corruption during playback under rare circumstances
  • Audio: the DirectSound backend now allows VMs to be audible when another DirectSound application is active, including another VM (bug #5578)
  • EFI: support for SATA disks and CDROMs
  • BIOS: reduce the stack usage of the VESA BIOS function #4F01 (Quake fix)
  • OVF/OVA: fixed export of VMs with iSCSI disks
  • Storage: Apple DMG image support for the virtual CD/DVD (bug #6760)
  • Linux host USB support: introduced a less invasive way of accessing raw USB devices (bugs #1093, #5345, #7759)
  • Linux hosts: support recent Linux kernels with CONFIG_DEBUG_SET_MODULE_RONX set
  • Guest Additions: Shared Folders now can be marked as being auto-mounted on Windows, Linux and Solaris guests
  • Linux Additions: Shared Folders now support symbolic links (bug #818)
  • Linux Additions: combined 32-bit and 64-bit additions into one file
  • Windows Additions: automatic logon on Windows Vista/Windows 7 is now able to handle renamed user accounts; added various bugfixes

Posted by 행복상자
기다렸던 사람들이 많았을 것 같다. 이제야, 오늘에야 Spring 3.0.0 RC1이 나왔으니까 말이다. 물론 Toby(일민)이를 비롯한 몇몇 선행적인 개발자들이 이미 열심히 공부하고 있고, 이의 전달도 열심인 것에 비하면, 최근에 나는 크게 관심을 두려고 노력하지 않았다. 개인적으로는 다른 사업부로 옮겨와서, 새로운 일을 맡아서 관심이 적어진(?) 것도 있지만, 사실은 그것 보다도, 기존에 내가 만든 Framework는 스프링 2.5.5 또는 2.5.6을 기반으로 설계되어 있다. 그리고 이것을 이용하여 여러 솔루션들이 개발되고 있는 중이어서, 자체 개발한 Framework의 Minor 체인지가 아닌 Big 체인지를 결정하기 쉽지 않기 때문이다. 만약 그것을 결정해야 한다고 해도 2년 후가 될 것이다. (상품으로 그리고 서비스를 하고 있는 시스템을 변경하기란 많은 결정해야할 문제에 직면해야 하는 용기가 필요한다. 그러나 이것은 모험이 아니다.)

현재 Springframework에서 제공하고 있는 메이져 Branch는 2가지이지만 앞으로는 3가지가 될 것이다.
Springframework 1.2 와 2.5 그리고 향후 주축이될 3.0이다.
그리고 이제는 3.0 Release Candidate 1이 나왔다. 이제는 또 열심히 공부할 시점이 된 것이다.
여러가지 변경된 API라이브러리들도 있고, 추가된 라이브러리들이 있는데, 이중에서 가장 먼저 눈에 들어왔던 것은 Jackson JSON라이브러리이다. 이른 아침에 Jackson 투터리얼을 보면서 시간 가는줄 몰랐다.
앞으로 정식 버전이 나올날이 멀지 않았지만, 언제가 될지는 잘 모르겠다. 올해 안에는 나오지 않을지...

Springframework 3.0 RC1의 변경 사항은 다음의 링크를 보면된다.

그리고, 아래는 이번에 RC1에 추가된 내용이다.

Changes in version 3.0.0.RC1 (2009-09-25)
-----------------------------------------

* upgraded to CGLIB 2.2, AspectJ 1.6.5, Groovy 1.6.3, EHCache 1.6.2, JUnit 4.7, TestNG 5.10
* introduced early support for JSR-330 "javax.inject" annotations (for autowiring)
* introduced early support for JSR-303 Bean Validation (setup and MVC integration)
* added default editors for "java.util.Currency" and "java.util.TimeZone"
* refined PathMatchingResourcePatternResolver's treatment of non-readable directories
* PathMatchingResourcePatternResolver understands VFS resources (i.e. works on JBoss 5.x)
* revised AccessControlContext access from BeanFactory
* AbstractBeanDefinitionParser can deal with null return value as well
* PropertyOverrideConfigurer's "ignoreInvalidKeys" ignores invalid property names as well
* PropertyPlaceholderConfigurer supports "${myKey:myDefaultValue}" defaulting syntax
* BeanFactory's default type conversion falls back to String constructor on target type
* BeanFactory tries to create unknown collection implementation types via default constructor
* BeanFactory supports ObjectFactory as a dependency type for @Autowired and @Value
* BeanFactory supports JSR-330 Provider interface as a dependency type for @Inject
* BeanFactory prefers local primary bean to primary bean in parent factory
* protected @Autowired method can be overridden with non-annotated method to suppress injection
* private @Autowired methods with same signature will be called individually across a hierarchy
* @PostConstruct processed top-down (base class first); @PreDestroy bottom-up (subclass first)
* ConfigurationClassPostProcessor detect @Bean methods on registered plain bean classes as well
* support for default "conversionService" bean in an ApplicationContext
* MBeanServerFactoryBean returns JDK 1.5 platform MBeanServer for agent id "" (empty String)
* changed NamedParameter/SimpleJdbcOperations parameter signatures to accept any Map value type
* refined logging in JMS SingleConnectionFactory and DefaultMessageListenerContainer
* introduced "ui.format" package as an alternative to PropertyEditors for data binding
* @RequestMapping annotation now supported for annotated interfaces (and JDK proxies) as well
* @RequestParam and co support placeholders and expressions in their defaultValue attributes
* @Value expressions supported as MVC handler method arguments as well (against request scope)
* JSR-303 support for validation of @MVC handler method arguments driven by @Valid annotations
* refined response handling for @ExceptionHandler methods
* @ResponseStatus usage in handler methods detected by RedirectView
* all @SessionAttributes get exposed to the model before handler method execution
* @Event/ResourceMapping uniquely mapped to through event/resource id, even across controllers
* MultipartRequest is available as a mixin interface on (Native)WebRequest as well
* removed outdated "cacheJspExpressions" feature from ExpressionEvaluationUtils
* introduced common ErrorHandler strategy, supported by message listener container
* Jpa/JdoTransactionManager passes resolved timeout into Jpa/JdoDialect's beginTransaction
* HibernateJpaDialect applies timeout onto native Hibernate Transaction before begin call
* Spring's Hibernate support is now compatible with Hibernate 3.5 beta 1 as well
* Spring's JPA support is now fully compatible with JPA 2.0 as in EclipseLink 2.0.0.M7
* SpringJUnit4ClassRunner is now compatible with JUnit 4.5, 4.6, and 4.7
* SpringJUnit4ClassRunner once again supports collective timeouts for repeated tests
* deprecated @NotTransactional annotation for test classes in favor of @BeforeTransaction








Posted by 행복상자
내가 Unit 테스트를 위한 툴과 TDD(Test Driven development)를 공부하기 시작한 것은 2002년 부터이다.
내가 살아가면서 감사하게 생각하는 것은 내 주변에 좋은 개발자들이 있고, 이 들로 부터 개발을 위한 좋은 정보를 얻을 수 있었다는 것이다. TDD는 지금은 iPhone Application을 개발하는 연승훈이라는 분을 통해서 그 당시에 처음 접하게 되었다.  

TDD에 관한 책은 김창준, 강규영  두분의 번역으로 국내에 책이 출판되었는데, 이전에 내 블로그에 "Kent Beck의 Test-Driven Development by Example"라는 제목으로 언급하기도 했던 책으로, 이 책은 내가 프로젝트의 개발을 시작하기 전에는 꼭 한번씩 읽는 책이다. 조금더 TDD를 잘 써보고 싶은 마음에서 매번 새로운 마음으로 읽어본다.
하지만, 매번 사용의 어려움을 느끼고, 그러면서 새로운 방법과 접근 방법을 배워갈수 있도론 Hint를 준다.

개인적으로는, 집에서 내가 코드를 작성할 때, TDD를 이용하여 Code Coverage를 측정하면, 평균적으로 90%~94%정도의 Coverage를 측정할 수 있다. 상당히 높은 수치이다. 코드의 질적인 면과 효율적인 면에서도, 아무생각 없이 junit을 이용한 코드를 짤 때보다는 높다. 물론, 경험상 TDD를 위한 코드를 작성하기 전에 생각해야 하는 시간을 상대적으로 늘어난다. 그러나 이역시도 클라스와 함수에 대한 명세서가 정확하고 명확하게 정의되어 있는 상태에서 시작한다면 아무런 문제가 되지 않는다. 테스트 코드를 위한 시간이 더 많이 필요로 하지만, Refactoring을 해야 하거나, 시스템 적으로 build와 testing을 해야 할 때 이 코드들은 큰 이익을 안겨준다.

내가 이전까지 사용하던 방식들은 Junit 3.8에서 제공하는 방식으로 이용해 왔다. 4.x 제공하는 기능들에 대한 간단한 사용법들은 알고 있었지만, 이 전에 작성했던 코드들와 게으름으로 다른 기능들에 대한 공부를 안하고 이제까지 버티어 왔다. 이 번에 Google App Engine Java버전을 분석하면서, 짜 넣을 코드들에 대한 테스트를 작성하면, Junit 4.x 버전을 공부하기로 마음 먹었다.

이를 위하여 몇가지 공부를 위한 사이트를 검색하면서, 링크들을 찾아 보았는데,
- IBM의 Developer Networks에 올라와 있는 글이 이해에 도움이 주었다.
- 그리고, www.junit.org 에서 소개하고 있는 글들이 유용하다.
           . New JUnit 4.x Howto + updated JUnit 3.x Howto 
           . JUnit 4.x Quick Tutorial
           . JUnit 4 in 60 Seconds
           . An early look at JUnit 4
Junit 4는 최근에 4.6 버전의 Release를 끝 마쳤다.

테스트를 작성하는 것은 개발자에게 많은 노력을 요한다. 아마도 개발한 코드보다 더 많은 코드들을 작성해야 하는 수고들이 뒤 따라야 할 것이다. 남에게 보기기 위한 다면 적당히 해도 좋다. 그러나 자신을 위하고 자신이 만든 코드를 위한다면, 요율적이고 효과적인 방법을 찾도록 노력해야 한다.

결국, SW 개발자는 자신의 코드로 나를 드러내야 하기 때문이다.
최선이라 함은 열심히 하는 것을 의미하진 않는다, 좋은 결과를 얻을 수 있는 과정을 최선이라고 생각한다.


 
 

'공부하는 것 > jUnit' 카테고리의 다른 글

Junit 4 공부를 시작하면서...  (0) 2009.05.23
Posted by 행복상자
Spring Source에서 새로운 툴을 하나 발표하려는 것 같다.
미국 시간으로 어제 "Roo Alpha 2 is now available for download" 라는 제목으로 글이 하나 올라왔는데, 생소한 이름의 툴이 하나 올라왔는데, 기존에 진행되었던 프로젝트와는 많이 생소한 내용이었다.

"Roo Alpha 2" 라는 이름으로 이미 Relesed 된 상태로, 이미 국내에서도 여러 개발자들이 관심을 갖고 살펴보고 있는 듯하다. 이는 SpringSource의 Tool Suite(STS)에 Roo Plugin으로 포함되어져 있고, 이들은 "introduction to Roo" 라는 블로그의 글을 통해서 "Roo"에 대해서 간략하게 소개하고 있다.
간단하게 Roo는  SpringSouce 오픈 소스 프로젝트이고, TDD를 위한 툴이고 이를 위해서 Shell을 개발자에게 제공한다. 그리고 Roo는 개발자가가 새로운 언어를 배우지 않고 쉽고 빠르게 그들의 Application을 개발 할 수 있도록 설계되었다고 한다.

Roo는 무료로 사용할 수 있는 툴인데, 이번주, 즉 5월 7일자(미국시간)로 무료로 다운받아 사용할 수 있다는 것이다. 이에 대해서 시간 제약과 같은 규제는 따로 없다.
우리 시간으로 5월 8일에 다운 받아 쓸수 있다는 말이다. (참조: http://www.springsource.com/products/sts)

Roo는 나에게는 아주 생소한 주제이다. 그래서 잠깐 구글링을 해보 았는데, 국내의 여러개발자들이 벌써 이를 테스트하고 분석하고 있는 중이었는데, 그중 특이한 것은 이 Roo가 갑자기 하늘에서 떨어진 것은 아니라는 것이다.
이미 일민(Toby)이가 이를 대한 소개를 한 글이 있었다. 2006년도에 TES2006에 참석해서 배운 내용을 정리했던 것인데 "TSE2006 넷째날 두번째 세션 - ROO"를 보면 이해에 도움이 될거라 생각된다.
그가 2006년에 Roo에 대해 알았다면, 이는 참 오래된 감춰진 프로젝트의 하나일 것이다.

그리고, "Introducing Spring ROO: Part 1" 의 글을 보면, 현재의 Roo에 대한 간략한 소개와 설치에 대한 설명들이 있다. 이름 참조하면 설치에 무리가 없을 거라 생각되고, 참고로 여기서는 A1 버전을 사용하였다.

그리고 지난주에 유럽에서 열렸던 SpringOne에서 발료되었던 세션중에 "Presentation: "Extreme Productivity in Application Development"을 보면 좀더 새로운 Roo에 대한 정보를 얻을 수 있을 것이다.

최근에 Roo에 대한 새로운 이름에 대해서 투표를 진행했는데, Roo도 괜찮은 이름인것 같다. 어떤 이름으로 다시 공개될지 모르지만 현재는 Roo이고, 이는 당분간은 유지 될거라 생각된다.
(투표에 관심있는 사람은 http://cloud.springsource.com/vote 를 한번 찾아가 보시길... )
Roo 1.0 Release는 6월 중순에 발표될거고, 1.0 GA버전은 올해말에 공개될 예정이다.

Roo를 사용하게 되면 어떤식으로 프로그램 방법이 바뀔지는 아직 감은 없지만, 많은 사람들이 관시을 가지고 있었던 프로젝트 였던만큼, 큰 반향을 일으킬 소지는 충분히 있다. 간단하게 작성된 소스들을 보더라도, AspectJ와 많은 Anotaion들이 사용이 된다. 중요한 것은 새로운 것을 익히고 쓰기 위해서는 기본에 충실해야 한다는 것이다. 이를 쓰기 위해서도 역시 기본적인 개념과 사용법에 대해서 익숙해질 필요가 있다.

아무리 좋은 도구라도 사용하는 사람이 익숙하지 않다면, 좋은 인상을 주기 어렵다. 새로운 것을 배우는데 익숙하거나 즐기는 사람이라면 다르겠지만, 자기가 하고 있는 분야만이 전부라고 생각하는 소아적인 개발자와 관리자를 깨우치기는 정말로 어렵기 때문이다. 그래서 "돼지목에 진주"라는 말이 있나 보다.

Posted by 행복상자

어제는 근로자의 날이라서 출근하지는 않았었다. 그리고 전날은 부부동반 모임이 있어서, 늦에 들어온 것을 핑계삼아 간만에 게으름도 피우고 그랬다. 아니 사실은 게으름을 피운 것운 것이 아니라, 감기인지 못살인지 몸이 좋지 않아서 누워서 오전을 보냈다. 선천적으로 늦잠을 좋아하지 않는 관계로 시간이 무척 아까웠다.

무엇을 할까 고민하다가, Google App Engine에 스프링으로 간단한 페이지를 한번 올려봐야지라는 생각이 들었다.
최근에 Google의 Eclipse 플러그인과 SDK는 이미 설치해서 간단한 것들은 적용해 본 상태여서, Google의 App Engine의 인증만 남은 상태이므로 남은 작업은 정말 간단하다.

만약 Eclipse에 Google App Engine Plugin과 SDK를 설치 하지 않았으며,
이전에 블로그에 올렸던 다음의  글을 "Google App Engine SDK 설치 및 실행" 를 참조 하기 바란다.

위와 같이 Google App Engine을 위한 기본 환경을 만들었으면, Spring Framework를 다운 받아야 한다.
이미 Spring Framework를 이용하여 개발한 경험이 있는 개발자라면, 기존에 가지고 있던 Library들을 그대로 사용하면 되지만, 그렇지 않은 개발자라면 www.springframework.org 에서 다운 받아야 한다.
                      - Spring Framework 2.5 Dependency Version Download

지금은 SpringFramework 3.0M3가 공개되고 있지만, 정식 Release된 2.5.5버전을 예제 작성에 사용할 것이다.
(물론 다른 버전을 사용해도 큰 영향은 없을거라 생각된다. 환경만 잘 맞추어 주면 말이다.)

자 이제 본론으로 들어가서, Google App Engine의 Eclipse Plugin을 정상적으로 설치하게 되면, Eclipse의 상단 메뉴텝에 다음과 같이 3개의 아이콘들이 생겨난 것을 볼수 있을 것이다.

   



위에 첨부한 메뉴 이미지 중에서 왼쪽에 있는 메뉴 아이템을 클릭하여 "New Web Application Project"창을 아래와 같이 띄운다.

위의 창에 생성할 프로젝트 이름을 입력하고, 기본적으로 생성할 패키지명도 입력한다. 만약 Google Web Toolket를 사용하기 원하지 않으면 체크박스에서 체크 표시를 지워주고 하단에 있는 "Finish"버튼을 클릭하면 된다.

프로젝트를 생성하면 기본적인 Servlet을 예제로 제공한다. 자 일단 테스트를 위해서 이를 실행해 보자.
아래와 같이 "Debug As" 메뉴의 서브 메뉴인 "Web Application" 를 실행시키면 웹서버가 실행된다.



이를 확인하기 위해서는 웹브라우져의 주소창에 "http://localhost:8080" 입력하여 실행하면 된다.

정상적으로 동작하는 것을 확인하면, 이제 스프링을 실행할 수 있는 환경을 만들어 보겠다.
예제는 아는 사람들에게는 잘 알려져 있는 "step-by-step" 를 예제로 작업할 것이다. 환경을 만들어 주기 위해서는 이전에 다운 받은 Springframework에서 Spring.jar, Spring-mvc.jar 그리고 common-log.jar 파일을 WEB-INF/lib 디렉토리 아래로 복사한다. (아래  그림 참조)

common-log.jar 파일은 Google에서 제공하는 logging 패키지를 이용해도 되지만, Spring의 "DispatcherServlet"을 로딩할때 에러가 나기 때문에 넣어준 것이다. 위의 "step-by-step" 예제를 따라하면, 기본적인 웹페이지를 작성할 수 있을 것이다. 다만, "Ant Build"에 관한 내용과 "Unit Test"에 관한 부분은 크게 신경 쓰지 않아도 된다.

Spring의 "DispatcherServlet"을 이용한 기본적인 예제는 큰 에러 없이 작성될거라 믿는다. 만약 에러가 난다면, Google의 SDK없이 만들어서 돌려보기 바란다. 기본적인 개념을 익히는데 큰 도움이 될거라 믿는다.

일단 http://localhost:8080 을 이용해서 무리가 없으면,



위 이미지의 메뉴중(붉은 박스로 안에 있는)에 세번째 아이템(비행기 모양의 버튼)을 클릭을 하여 "Deploy Project to Google App Engine" 윈도우를 띄운다. 



위와 같은 창이 뜨면, 입력할 값들을 입력박스에 채워 넣고 Deploy를 실행하면 되는데, 이를 위해서는 Google App Engine의 인증이 필요하다. 인증을 위해서는 이미 구글의 Account가 있어야 하고, 이를 이용하여 Deplore를 진행할 수 있다.

아래의 이미지는 서버에서 서비스할 application을 위한 기본적인 정보인데, 간단하게 필요한 내용을 입력하면 된다.


위 화면의 "Applicatiion Identifier"는 자신이 원하는 App Engine상의 sub 도메인 역할을 하는 것이고, "Appication Title" 은 적절한 이름을 넣어주면 된다. 인증 관련된 부분은 특별한 설정 없이 그래도 놓은면, 누구다 다 접속이 가능하고, 별도의 추가 설정이 필요하면 "Edit" 링크를 눌러서 추가 설정을 해주면 된다. (자세한 내용은 구글에서 제공하는 가이드를 참고하기 바란다.)
 
설정을 마쳤으면 "Save" 버튼을 클릭하면 서버상의 설정을 마쳐지게 된다.

내가 작성한 셈플 프로그램은 여기에 있다.
    Sample Progrom 링크 : http://happyzoo2009.appspot.com/hello.htm

추가적인 사항으로는 Google App Engine에서 제공하는 DB는 공식적으로는 없다. 다만 Google App Engine의 Datastory를 이용이 가능하다. 하지만 이 역시도 Google에서 제공하는 Library를 통해서 JPA와 JDO틀 통한 이용이 가능하다. 이를 이용해서 Persistance 데이터들을 관리해서 사용해야 한다. 이의 사용은 기존의 관계형 DB와는 차이가 있다. 때문에 제대로 이용하기 위해서는 역시 공부하고, 분석하는 시간들이 필요하다.

하지만, 관계형 DB의 사용도 가능하나 역시 제약이 뒤 따른다. HSQLDB를 이용하여 in-memory상에서 동작을 시키는 경우이다. (이런 경우는 Hibernate의 이용이 가능하다. ) 
 
이제는 데이터를 어떤식으로 다룰지에 대한 고민들이 남아있다.
한가지 한가지씩 배워나가는 즐거움이 있는 장남감이다. SprignSource에선 Groovy와 Grails을 이용한 예제를 벌써 내 놓았다. 아직은 이들을 적용하고 싶은 생각은 없지만, 조만간 한번을 이들에 대해서도 공부하고 알아야 겠다는 생각은 늘상 가지고 있다. 일단은 Jruby를 먼저 적용해 보고 싶은 생각이 크다.





Posted by 행복상자
며칠전에 ScottGu's 의 블로그에 올라온 을 보았다.
그가 몇몇 저자들과 함께 "ASP.NET MVC 1.0"이라는 책을 쓰고,  출판한지 약 1달이 넘었다. 이 책은 ASP.NET에서 웹폼과 함께 지원하는 MVC 프레이워크에 대해서 다루고 있는 최초의 책이라고 생각하는데, Scott Guthly는 자신이 집필했던 쳅터를 e-Book 형태로 무료로 다운로드 받을 수 있도록 했다.
bookcover[1](다운로드는 여기를 클릭하면 된다.)

이와 관련된 글은 "Free ASP.NET MVC eBook Tutorial" 을 참조하면 된다.

이번에 그의 Blog에서는 e-Book의 형태로 다운로드 할 수 있을 뿐만 아니라, HTML형태로 공개한다고 이야기 하고 있다.
아마도 그의 글이 작성된 시점은 HTML 버전으로 만들고, 이를 서버에 Upload한지 얼마 안되었다는 것을 그의 글을 통해서 엿볼수 있다.
요즘은 무엇이 그리도 바쁜지 그의 글이 업데이트 되고, 올라오는 횟수가 많이 줄었다. (빌 게이츠가 은퇴를 해서 그런가?)

그늘 그의 블러글를 통해서, HTML로 공개하고 있는 부분들은 12개의 파트로 나누어져 있다고 설명한다. 그리고 "nifty syntax highlighter" 를 사용해서 코드를 좀 더 보기 좋게 만들었다고 한다. 나는 그동안 위의 라이브러리가 무척 궁금하였었는데, 그의 글을 통해서 알게 되었다. "SyntacHighlighter 2.0"에 대해서는 나중에 시간나면 한번 분석해보고 사용해 보려고 한다. (우연찮은 기회로 알게 되어서 기쁘다.)

다음은 그가 공개한 12개 Part의 소제목에 대한 링크들이다.

이전의 블러그에서도 이야기했지만, Scott의 오픈소스에 대한 생각은 기존의 MS의 CTO들과는 많은 부분에서 확연히 차이가 난다. "JQuery"를 기본 자바 스크립트 Framework로 선택하고 이를 Visual Studio에서 inteligent기능을 통해서 지원하는 것만 봐도 알수 있다.

ASP.NET은 기존의 WebForm과 최근에 공개된 MVC 패턴을 모두 제공하지만, MVC는 웹 개발하는 개발자에게는 친숙하고 익숙한 패턴이기 때무에, WebForm을 넘어설 거라 생각된다.

훌륭한 개발자는 코드로 이야기하지만, 훌륭한 아키텍트(Architect)는 얼마나 복잡도를 줄이고, 단순화 시키느냐로 그의 역량을 엿볼수 있다.
마케팅적인 용어를 통해서 대단치도 않고, 불분명한 기술을 많은 개발자들과 IT 매니저들을 현혹시킬수 있지만, 진정한 가치는 역시 "사용해 보고 싶다"라는 욕구를 매번 새롭게 일으킬수 있어야 가능하다고 생각된다.
그래서 나는 MS의 이러한 긍적적인 변화를 Scott를 통해서 만들어가고 있다는 것에 대해 굉장히 기대하고 또한 잘 되길 바란다.

Posted by 행복상자

오늘 날자로 따끈한 소식이 "Google: Upgrade now to Android 1.5 "Cupcake" SDK" 라는 타이틀로 ZDnet에 떴다.
드디어 Google에서 Android 1.5 정식 버전이 릴리즈 되었다. 물로 이에 대해 관심 있는 개발자라면, 다른 여러 경로를 통해서 들었을 것이다.

최근에 Apple에서는 iPhone SDK 3.0 베타를 공개했고, 이어서 6월에는 정식 버전이 공개될 예정이다.
이로 인하여 모바일 디바이스 개발자들이 양분될지도 모르지만, 이는 우려일거라 생각된다. 현재 Apple은 10억 다운로드를 전면에 내세우며, 비지니스 모델의 우월함과 개발자들의 절대적인 지지을 받고 있다.

이에 구글은 올해를 모바일 플랫폼의 입지를 세우는 중요한 해가 될거라 예상하고 있고, 최근 한국의 삼성전자는 6월에 Google Phone을 출시하려는 계획을 가지고 있고, 며칠전에 여러 신문사들이 이에 대한 기사를 다루었다.
다음은 동아일보에 나와 있는 "삼성 '구글폰' 6월 유럽 출시"라는 기사이다.
    기사 링크: http://www.donga.com/fbin/output?f=k__&n=200904280062

그리고, 구글폰이 미국에서 100만대가 팔렸다는 기사도 접할 수 있다. 이에 대한 기사는 여기를 참조하기 바란다.

안드로이드 SDK 1.5버전의 릴리즈는 중요한 시점에 발표되었고, 이를 통해서 새로운 방향을 모색할 수 있으리라 본다.
하지만, 이를 통해 개발하기 위해서는 기본적인 시뮬레이터와 개발을 위한 디바이스의 확보가 필수적인데, 아직까지는 국내에서 언제쯤 출시될지는 미지수이다.

자바 개발자들에게는 안드로이드는 또 다른 의미로 다가 올수 있기 때문에, 새로운 기회를 모색하고 있는 자바 개발자라면, 반드시 관심을 갖을 필요가 있을 거라 생각된다. 개인적인 생각일지 모르겠지만, 이러한 기회들을 지난 20년동안 그리크게 많지 않았다. 다만 머저 앞서갔던 사람들은 그 만큼 많은 기회를 얻었다는 것이다. 왜냐하면, 초반에는 희소성의 원칙이 지배하기 때문이다. 그리고 더 많은 패러다임의 변화를 체득한 사람들은 그렇지 않은 사람보다 여유로울 수 밖에 없다. 특히 개발에 대한 애정밖에 없는 순수한 개발자라면 더더욱 그렇다. 조만간 국내에서도 안드로이드 SDK를 이용하여 개발이 가능한 환경이 찾아 올것이다.

애플이든 구글이든 한 업체가 전체 시장을 다 먹을 수는 없을 거라 생각된다.
애플이 빠르게 시작하였지만, 아직까지는 시장이 만들어지는 단계이기 때문에(단지 하드웨어만 판다고 하면 이는 전혀다르다.), 향후의 행보는 쉽게 예측하기 어렵다. 다만 애플이 App Store를 통한 비지니스 모델이 성공하면서, 기업끼리의 경쟁에서 "개인과 개인" 또는 "개인과 기업"의 경쟁 구조로 Echo System을 만들어 버렸다. 이것이 언제까지 지속될지는 알수 없지만, 지식 노동자의 개인에게 기회를 제공했다는 점에서 큰 의미를 부여할 수 있다.

아래 링크는 위 블러그에서 참조 삼아 가져온 링크들이다. 이중에는 "Android 1.5 Version Notes"는 구글의 Adroid에 대해서 관심있는 개발자라면 한번 읽어 볼만하다. 

  • Top 5 features in Android 1.5 (Cupcake)
  • 1.5 Non-Working Apps List (as of 06apr2009)
  • Android 1.5 Version Notes
  • Flashing your Android Dev Phone with a Factory System Image
  • Planet Android
  • Follow Planet Android on twitter (@droidfeed)
  • 가끔씩은 기회를 기다릴수 있는 인내와 그리고 기회에게 먼저 다가갈 수 있는 용기가 필요하다.

    Posted by 행복상자