STS(스프링 툴 스위트) 쉽게 다운 받기

http://www.springsource.com/landing/best-development-tool-enterprise-java

다운로드 페이지로 가면 이름이며 살고 있는 나라 등을 입력하라는데 귀찮습니다. 그런데도 어쩔 수 있나요. 입력해야지 하면서 입력해왔었는데.. 이게 왠 걸… MySQL 받을 때도 마찬가지였는데 여기도 우회하는 링크가 있었네요. 쥐꼬리만하게 생긴 링크가….

1

링크 누르기 전에 약관 동의에 체크 한담에 누르셔야 합니다. 그럼 편하게 STS를 받아서 사용합시다~

ps: IntelliJ는 10.5 버전에 벌써 Java 7 지원 기능이 들어갔다고 하네요…

S1A – OSGi best practive by 코스틴 리우

자바 애플리케이션 모듈화는 어렵다. 하지만 해결책은 있다.

개요
– 모듈성 개요
– 클래스 & 리소스 로딩
– 서비스 다아나믹스

모듈화 목적
=> 차 사고 났을 때 헤드라이트 나가면 거기만 갈아 낄 수 있도록.
=>

모듈성이 없는 app
– web/facade/repository 한 덩어리

모듈성이 있는 app
– ADao, BDao, CService

OSGi
– 1999년부터 사용 가능
– JDK 1.2 호환

모듈화 대안 – JSR277/JAM
– JAva Module
– “Opaque” 스펙 진행중
=> 어떻게 되가고 있는지 모르겠다.
– JDK 7.0 호환
=> 왜냐면 새로운 키워드를 사용해야 해서…
– OSGi 호환

모듈화 대안 – HK2
=> glassfish 팀이 사용하고 있다.
– 2007년 말에 밸표됨
– 애노테이션 기반 간단 IoC
– 정적인 시스템

OSGi/JSR 277 비교
– http://www.osgi.org/blog/
– http://underlap.blogspot.com/

클래스로딩
– 모듈은 자기 내부 패키지와 다른 모듈에서 가져온 패키지만 로딩할 수 있다.
– 모든 패키지는 버전을 가지고 있다.

Type Leakage
  – 공개한 클래스 계층 구조에서 내부 클래스
  – 공개한 시그너쳐에 있는 내부 클래스
=> 이런 일이 발생하면 안 돼. 그럼 어떻게 해야 할까?
– 내부 패키지를 공개해(
– ‘연결’ 인터페이스를 축출해
– Generic public 타입을 사용해
– 검증 도구(bnd)를 사용해

추이적인 의존성
– A -> C1, B ->C2 => 이렇게 여러 버전 배포 가능하다. 이럴 때 X -> A, B 이렇게 되면.. C 패키지는 어떤 버전 사용하게 되는거야?? => A나 B가 사용하고 X가 직접 사용 안 하면 상관없겠지만 X가 직접 해당 패키지를 사용하게 되면 타입 캐스팅 충돌 발생할꺼다 그래서 바운더리를 만들어줘야 한다. X -> A, B, C1 이런식으로..
또는
=> A, B, X -> C2 이런식으로 한 버전을 참조하도록 한다.
– uses 지시어를 사용해서 둘 사이의 관계를 기술하라.

AOP
– 동적 클래스 확장
– 기존 모듈 경계를 깨트린다.
=> AOP의 아름다움은 바로 transparent하게  로깅이나 트랜잭션 등을 처리해 준다는 것이다.

(과거) 컴파일-타임 위빙
– Imports를 수정해야 한다.
– provisioning 을 통해서 한다.

로드 타임 위빙
=> 이미 리졸브 된 상태에서 추가로 필요한 패키지가 있으면 못 가져온다.
– Synthetic 클래스로더 하나가 Proxy Creator Module, Advoce Module, Target Module을 모두 관리해야 한다.

동적인 로드 타임 위빙
=> 위에서 설치한 모듈이 중간에 없어지면 어떡하냐.. 프록시를 없앴다가 다시 만들어야 돼.
– 의존하는 모듈을 update 해줘야 돼
=> SpringSource DM 서버에서는 알아서 해준다.

영속화/리모팅
– 클래스 로더 사용과 연관이 많다. => 해결책은 synthetic classloader

DynamicImport-Package
– 이 건 사용을 권장하지 않아.
=> 일관성이 없이 매번 실행할 때마다 문제가 있을 수도 있고 없을 수도 있다. 여러 버전을 사용할 수 있을 경우에 완전 운에 달린 게임이다.
– 프로토타입에서나 사용하고 제품에선 사용하지 말아라.

리소스 로딩
=> 클래스 로딩과 비슷한데 silent error가 발생한다.
– 리소르를 클래스와 동일한 곳에 둔다. 클래스에서 사용할 수 있도록 -> portable cnofig 자동으로 export 된다.

공유 자원
– META-INF/services
– 버저닝이 문제가 딜 수 있다.
=> 헤결 책은 extender

Externder 패턴
=> 번들 내부 리소스를 OSGi 서비스에서 사용가능하게 해준다.

웹 애플리케이션

오너쉽 문제 누가 로딩을 주도하는가?
– OSGi 플랫폼이?
– 웹 컨테이너가?
옵션
– HttpService
– Servlet Bridge
– ClassLoader bridge(스프링 DM 서버)

웹 애플리케이션에서 클래스 로딩
– WAR는 미리 정의되어 있는 클래스패스가 있다.
– OSGi에서는 뭔가가 필요하다. => 번들 처리 도구를 사용하거나, dm 서버가 해준다.

리소스 로딩
=> 스프링DM/dm 서버가 알아서 해준다.

서비스 Dynamics

OSGi 서비스
– 간적접인 계층
– 객체를 서비스 registry에 추가하거나 제거할 수 있다.
– 타입 필터링이 자동으로 적용된다.
– 서비스는 동적이다.(언제든 사라지고 나타날 수 있다.)
– OSGi 서비스는 싱글톤이다.

OSGi 서비스와 스프링 DM
– 그림
=> decoupling

서비스 Dynamics
– org.osgi.util.ServiceTracker
– Tracking Proxy(Spring DM) => 참조하던 서비스 없어지면 대체 가능한 다른 걸로 update 해준다.

다른 이슈
– 쓰레드 Context 클래스로더
– TCCL을 사용하지 말거나 스프링 DM/dm 서버처럼 관리하라.
– 쓰레딩
– 번들/애플리케이션 관리

결론
– STS, Spring DM, dm 서버를 사용하라. @.@