Whiteship's Note

'2008/04'에 해당되는 글 57건

  1. 2008.04.30 GTA4 코리아타운
  2. 2008.04.30 귿!! OSGi위에 웹 애플리케이션 돌리기 성공 with Spring DM (2)
  3. 2008.04.30 웹 애플리케이션과 OSGi
  4. 2008.04.29 Spring DM에 Spring MVC 연동 기능 추가됨. (4)
  5. 2008.04.29 EasyMock 사용할 때 주의 할 것 (2)
  6. 2008.04.29 하이버네이트의 update() 와 merge() (2)
  7. 2008.04.28 스프링의 getBean() 타입 캐스팅 없애는 방법 (2)
  8. 2008.04.27 Generic 메타데이터 활용하기
  9. 2008.04.26 Spring Web Flow 2.0 특징
  10. 2008.04.26 이클립스의 기본 try-catch 탬플릿 비추
  11. 2008.04.25 테스트는 진짜로 잘 만들어야 함 (2)
  12. 2008.04.24 오랜만에 기대중인 게임 GTA 4 (4)
  13. 2008.04.24 @Configurable 사용시 버그 피해가기
  14. 2008.04.23 SpringSource AMS 간단 사용기 (3)
  15. 2008.04.22 SpringSource Application Manager Suite (2)
  16. 2008.04.22 GenericPropertyEditor 만들려면...
  17. 2008.04.22 찾았다. WebBindingInitializer
  18. 2008.04.19 Q4E 플러그인 사용기 1 (2)
  19. 2008.04.18 TDD 연습하기 - RomanNumber (6)
  20. 2008.04.18 pom.xml에 종속성 추가하기 (8)
  21. 2008.04.18 이클립스용 Maven 플러그인 Q4E (10)
  22. 2008.04.17 기본적인 managed dependency 사용법 (2)
  23. 2008.04.17 Managed Depedency 네 녀석의 정체를 드디어 알았다.
  24. 2008.04.17 도미노 피자 VIP 되다..
  25. 2008.04.16 Spring 컨트롤러와 request scope bean (4)
  26. 2008.04.16 Dynamic refreshing of application contexts
  27. 2008.04.16 Maven으로 이클립스 프로젝트 만들기 - Screen Cast (4)
  28. 2008.04.16 드디어 Spring Security 2.0 Released!! (2)
  29. 2008.04.16 이클립스 템프릿 파일 추가하기 (6)
  30. 2008.04.15 Blip.tv 좋았어!! (2)

GTA4 코리아타운




PC판은 언제나오나.. 그래픽은 기대 이상이군요.
상호 센스는 좀 머시기 하지만 나름대로 귿.
신고
top


귿!! OSGi위에 웹 애플리케이션 돌리기 성공 with Spring DM

Spring DM/exercise : 2008.04.30 18:00


사용자 삽입 이미지

위 그림 한장이면 돌리는 방법은 끝나죠.

맨 아래 보이는 녀석이 Spring DM 받으면 src/sample에 들어있는 웹 애플리케이션입니다. 자세한 내용은 좀 더 공부해야겠지만 일단 예제를 돌려서 기쁘네요.




현재 Servlet 까지는 됐는데, JSP는 아직 안 됩니다. 이것 저것 만지다보면 될 것 같네요.

신고
top


웹 애플리케이션과 OSGi

Spring DM/etc : 2008.04.30 08:47


참조 : http://blog.springsource.com/main/2008/04/29/web-applications-and-osgi/

왜 WAR를 OSGi에 배포하려는가?

쉬운 질문이군. OSGi는 기본적으로 버전잉과 패키지 엮기 그리고 핫 릴로딩을 지원한다. 여러분의 애플리케이션이 이런 장점들을 얻을 수 있다는 것을 상상해보라. .. 나머진 생략 ..

왜 웹 애플리케이션이 OSGi에서 문제가 되는가?

- Servlet 스펙은 웹 컨테이너를 기준으로 하고있다. 라이프 사이클 관리, 동시성, HTTP 요청 처리 등고 같은 표준 서비스를 제공하는 웹 구성요소다.
- OSGi 플랫폼은 서비스 레지스트리, 패키지 엮기, 버전잉과 같은 managed environment다.
- OSGI는 서블릿을 지원하기 위해 HTTP Service를 설계했다.
- 위의 API를 통해서 간단하게 서블릿을 등록할 수 있다.
- 서블릿이 OSGi 내부에서 요청을 처리하려면, 반드시 프로그래밍을 좀 해서programmatically 서블릿 객체를 만들고 적당한 API를 통해서 등록을 해야한다. 게다가 HTTP 서비스는 오직 서블릿 2.1 스펙만 지원한다.
- 이 문제를 다음과 같이 해결할 수 있다.
    - web.xml을 해석하는 등의 선언적인 방법을 통해서 코딩 줄이기
    - 표준 API를 확장하거나 2.1 API 위에 뭔가 더 만들어서 Servlet 2.1 이상의 기능을 제공하기
- Spring DM은 위와는 다르고 독특한 접근 방법을 체택했다.

웹 컨테이너를 직접 통합하기

- Spring-DM은 OSGi와 컨테이너 사이의 다리 역할을 한다.
- WAR를 그냥 컨테이너에 배포하듯이 배포하면 된다.
- OSGi와 컨테이너 둘 다 크게 변경될 것이 없다.
- Spring DM은 다음과 같은 것들을 지원한다.
    - 서블릿 2.4/2.5, JSP 2.0/2.1 스펙 지원
    - availability of the container capabilities (blocking vs non-blocking IO, allocated threads in the thread pool and so on)
    - web.xml 을 사용한다. 이걸 Spring DM이 파싱하는게 아니라 컨테이너에게 그 일을 위임한다. 원래 하던 녀석이 잘 할테니까..
    - 컨테이너 스펙 설정 파일(톰캣의 META-INF/context.xml 과 같은..)
- 현재 톰캣 5.5.x/6.0.x 와 제티 6.1.x 이상의 버전의 컨테이너를 사용할 수 있다.
- 웹 컨테이너가 웹 애플리케이션을 관리하고 컨테이너가 지원하는 모든 것들은 OSGi 번들들에게 가용하다.

1.1 최종판이 아직 발표되진 않았지만, M2를 접해보길 권장한다. 상당히 그대로 배포될 가능성이 많은 API들이며 새 기능들은 문서화해두었다. 도움이 필요하면 포럼으로 오고 메일링 리스트를 이용하라. 마지막으로 자바원에 온다면 SpringSource 부스에서 만나볼 수 있다.

ps: 알았다. 오바.
신고
top


Spring DM에 Spring MVC 연동 기능 추가됨.

Spring DM/etc : 2008.04.29 21:31


참조 : http://static.springframework.org/osgi/docs/1.1.0-m2/reference/html/web.html#web:spring-mvc

1.1.0 M2가 나왔습니다. 눈에 띄는 변화는 단연 Web쪽 기능 추가. 자세한 내용은 레퍼런스를 보라고하지만, 레퍼런스보다 예제코드가 더 배고픈데 말이죠.

오늘 밤은 스프링 DM과 함께~


스프링은 역시 멋져부러~
신고
top


EasyMock 사용할 때 주의 할 것

모하니?/Coding : 2008.04.29 19:47


    public void foo(Bar bar) {
        ...
        
        bar.toby(whiteship);
        bar.whiteship(toby);
    }

위와 같은 메소드를 테스트 할 때 EasyMock을 사용해서 다음과 같은 테스트를 작성할 수 있습니다.

@Test
public void foo(){
   Bar mockBar = createMock(Bar.class);
   ...
   mockBar.toby(whiteship);
   mockBar.whiteship(toby);
   replay(mockBar);
   a.foo(mockBar);
   verify(mockBar);
}

테스트가 통과할 것만 같은 코드입니다. 그렇쵸? 대부분은 테스트가 통과 합니다. 그런데 통과하지 않는 경우도 있습니다.

java.lang.IllegalStateException: missing behavior definition for the preceeding method call toby(whiteship);

이런 메시지와 함께 테스트가 통과하지 않습니다.

그럴 때는 뭘 확인해 봐야 할까요? Bar 인터페이스에 있는 whiteship과 foo라는 메소드의 리턴타입이 있는지 확인해봐야 합니다. 리턴타입이 있으면 http://whiteship.tistory.com/1504
신고
top

TAG EasyMock

하이버네이트의 update() 와 merge()

Hibernate/study : 2008.04.29 18:37


찬욱군의 블로그를 보다가 merge()를 save(), update() 대용으로 사용하는 코드를 봤습니다. 스프링의 샘플 코드더군요. 해당 코드에 보면 주석으로 모라모라고 달려있는데 그걸 찬욱군이 블로그에 잘 풀어서 설명해두었습니다. (하지만 잘 이해가... @.@;;)

왜 그렇게 코딩을 해야 하는지 모르겠더군요.

1. save() 대용으로 사용한 경우.

해당 코드는 아래와 같습니다.

    public void storeOwner(Owner owner) {
        // Note: Hibernate3's merge operation does not reassociate the object
        // with the current Hibernate Session. Instead, it will always copy the
        // state over to a registered representation of the entity. In case of a
        // new entity, it will register a copy as well, but will not update the
        // id of the passed-in object. To still update the ids of the original
        // objects too, we need to register Spring's
        // IdTransferringMergeEventListener on our SessionFactory.
        sessionFactory.getCurrentSession().merge(owner);
    }

    public void storePet(Pet pet) {
        sessionFactory.getCurrentSession().merge(pet);
    }

    public void storeVisit(Visit visit) {
        sessionFactory.getCurrentSession().merge(visit);
    }
코드 출처 : spring 소스/samples/petclinic/src/.../HibernateClinic.java

희한합니다. 전부 저장하는 류의 메소드들인데 merge()를 쓰고 있네요. 이 녀석들을 사용한 코드를 보니 AddXXFrom 류의 클래스들에서 사용하고 있었습니다. 왜 그랬는지 잘 모르겠습니다. 저 메소드들에 넘겨준 객체의 상태를 Persistent로 바꾸기 싫었다고 생각할 수 밖에 없습니다.(merge()의 특성은 조금 뒤에 살펴보겠습니다.) 그런데도 위의 주석을 보면 id값만은 어떻게든 가지고 싶어서 IdTransferringMergeEventListener 이런 녀석을 사용할 수도 있다고 나와있습니다.

그럼 결론은..

this.clinic.storeOwner(owner);

이렇게 넘겨준 owner라는 객체의 상태는 그대로 Transient로 유지하고 Persistent로 바꾸지 않으면서도 id 값은 가지고 있도록.. 하고 싶을 때 저런 방법을 사용할 수 있습니다. 귀찮게 왜 그럴까요? 몰겠습니다. 그냥 save(owner) 하면 넘겨준 owner 객체가 Persistent 상태가 되면서 id도 가지게 될텐데 말이죠.

2. update() 대용으로 사용하는 경우

update()에 대한 간략한 설명을 해야겠네요. update()는 그냥 DB의 UPDATE 문이 아닙니다. reattach입니다. reattach가 뭐냐면 "다시 붙이기"입니다. detached 상태의 객체를 Persistence Context에 다시 붙이는 것(해당 객체는 Persistent 상태가 되겠죠.)을 뜻합니다. update(owner); 를 하게되면 owner 객체를 다시 Persistent Context에 붙이고 그럼 owner 객체는 Persistent 상태가 됩니다. 이 때 다음과 같은 문제가 발생할 수 있습니다.

        Member member2 = (Member) session2.get(Member.class, member.getId());
        session2.update(member);

두 줄 모두 하이버의 Unit of work 내에서 실행된다면, NonUniqueObjectException()이 발생합니다. 말 그대로 입니다. Persistent Context 내부에 단일 레코드를 나타내는 둘 이상의 객체가 존재하기 때문에 발생하는 것입니다. 이 현상이 나쁜건가요? 당연한 겁니다. 대체 하이버는 누굴 기준으로 더티 체킹을 해야하죠?? 이 예외를 피해가야 할까요? 아니죠. 소스 코드를 손봐야 하는 겁니다. 어떻게요? 순서를 바꿔주면 됩니다.

        session2.update(member);
        Member member2 = (Member) session2.get(Member.class, member.getId());

만약 왜 위에는 에러가 나고 아래는 에러가 안 나는지 모르시겠다면, 하이버네이트 공부를 하시면 됩니다. 간략하게 설명 드리면, member 객체가 먼저 Persistent Context에 들어가서 Persistent 상태가되고, 그 다음 get()을 하면 DB에서 읽어오는게 아니라 Persistent Context에서 가져오기 때문에 아무런 문제가 없습니다.

그런데 같은 문제를 merge()를 사용해서도 해결할 수 있습니다.

        Member member2 = (Member) session2.get(Member.class, member.getId());
        Member member3 = (Member) session2.merge(member);

이렇게 말이죠. 그런데 여기서 중요한 건 member2와 member3은 Persistent 객체이고 member와 같은 값을 가지고 있지만, member만 여전히 Detached 상태라는 것입니다. 그리고 member2와 member3에 대한 변경(dirty) 사항이 양쪽 모두에 적용이 됩니다. 얼마나 아리까리 합니까? 그래서 하이버 책에서는 merge()해서 돌려받은 객체(여기서는 member3)만 사용하라고 권장하고 있습니다. 그런데 객체가 막 돌아다닐텐데 권장사항대로 잘 되진 않겠죠.

merge()는 넘겨받은 객체의 값들과 콜렉션을 복사합니다. 그리고 그 객체가 가지고 있는 id와 같은 id를 갖고 있는 녀석을 Persistent Context에서 찾아서 가져옵니다.(SELECT 쿼리 안 날아감.) Persistent Context에 없으면 DB에서 가져옵니다.(SELECT 쿼리 날아감.) 그런 다음에 값들을 가져온 객체(Persistent 상태겠죠.)에다가 덮어씌웁니다. 그리고 그녀석을 반환해 줍니다. 따라서 Detached 상태로 넘겨준 객체는 여전히 Detached 상태로 남아있고 그 객체와 같은 값을 가진 새로운 Persistent 객체가 만들어지게 됩니다.

그런데 넘겨준 객체가 Detached 객체가 아니라 Transient 객체라면?? 즉 save() 대용으로 merge()를 사용하는 경우가 이 경우에 해당하겠죠. 그렇다면, id가 없고 그럼 Persistent Context에서 찾을 것도 없고 DB에서 가져올 것도 없습니다. 대신 하나를 새로 만들어야겠죠. 대신 이 녀석도 마찬가지로 넘겨받은 객체의 값들을 복사해서 새로운 객체를 만들고 나중에 Unit of Work가 끝난 뒤 INSERT 문이 날아갈 준비가 됩니다. 다시 한번 주의할 것은 넘겨 받은 객체 자체를 Persistent 상태로 만들지는 않는다는 것입니다. merge()는 넘겨받은 객체의 상태를 바꾸지 않습니다.

결론을 내리자면, save() 대용으로 merge()를 사용하는 건 제 생각으로는 비추입니다. 애초에 merge()는 Detached 객체를 reattach 하기위한 용도이지, Transient 객체를 위한 용도가 아닙니다. update()의 대용으로 사용하는 걸 생각해볼 수는 있지만, merge()와 update()의 특징에 따라 원하는 것을 사용하시는게 좋겠습니다. 단순하게 예외를 피하기 위한 용도로 사용하는 것은 비추입니다.

참조 : Java Persistence With Hibernate 9장
신고
top


스프링의 getBean() 타입 캐스팅 없애는 방법

모하니?/Coding : 2008.04.28 18:08


 Service myService = (Service) ctx.getBean("service");

대부분 위처럼 캐스팅을 해서 사용합니다. 저는 캐스팅이 정말 싫었습니다.

 Service myService = ctx.getBean(Service.class);

이렇게 캐스팅 없이 사용할 수 있는 방법이 있습니다.

정답은? JavaConfig, http://www.springframework.org/javaconfig, JavaConfigApplicationContext
신고
top


Generic 메타데이터 활용하기

Java : 2008.04.27 10:21


참조 : http://blog.springsource.com/main/2006/09/29/exploiting-generics-metadata/

윗글 재미있습니다. 자바에서 욕을 많이 먹고 있는 기능 중에 하나가 Generic인데 사실 그렇게 욕먹을 필요까진 없다고 봅니다. 타입 캐스팅을 줄여주는 것 만으로도 충분히 좋은 기능이고 컴파일 시점에 타입 체크를 할 수 있다는 것도 좋다고 생각합니다. 단지 복잡해 보일 수도 있고 가독성을 떨어트릴 수도 있다는 것 때문에 사장되어야 할 정도로 엉망진창인 기능은 아니라고 생각합니다.

어쨋든 자바의 Generic은 자바 1.4 이하 버전들과의 호환 때문에 erasure 방식을 사용하고 따라서 런타임 시에 어떤 타입을 가지고 있는지 알겨를이 없습니다.

그런데 바로 이 Erasure 방식 때문에 오해가 생기기도 하나봅니다. 즉, 자바의 Generic은 타입 정보를 지워버린다는 오해입니다. 클래스 파일에 붙어있는 타입 정보는 지워지지 않습니다. 코딩을 해놨는데 그걸 굳이 지워버릴 필요는 없겠죠. 단지 런타임 시에 해당 클래스 타입의 객체에서 지워져버릴 뿐이죠. 따라서 클래스 파일에 붙어있는 타입 정보를 얼마든지 활용할 수도 있습니다.

private Class extractTypeParameter(Class<? extends EntitlementCalculator> calculatorType) {
    Type[] genericInterfaces = calculatorType.getGenericInterfaces();

    // find the generic interface declaration for EntitlementCalculator<E>
    ParameterizedType genericInterface = null;
    for (Type t : genericInterfaces) {
        if (t instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType)t;
            if (EntitlementCalculator.class.equals(pt.getRawType())) {
                genericInterface = pt;
                break;
            }
        }
    }

    if(genericInterface == null) {
        throw new IllegalArgumentException("Type '" + calculatorType
               + "' does not implement EntitlementCalculator<E>.");
    }

    return (Class)genericInterface.getActualTypeArguments()[0];
}

위 코드는 메소드 파라미터로 넘어온 클래스가 가지고 있는 타입 정보를 반환해주는 메소드 입니다. 객체가 아니라 클래스를 받고 있기 때문에 가능한 일이죠.
신고
top

Java : 2008.04.27 10:21 Trackback. : Comment.

Spring Web Flow 2.0 특징

Spring Web Flow/etc : 2008.04.26 11:11


참조 : http://www.infoq.com/news/2008/04/spring-webflow-2rc
예제 : http://richweb.springframework.org/swf-booking-faces/spring/intro

Web Flow 2.0의 새로운 기능은?

- Progressive Ajax:  Ajax 이벤트 핸들링 기능을 추가했다. 다른 웹 플로우 이벤트처럼 Ajax 이벤트를 처리할 수 있다. 자바스크립트를 클라이언트 쪽에서 사용하지 않아도 제대로 동작하도록해놨다. Ajax 지원 기능은 서버쪽 기능과 클라이언트쪽 기능 둘로 나눠져있다.

- Spring MVC와 더 긴밀한 통합: Spring MVC와 상호 보완 관계이다. Stateless한 Spring MVC @Controller가 Folw를 호출할 수 있고 Flow의 결과가 컨트로러에 맵핑될 수 있다.

- 재구성하고 확장된 JSF와의 통합: JSF 내용은 패스 저도 잘 모르기 땜시..

- Spring Security아의 통합: 플로우에 보안 기능을 추가할 수 있다. 플로우, 스테이트, 트랜지션에 @Secured를 애노테이션을 붙이면 SecurityFlowExecutionListener가 사용자의 인증을 요구한 뒤에 플로우를 시작하고, 스텝을 진행하고 이벤트를 시작할 것이다.

- 보다 간단한 Spring Folw Definition Language: 200줄 가량의 코드와 6개의 파일이 필요한 애플리케이션이 동일한 기능을 이제는 93라인의 코드와 2개의 파일로 할 수 있다.

- 새로운 모듈화 기능: 플로우의 개념을 "재사용 가능하며, 독립적인 애플리케이션 컨트롤 모듈"로 확장했다. 따라서 기본적으로 플로우와 그것이 사용하는 리소스인 뷰, 메시지, 헬퍼등을 하나로 패키징된다.

이번 배포의 배경이 되는 철학은 무엇인가?

- 사용성 편의다.

1.0에서 2.0으로 이전하는데 필요한 중대 변화는?

- Web Flow Definition Language다. 그래서 1.0 정의를 2.0으로 바꿔주는 기능을 제공한다. 일명 WebFlowUpgrader xnf.

스프링 웹 플로우를 지원하는 도구는?

- 스프링 IDE

앞으로 웹 플로우의 개발 방향과, 2.1 배포의 초점은?

- 선언적인 모델 검증. 애노테이션으로 Validation을 할 수 있도록.. 선언적으로 모델에 벨리데이션 규칙을 붙여두면, 그것을 서버 사이드와 클라이언트 사이드에 반영해주는..
- Grooby로 Flow Definition 작성하는 기능.

신고
top


이클립스의 기본 try-catch 탬플릿 비추

모하니?/Coding : 2008.04.26 09:59


Catched Exception이 하두 지저분해서 호출한 쪽에서 계속해서 던지거나 try-catch로 감싸는게 싫어서 던지는 쪽에서 그냥 퀵 픽스를 누르고 try-catch 블럭으로 감싸버리는 실수를 했습니다.

이클립스가 기본으로 제공하는 try-catch 블럭은 예외를 먹어버리는 악성코드입니다. 기능 구현에 집중하고 이런 세세한 부분을 신경 안 쓰다가는 디버깅하기 어려운 코드를 만들게 됩니다. 따라서 왠만하면 사용하지 맙시다. 아니면 template을 수정해서 throw new RuntimeExcepion(e)를 추가해줘도 되겠죠.

이미 알고 있는 내용이었는데도 이런 실수를 하다니...ㅠ.ㅠ

try {
// 위험한 코드
} catch(어떤 예외 e) {
    e.printStackTrace()
}

위의 코드가 이클립스가 제공해주는 코드인데 저러면 안 됩니다. 에러를 찍고 그냥 프로그램이 계속 돌아갑니다. 이게 뭐가 잘 못 된건데?? 라고 하신다면.. ㄷㄷㄷ.. 중요한 코드가 제대로 동작해야 하는데 그렇치 못한 상태에서 프로그램이 계속 돌면 분명 에러 찾기도 어렵고 문제가 있는지 조차 알 수가 없습니다.

그래서..

try {
// 위험한 코드
} catch(어떤 예외 e) {
throw new RuntimeException(e)
}

이렇게 하면 원래 에러를 가진 채 런타임 에러를 던지게 되고 만약 위험한 코드에서 정말 위험한 일이 발생하면 프로그램은 바로 에러를 뱉고 쓰러집니다. 에러를 바로 발견할 수 있고 위처럼 원래 예외 객체를 같이 넘겨줘야 nested excepton으로 원래 예외도 알 수 있습니다.


신고
top


테스트는 진짜로 잘 만들어야 함

모하니?/Coding : 2008.04.25 22:51


오늘 테스트를 "제대로" 만들어야 함을 배웠습니다. 개발하고 배우고 느끼고 공부하고 혼나고 가끔 이렇게 공유도 하고 재밌습니다.

제가 만든 클래스는 제네릭 프로퍼티 에디터로, 특정 객체 타입이 오면 해당 객체가 가지고 있는 id 값을 화면에 보여주기 위한 클래스입니다. 즉 ${member} 라고 JSP에 적어두면 member 객체의 id를 사용합니다.

구현도 잘 했고, 테스트도 잘 했다고 생각해서 기분이 좋았었습니다. 그런데 이게 왠걸.. 실제로 돌아가는걸 보니까 잘 안 되는 것입니다. 제가 만든건 GenericPropertyEditor 입니다. 코드는 공개 안 하려고 했지만 어쩔 수 없네요.ㅋㅋ

아래가 구현한 코드입니다.
    public String getAsText() {
        T entity = (T) this.getValue();
        logger.info("entity = " + entity);
        if (entity == null)
            return "";
        else
            return String.valueOf(SimpleReflectionUtils.getValue(entityClass, entity, "id"));
    }

저걸 테스트 해보려고 다음과 같은 코드를 작성했습니다.
    @Test
    public void getAsText() throws Exception {
        Supp supp = new Supp();
        int id = 10;
        supp.setId(id);
       
        suppPropertyEditor.setValue(supp);
       
        assertEquals(String.valueOf(id), suppPropertyEditor.getAsText());
    }

잘 돌아갑니다.

그런데 분명 위의 코드에는 문제가 있습니다. 무슨 문제인지는 비밀입니다. 스프링, 하이버, @ManyToOne,Lazy Initialization, Proxy, id, getter, field 등을 조합해서 생각하면 문제를 발견하실 수도 있으실 테지만, 전 상상도 못했었습니다.

테스트를 기계적으로 만들지 말고 해당 클래스가 어떤 상황에서 어떤 역할을 하는지 고려해서 작성해야 한다는 걸 느꼈습니다.
신고
top

TAG 테스트

오랜만에 기대중인 게임 GTA 4



콜 옵 듀티 4를 애타게 기다리다가 모 회사 서류 통과 후 입사 시헙도 안 보러가고 게임을 했었습니다. 콜 오브 듀티는 모든 시리즈를 다 해봤는데, 하나 같이 스토리가 좋고 재미있습니다. 그 중에서도 특히 4는 현재전으로 오면서 새로운 무기를 다루는 맛이나 스토리가 예술이었습니다.

그렇게 콜 옵 듀티 4를 두 번이나 깨고 그 다음 제 마음을 설레게 한 게임은 갓 오브 워입니다. 이 녀석은 불행히도 PC판으로 나오지 않아서 피돌이를 가지고 해야했습니다. 재미있었습니다. 하지만 너무 스토리가 짧았습니다. 좀 더 즐기고 싶은데 그 여운을 달래기 위한 미니게임들의 난이도는 너무 높았습니다.

이제 다시 또 심장을 뛰게 만드는 게임이 조만간 나올 예정입니다. 바로 GTA!! GTA 원 투는 안 해봤고, 하려고 봤더니 그래픽이 2D라서 할 맛도 안나더군요. 전 GTA 2말고 GTA 3를 대학교 2학년 때 처음 발견하고 깜짝 놀랬습니다. 세상에 이런 게임이 다 있었구나... 그리고 반해버렸습니다.

자유도가... 정말 예술입니다. 사람을 각종 방법(주먹, 총, 칼, 바주카포, 저격 등등등)으로 죽이고 길거리의 모든 탈 것들을 뺏어 타고, 애인도 사귀고, 매춘, 마약 판매, 경찰일, 소방차일, 택시, 아이스크립 팔기, 차 훔쳐서 팔기 등등등 세상에 모든 일들을 해볼 수 있습니다.

자유도 이외에 표현력도 좋고(길거리의 빨간 소화전을 자동차로 부시면, 물이 뿜어져 나오고, 길거의 사람을 차로 깔아 뭉게면 빨간 핏물의 타이어자국이 길에 찍히는 등...) 스토리와 미션도 좋습니다.

여태까지 해본 작품들은 GTA3, GTA Vice City, GTA San Andreas.그리고 피돌이용 Vice city와 Liberty city. 이번에 나올 작품은 GTA 4라고 하는데 Liberty City가 그 배경입니다. 아 어서 빨리 나왔으면 좋겠습니다. 총 다섯 작품이나 플레이 해본 게임이지만, 정말 하면 할 수록 발전하고 다음 작품이 기대되는 게임입니다.


신고
top

TAG GTA4

@Configurable 사용시 버그 피해가기

모하니?/Coding : 2008.04.24 15:06


Caused by: java.lang.VerifyError: (class: 머시기/모시기/클래스$$EnhancerByCGLIB$$6dd4e683, method: unique signature: ()L저기기/거시기/클래스;) Inconsistent stack height 1 != 0


참조 : http://forum.springframework.org/showthread.php?t=51455

CGLib으로 만든어진 객체에 위빙을 시도해서 생기는 문제 같은데, 일종의 버그인가봅니다. 이전에 @Configurable 테스트 할 땐 못 본 에러인데 오랜만에 이걸 쓸 일이 있어서 사용하니까 발생하네요.

이 문제를 해결(?)하려면 일단 META-INF 폴더를 클래스 패스 안에 만들어 줍니다. 만든 다음에 클래스 패스에 추가해도 되구요.

다음은 aop.xml 파일을 정의하고 다음과 같이 적어줍니다.

<?xml version="1.0"?>

<!--
    AspectJ load-time weaving config file to install common Spring aspects.
-->
<aspectj>

    <weaver options="-showWeaveInfo" >
        <exclude within="*..*CGLIB*" />
    </weaver>

    <aspects>
        <aspect
            name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect" />
        <aspect
            name="org.springframework.transaction.aspectj.AnnotationTransactionAspect" />
    </aspects>

</aspectj>

다른 내용은 spring-aspects.jar 파일에 기본으로 들어있는 aop.xml의 내용과 일치하구요. 거기에 <warver> 엘리먼트를 추가해서 CGLIB이 들어간 클래스에는 위빙하지 말라는 설정을 해줍니다.

아.. 근데 이렇게 하면 프록시에는 위빙하지 말라는건데... 이것참 난감하네요. 버그 보니까 해결됐다고 나오는데 저 문제는 왜 발생하는건지..에구구...

신고
top


SpringSource AMS 간단 사용기

Good Tools : 2008.04.23 23:01


회사에서 돌려보려고 헀지만.. 일도 있고 저녁에 스타리그도 봐야해서 집에와서 스타 본다음에 돌려봤습니다. 돌리는 방법은 약간 복잡하지만, 제공해주는 기능에 비하면 간단한 것 같습니다.

1. 여러 가지 파일 받기
2. AMS 서버 실행하기
3. 로그인 하기
4. Agent 실행하기
5. AMS에 Agent 등록하기
6. 애플리케이션에 instrument 된 상태로 배포된 spring 라이브러리로 교체
7. 웹 애플리케이션 실행
8. 구경하기

대략 위와 같은 순으로 진행하면 됩니다.

참조
SpringSource Application Management Suite (AMS) Released

위 문서보다 좀 더 설치 방법에 대해 잘 설명한 페이지가 있었는데 링크를 못 찾았습니다. 흠..STS에 등록하는 화면 어딘가에서 링크를 타고 갔었던 것 같은데.. 기억이...

너무 간단한 걸 돌려봐서 그리 볼만한 데이터는 안나온 것 같습니다.

사용자 삽입 이미지
5번 과정을 마치고 나면 왼쪽 영역의 Recently Agent뭐시기가 한 줄 생깁니다. 참조의 링크에 저렇게 등록하는 방법이 설명되어 있습니다. 그냥 4번 과정에서 Agent만 실행하면 바로 등록되는게 아니라 Add to 머시기 버튼을 한 번 눌러줘야 합니다.

사용자 삽입 이미지
모니터링은 플랫폼(OS인듯..), 서버(현재 2개- 하나는 웹 애플 돌고 있는 서버, 하나는 AMS 서버), 그 위에 돌고 있는 서비스들.. 이렇게 구성되어 있는 듯 합니다.
사용자 삽입 이미지
복잡복잡..
사용자 삽입 이미지
다양한 종류의 리포트도 제공해주며.. SMTP를 설정해두면, 리포트를 메일로 보내주기도 한다는데 안 해봤습니다.

ps : 한글은 깨져요...OTL
신고
top


SpringSource Application Manager Suite

Good Tools : 2008.04.22 23:00


이건 뭘까요?

사용자 삽입 이미지
일단 설치해 봤습니다. 내일은 회사에 가서 한번 설치해서 사용해봐야겠습니다.
이 녀석의 정체는 스프링 애플리케이션 관리자 스위트
신고

'Good Tools' 카테고리의 다른 글

PDFsam  (0) 2008.07.03
이클립스 가니메데 플러그인 설치가 달라졌다.  (3) 2008.07.01
파이어폭스 3.0 용 All-In-One Gesture  (2) 2008.06.19
Terracotta  (2) 2008.05.19
SpringSource AMS 간단 사용기  (3) 2008.04.23
SpringSource Application Manager Suite  (2) 2008.04.22
Blip.tv 좋았어!!  (2) 2008.04.15
Commit comment template  (0) 2008.04.14
이클립스 SVN 플러그인 Subversive 설치  (2) 2008.04.04
Spring Tool Suite: Knowledge Base  (3) 2008.03.20
Maven + Clover  (1) 2008.03.18
top


GenericPropertyEditor 만들려면...

모하니?/Coding : 2008.04.22 21:04


0. PropertyEditor가 뭔지 알아야 함.
1. 왜 PropertyEditor를 쓰는지 알아야 함.
2. PropertyEditor를 자주 사용하는 코드가 있어야 함.
3. 자바의 Generic을 알아야 함.
4. Reflection 알아야 함.
5. ApplicationContext 알아야 함.
6. 스프링 기반 테스트 코드 만들 수 있어야 함.
7. BeanLifeCycle 적절히 이용할 줄 알아야 함.

자바의 Generic이 erasure 방식이라 아쉽지만, 그래도 잘 사용하면 엄청나게 많은 코드가 줄어들고, 코드가 줄어드는 만큼 개발 생산성은 팍팍팍 증가합니다.

Java 5 이상을 못 or 안 사용하고 계신 분들이더라도 괜찮습니다. 굳이 Generic을 사용하지 않고도 비슷한 추상 클래스를 만들어서 사용하시면 됩니다. 대신에 매번 캐스팅 하는 수고는 감수하셔야겠지만 말이죠.

스프링으로 테스트 클래스 만들어가며 GenericPropertyEditor를 만들어 봤습니다. 정말 재미있어서 옆 모니터에 틀어둔 스타리그도 안 보고, 여친님 문자가 왔었는지도 몰랐네요. 소스 코드는 공개하지 않습니다. 헤헷.

ROO보다 멋진 OSAF가 공개되는 날을 기다리며~
신고
top


찾았다. WebBindingInitializer

Spring/Chapter 13 : 2008.04.22 18:52


이 녀석이 였구나.. 여러 컨트롤러에 PropertyEditor 적용할 때 필요한 녀석이..

레퍼런스를 저 키워드로 뒤지면 다음과 같은 코드가 나옵니다.

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="cacheSeconds" value="0" />
    <property name="webBindingInitializer">
        <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" />
    </property>
</bean>

헤헷 이것만 가지고는 뭐.. 어쩌라는 건지 알 수 없죠. 저 클래스를 찾아봐야 합니다. 저 클래스를 찾는 방법은 여러 방법이 있지만, 제가 올려드리죠.

public class ClinicBindingInitializer implements WebBindingInitializer {

    @Autowired
    private Clinic clinic;

    public void initBinder(WebDataBinder binder, WebRequest request) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
        binder.registerCustomEditor(PetType.class, new PetTypeEditor(this.clinic));
    }

}

우왕~~ 귿이다~~ 이제 컨트롤러 마다 똑같은 프로퍼티 에디터 등록 안해도 되겠당.
신고
top


Q4E 플러그인 사용기 1

Build/Maven : 2008.04.19 09:30


맥용 이클립스 STS(Spring Tool Suite)에서 Q4E를 설치하고 add Maven dependency management를 해도 메이븐 라이브러리가 클래스패스에 생기지 않는 문제가 발생했습니다.

그럴 때는 프로젝트 루트 폴더에 있는 .classpath 파일에 다음의 한 줄을 추가해 주면 문제가 해결됩니다. .으로 시작하는 파일들을 보려면, Navigator 뷰에서 프로젝트를 보거나, Package Explorer의 필터에서 .* resources에 있는 체크를 없애면 됩니다.

<classpathentry kind="con" path="org.devzuz.q.maven.jdt.core.mavenClasspathContainer"/>



신고
top

TAG Eclipse, Mac, maven, Q4E

TDD 연습하기 - RomanNumber

모하니?/Coding : 2008.04.18 14:21


1부터 1000사이의 숫자를 주면 로마숫자로 변환하는 프로그램을 TDD로 개발하시오.

점심시간에 밥 빨리먹고 심심하신 분들 한 번 해보세요. 재밌네요. 캬캬..
토비형님은 자바코드 열댓줄 루비코드 대여섯줄이면 끝난다고 하네요... 워우...

자바코드로 짜실 분들을 위테 테스트코드를 올려드리겠습니다.

        assertEquals("I", maker.convert(1));
        assertEquals("II", maker.convert(2));
        assertEquals("III", maker.convert(3));
        assertEquals("IV", maker.convert(4));
        assertEquals("V", maker.convert(5));
        assertEquals("VI", maker.convert(6));
        assertEquals("VII", maker.convert(7));
        assertEquals("VIII", maker.convert(8));
        assertEquals("IX", maker.convert(9));
        assertEquals("X", maker.convert(10));
        assertEquals("XI", maker.convert(11));
        assertEquals("XII", maker.convert(12));
        assertEquals("XIII", maker.convert(13));
        assertEquals("XIV", maker.convert(14));
        assertEquals("XV", maker.convert(15));
        assertEquals("XIX", maker.convert(19));
        assertEquals("XX", maker.convert(20));
        assertEquals("XXX", maker.convert(30));
        assertEquals("XL", maker.convert(40));
        assertEquals("L", maker.convert(50));
        assertEquals("LX", maker.convert(60));
        assertEquals("LXX", maker.convert(70));
        assertEquals("LXXX", maker.convert(80));
        assertEquals("XC", maker.convert(90));
        assertEquals("C", maker.convert(100));
        assertEquals("CC", maker.convert(200));
        assertEquals("CD", maker.convert(400));
        assertEquals("D", maker.convert(500));
        assertEquals("DCLXVI", maker.convert(666));
        assertEquals("CM", maker.convert(900));
        assertEquals("M", maker.convert(1000));
        assertEquals("MCMXLV", maker.convert(1945));
        assertEquals("MCMXCIX", maker.convert(1999));
        assertEquals("MM", maker.convert(2000));
        assertEquals("MMM", maker.convert(3000));
        assertEquals("ↁ", maker.convert(5000));

간단하지요. 테스트 코드 짜는건 쉬운데.. (위키피디아에 있는 표를 전부 테스트 해봤습니다. 불필요한 것도 있겠지만.. 뭐 어때요. 캬캬캬) 전 구현해보니 60줄 정도 나왔습니다. 토비형님 코드의 4 배... 라인수는 Ctrl + Shift + F 기준입니다.

저녁값 내기로 가장 짧은 코드로 구현하기 뭐 이런거 해도 재밌겠네요. 전 .. 그러고 놀 수 사람이... 없어요. 흑흑.. 외로워... 흑흑흑... 이젠 어려운 자바습이랑 놀아야지.. @.@ 자바습아 이리온...


풀어보신 분들은 저처럼 소스 코드를 올려주세요. 부끄럽지만 제 파일도 올려둡니다. 재밌게 공유해 보아요.


신고
top


pom.xml에 종속성 추가하기





본 영상에서는 m2eclipse를 사용했지만, 사용한 기능은 매우 기본적이며 다른 기능들은 매우 미약하기 때문에, q4e 사용을 권장합니다.

위 동영상에서는 그냥 간단하게 라이브러리가 어떻게 추가되는건지만 확인해 보세요. 잘 보시면 transitive하게 spring-core가 의존하는 commons-logging을 가져온 것도 볼 수 있습니다. 바로 이러한 transitive dependency 추가 기능이 maven의 장점이면서 단점이 되기도 하는데요. 그걸 잘 다루면 별 일 안 생깁니다.
신고
top

TAG maven, pom.xml

이클립스용 Maven 플러그인 Q4E

Build/Maven : 2008.04.18 08:31


http://code.google.com/p/q4e/

플젝 홈이 구글에 있지만, 공식 이클립스 프로젝입니다. 이클립스 재단에 낸 제안서가 받아들여졌다고 합니다. 이걸 깜빡하고 m2eclipse 플러그인을 설치한 동영상까지 찍어놨는데 공개할까말까 말설여집니다. m2eclipse보다 훨씬 좋습니다.

사용자 삽입 이미지

m2eclipse의 허접한 중앙 저장소에서 검색/추가하는 기능은 없는 듯 하고 대신에 artifact를 로컬 저장소에서 검색하여 추가하는 기능이 있습니다.

사용자 삽입 이미지
그냥 보면서 감상하면 됩니다. 음.. 저게 저기서 물려오는군.. 등등의 정보를 한눈에 볼 수 있습니다.

사용자 삽입 이미지
이게 아주 유용합니다. 이걸 보면, exlusion을 어디다가 써야 할지 보입니다. 각 창이 유기적으로 물려있기 때문에, 해당 버전의 아티팩트가 어디, 어디서 끌려온 것인지, 같은 아티팩트의 다른 버전이 몇 종류나 존재하는지를 볼 수 있습니다.

이밖에도 메이븐 프로젝트 생성등. 여러가지 기능이 있습니다. Maven을 사용하시는 분들에게 강추합니다.
신고
top


기본적인 managed dependency 사용법

Build/Maven : 2008.04.17 15:22


사용자 삽입 이미지


A BOM은 오타가 아닙니다. Bill Of Material 이라는 뜻입니다. B POM은 그냥 보통의 POM 입니다. 위의 경우 A BOM(얘도 결국은 packing이 POM입니다.)을 B POM이 상속 받고 있습니다. 상속 받으면 모든 부모의 모든 속성을 자식 입장에서 사용할 수 있습니다. 따라서 A에 정의한 DM(dependecy management) 섹션도 B POM으로 상속이 됩니다.

B POM에서는 한 개의 라이브러리를 추가합니다. 그런데 버전과 스콥을 명시하지 않고 있습니다. 오호.. 이러면 안 되죠. 원래는 버전까지는 꼭 명시해줘야 합니다. 버전을 적어주지 않으면 메이븐이 종속성 추가하닥 에러 납니다. 그런데 위의 경우에는 에러가나지 않습니다. 명시한 groupId와 artifactId에 해당하는 종속성의 Bill Of Material이 DM 안에 들어있기 때문입니다. DM을 보구서.. 아항..whiteship의 a라는 라이브러리는 1.0이고 runtime scope으로 추가해야 하는 군... 이라고 알아챕니다.

이런게 언제 유용할 까요.

whiteship의 a라는 라이브러리를 runtime scope으로 참조하는 다른 프로젝트들 C POM, D POM, E POM 등이 있을 때 매번 C, D, E에도 다음과 같은 코드가 들어갈 겁니다.

<dependency>
<groupId>whiteship</groupId>
<artifactId>a</artifactId>
<version>1.0</version>
<scope>runtime</version>
</dependency>

그런데 위의 A BOM을 상속 받으면

<dependency>
<groupId>whiteship</groupId>
<artifactId>a</artifactId>
</dependency>

이렇게만 설정해 됩니다.

그런데.. Spring BOM, Hinbernate BOM, Test BOM과 같이 여러 종류의 BOM이 있으면 어떻게 해야 할까요? 단일 상속 밖에 안 되는데.. 그럼 managed dependency는 못 쓰는걸까요?

네 못 씁니다. Maven 2.0.9 이전까지는 그냥 일일히 버전과 scope 명시해 줘야 합니다. 그런데 몇일전에 2.0.9가 나왔죠. 캬캬캬. 몇일동안 끙끙 앓고있던 문제인데 풀고나니 별거 아니네요. 이론...

 이제 남은일은 이 기능을 이용해서 어떻게 효율적인 BOM과 POM을 구성하느냐 입니다.

봄폼봄폼봄폼봄폼봄폼폼폼봄봄봄폼봄폼봄봄봄폼폼
신고
top


Managed Depedency 네 녀석의 정체를 드디어 알았다.

Build/Maven : 2008.04.17 14:59


참조:
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism
http://maven.apache.org/ref/current/maven-model/maven.html#class_dependencyManagement

이 녀석의 정체는... depedency 정보(버전, Scope, 추이성)을 한 곳에 정리해둔=MANAGED 의존성=Denpendency을 사용하겠다는 것입니다. Maven 2.0.9에 추가된 import managed dependency는 바로 이 managed dependency에 관한 내용입니다.

이전에는 상속을 통해서 managed dependency를 이용할 수 있었습니다.

그런데 단일 상속만 되기 때문에 managed dependency를 사용하고 싶은 프로젝트가 여러 개일 때는 import scope을 이용해서 상속이 아닌 위임delegation을 사용해서 여러 개의 프로젝트를 import scope으로 dependencyManagement에 추가해두면, 해당 프로젝트들이 가지고 있는 managed dependency를 사용할 수 있습니다.

이 개념을 이해하기 위해.. 거의 삼일간 고생했네요.

처음에는

<dependencies>
  <dep..cy>
     ..
  </dep..cy>
  <dep..cy>
    ..
  </dep..cy
  ..
</dependencies>

이거랑

<dependencyManagement>
<dependencies>
  <dep..cy>
    ..
  </dep..cy>
  <dep..cy>
   ..
  </dep..cy
  ..
</dependencies>
</dependencyManagement>

이거랑 별 차이가 없는 건 줄 알았는데...

엄청나게 많은 차이가 있었습니다.
신고
top


도미노 피자 VIP 되다..



사용자 삽입 이미지


사람들 많은 여의도 한복판 나가서 먹기도 귀찮고.. 종종 시켜먹었더니 VIP가 됐네요. ㅋㅋ
오늘은 스위스 퐁듀..
신고
top

TAG 도미노

Spring 컨트롤러와 request scope bean

모하니?/Coding : 2008.04.16 19:07


스프링 컨트롤러와 request scope관한 이메일이 왔습니다.

...

제가 느끼고 있는 궁금증은 Controller 사용시 bean scope에 관한 부분입니다.

몇번의 프로젝트에서  SpringMVC를 이용하여 프로젝트를 했었는데요.
하나의 Controller에서 요청을 처리를 하기 위해 MultiActionController를 사용했습니다.
 
BaseController를 정의해서 BaseController가 MultiActionController를 상속받도록 만들었고,
모든 Controller는 BaseController를 상속 받아 쓰는 형식으로 구조를 잡았습니다.
 
BaseController에는 handleRequestInternal() 메소드를 오버라이드 해서 모든 request 값을
파싱하여 Map에 담도록 해놓았구요. (map에서 값을 꺼내 요청을 처리하도록 말이죠.)
 
테스트를 위해 Controller 내에서 sleep() 을 준 뒤, 몇개의 요청을 날려보면
가장 나중에 요청된 정보로 앞의 정보들이 변경되더군요.
아마도 scope이 singleton이라 그런것 같더군요.
그래서 빈 설정시에 Controller에 대한 scope을 모두 request로 바꿔줬습니다.
 
<bean id="memberController" class="MemberController" scope="request">
 
이렇게 바꾸어주니 이전과 같은 현상은 발생하지 않더군요.

과연 이렇게 하는 것이 맞는 것인지, 아니면 BaseController를 scope="request"로 만들면 그걸
상속받는 다른 빈도 request가 되는 것인지 정확한 판단이 서질 않더군요.

제가 알기로는 Spring에서 Controller 이용시 threadsafe 한 설계는 개발자의 몫이라고 들었습니다.
어디를 봐도 정확한 가이드가 나와있지 않아서 혼자 헤매다 이렇게 메일을 드리게 되었습니다.

...

그리고 다음과 같이 답변해드렸습니다.

more..


request scope 빈을 써본지가 까마득한데 이런 경우에 유용하게 쓸 수 있겠네요. 내용 공유를 허락해주셔서 감사합니다.
신고
top


Dynamic refreshing of application contexts

Spring/Mission : 2008.04.16 19:04


http://jira.springframework.org/browse/SPR-94

어서 구현해주길 바라는 스프링의 기능 중에 하나로 주시하고 있는 기능입니다. (특정 이슈를 주시하고 있으려면 JIRA에서 Watch 기능을 사용하면되죠. 변경사항이 있으면 메일이 날아옵니다.) application context를 동적으로 수정할 수 있는 기능 입니다. 좀 더 구체적으로 XML이든 JavaConfic이든 어떤 빈 설정파일들을 주기적으로 다시 읽어주는 기능입니다. 현재 스프링 3.0 M2 일정에 잡혀있습니다. 리포터를 로드존슨이고 담당자는 Pro Spring 저자 롭 하랍입니다.
신고
top


Maven으로 이클립스 프로젝트 만들기 - Screen Cast





이 동영상도 만들어 둔지 한참인데 이제야 올려봅니다.


http://keessun.blip.tv/#836768
신고
top


드디어 Spring Security 2.0 Released!!



http://www.springframework.org/node/627

아 이 녀석의 POM 때문에 어제 고생한 걸 생각하면...OTL 이번 배포판에서는 스프링 2.5.0 이상의 버전을 사용하도록 명시했군요. 대체 왜 [2.0, 2.5]라고 한건지.. 그냥 2.0 이라고 하면 알아서 2.0 이상의 버전을 쓸텐데 말이죠. petclinic 예제도 봐야겠습니다.

2.0에 추가된 기능들 요약
- OpenID 지원
- NTLM
- JSR 250 애노테이션
- AspectJ 포인트컷 표현식
- 도메인 ACL 기능강화
- RESTful URI 권한
- 그룹
- 계층적인 권한
- user 관리 API
- 데이터베이스 기반 "remember me"
- portlet 인증(로그인)
- 언어 추가
- Web Flow 2.0 지원
- Spring IDE 시각화와 자동완성
- 스프링 웹 서비스 1.5를 사용하여 WSS 기능 지원 강황

우왕.. 몇 개 빼고 다 해보고 싶네요.

참조 할 것
http://www.jroller.com/habuma/entry/method_level_security_in_spring <-- 메소드 레벨 Security 모든 방법 소개. SIA 저자. 굳.
신고
top


이클립스 템프릿 파일 추가하기



상당히 오래전에 찍어둔 동영상입니다. 이미 다른 사이트에 여러번 올려뒀었는데, 화질이 마음에 들지 않아서 블로그에 게시하지 않고 좀 더 좋은 동영상 사이트를 찾아 다니고 있었습니다. 어쨋든 오늘 좋은 사이트를 알게되어 그곳에 올릴 수 있었고 드디어 별 내용은 아니지만, 화질 좋은 상태로 동영상을 제공할 수 있게 되어 기쁩니다.



전체화면으로 보시면 매우 잘 보입니다.


아래는 비교체험 극과극을 위해 올려둡니다. 티스토리에서 직접 올리는 것도 MNCast에 올린것과 거의 동일합니다.


지X분한 UI, X저분한 광고, 더X운 화질, X러운 음질.
제가 만든 동영상 원본은 그렇치 않단 말입니다.

신고
top


Blip.tv 좋았어!!

Good Tools : 2008.04.15 23:59


Alef Arendsen이 멋진 팟캐스트를 올렸습니다. 이전에 소개해드린 STS의 주요 기능 중 하나인 Knowlede Base를 사용하는 방법이었습니다. 직접 등록하는 방법도 보여주면 좋았을 것을...하는 아쉬움이 남지만 깔끔하고  스크린캐스팅이 눈길을 끕니다.

짧게보기(요약본), 길게보기가 가능하고 고화질로 시청이 가능합니다. 화면 구석을 보니 blip.tv라고 적혀있는 링크가 있습니다

오호.. 국내 동영상 사이트(UCC 사이트 라고도 하지만..) 보다 깔끔하고 간결한 디자인과 가입 절차 그리고 멋진 UI를 제공합니다. 무엇보다 국내 사이트들은 mov 파일을 올리면 그 파일을 다시 인코딩해서 화질을 누그러트리는데 반해 저 사이트는 mov 파일의 화질을 훨씬 잘 보장해 줍니다. 나이스.. 1280 해상도로 장시간에 걸쳐 뽑아낸 동영상을 그대로 보여드릴 수 있을 것 같습니다. 나이스!!!
신고
top

TAG blip.tv






티스토리 툴바