제 3회 스프링 세미나 토비님 발표 예제 따라하기

소스 코드
cn323.zip먼저 클래스들은 다음과 같은 구조로 되어 있습니다.

사용자 삽입 이미지Controller는 Service에 Service는 Dao에 종속성을 가지고 있습니다. 예전 같으면 XML의 설정 파일을 사용하여 다음과 같이 종속성 주입을 했을 것 입니다.

<bean id=”controller” class=”s21.Controller”>
    <property name=”service” ref=”service” />
</bean>

또는 2.0의 p 스키마를 이용하여

<bean id=”controller” class=”s21.Controller” p:service-ref=”service” />

또는 autowiring을 사용해서

<bean id=”controller” class=”s21.Controller” autowire=”byType” />

이 밖에도 여러가지 종속성을 설정할 수 있는 방법이 있지만 지금 보신 세가지 방법 중에서도 맨 마지막 방법을 Spring 2.1부터 @Autowired 애노테이션으로 대체 할 수 있습니다.

현재는 M2 에서 required 속성 하나가 추가가 됐고 타입으로만 종속성을 주입하지만 정식 버전이 나올 때는  더 많은 속성을 지원 해 주지 않을까 예상해 봅니다.
사용자 삽입 이미지적어도 기존의 XML 설정에서 할 수 있었던 저 정도의 설정들은 모두 가능하게 해줘야 하지 않을까 생각합니다.

Anyway, 토비님 예제 코드를 보고 기억나는 부분을 더듬어서(패키지 이름까지..ㅋ) 만들어 보았습니다. 세미나에 불참하셨거나, 참석하신 분들 중에서 소스 코드를 보고 싶으신 분들은 다운로드 하여 이것 저것 변경해보시면 되겠습니다.

시간이 멈춘다면…(Cashback)

구체적으로는 모든 사물이 멈추고 나만 움직일 수 있다면…

http://video.google.com/videoplay?docid=8633322516676413709

어렸을 적 보았던 ‘아름다움’에 빠져드는 주인공.

‘외설이냐 예술이냐’라는 논란이 일었던 대부분의 영화는 외설이라고 생각합니다.
예술적인 영화는 그런 논란이 일어날 여지조차 없이 예술적이기 때문이죠.

17분이라는 짧은 동영상인데 이 것이 전체 영화의 일부분인지 전체인지는 모르겠습니다.
더 있다면 더 보고 싶네요.

영화 관련 정보
http://en.wikipedia.org/wiki/Cashback_(film)

‘RFC 2119’가 뭐지??

JSR-250 스펙을 읽던 중 처음 부터 막히기 시작합니다.

“본 문서의 “SHOULD, SHOULD NOT, MUST 등등등’의 표현은 RFC 2119를 따르고 있다.”

이런 문구가 처음 부터 저를 귀찮게 합니다. 안그래도 JSR-250 이라는 이름도 무슨 암호 같아서 기분이 언짢았는데 시작부터 또 다른 암호가 나를 괴롭히는구나.. 아무리 나를 괴롭혀도 나한텐 구글신이 있거든? 하면서 검색을 하니까 역시나 구글신.. 바로 알려줍니다.

“Key words for use in RFCs to Indicate Requirement Levels”
“RFC에서 사용하는 필수 정도를 나타내는 단어”


1. MUST 이 단어와 "REQUIRED" 그리고 "SHALL" 은 꼭 필요한 요구사항을 정의할 때 사용.

2. MUST NOT 이 구문과 "SHALL NOT"은 절대 금지 사항을 나타낼 때 사용.

3. SHOULD 이 단어와 "RECOMMENDED"는 없어도 되지만 그래도 권장할 때 사용.

4. SHOULD NOT 이 구문과 "NOT RECOMMENDED"는 3번과 반대의 의미.

5. MAY 이 단어와 "OPTIONAL" 완전 선택적이라는 뜻을 나타낼 때 사용.

자 그럼 다시 JSR-250으로 돌아갑니다. :)

3.10.3. @PostConstruct and @PreDestroy

Bean Life Cycle 콜백 중에서 InitializingBean과 DisposableBean 인터페이스를 사용하거나 XML 설정에서 bean 태그 속성 중에 init-method와 destroy-method 을 사용하여 특정 메소드를 생성자가 호출 된 후(초기화 이후)나 객체가 소멸되기 전에 실행할 메소드를 지정할 수 있었습니다.

이것에 대한 또 다른 대안이자 JSR-250 라이프사이클 애노테이션 표준을 따르는 @PostConstruct와 @PreDestroy 애노테이션이 Spring 2.1에 추가되었습니다.

public class CachingMovieLister {

    @PostConstruct
    public void populateMovieCache() {
        // populates the movie cache upon initialization…
    }
   
    @PreDestroy
    public void clearMovieCache() {
        // clears the movie cache upon destruction…
    }
   
}

사용법은 위 처럼 더욱 간편해 졌습니다.

정리하다 보니 궁금한 것이 생겼는데 애노테이션에서도 설정하고 XML에서도 설정을 하면 어떻게 될지 입니다.
그래서 예제를 만들어 돌려보았습니다.

public class SimpleMovieLister {

    public void initMethod(){
        System.out.println(“initMetod”);
    }

    @PostConstruct
    public void postConstuct(){
        System.out.println(“postConstruct”);
    }

}

    <bean name=”lister” class=”whiteship.SimpleMovieLister”
        init-method=”initMethod” />

init-method 속성도 사용하고 @PostConstruct 애노테이션도 사용하면 다음과 같이 @PostConstruct가 먼저 적용되는 것을 확인할 수 있었습니다.

사용자 삽입 이미지

3.10.2. @Resource

@Autowired 애노테이션의 경우 타입으로 오토 와이어링을 하고 있습니다. 따라서 같은 타입이 여러개인 경우 예외가
발생합니다. 이 때 bean의 Name으로 종속성을 주입할 수 있는데 @Resource 애노테이션과 name 속성을 사용하면
됩니다.

public class SimpleMovieLister {

    @Resource(name=”myMovieFinder”)
    private MovieFinder movieFinder;

    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    public MovieFinder getMovieFinder() {
        return movieFinder;
    }

}

SimpleJndiBeanFactory를 명시적으로 설정해둔 경우에는 JNDI를 사용하여 해당 이름의 객체를 가져오지만 그렇치 않은 기본적인 경우에는 CommonAnnotationBeanPostProcessor를 사용하는 BeanFactory에서 가져옵니다.