이제야... 이 글을 올릴 수 있게 됐네요. ㅎㅎㅎ 저번 주부터 올리고 싶었던 글인데, 별것도 아닌거 가지고 삽질을 하느라고 늦어졌습니다.

@Configurable이 뭔지, 왜 사용해야 하는지 궁금하시면 먼저 토비님이 마소에 기고하셨던 글인 "스프링프레임워크와 DDD(Driven Driven Design)"와 그 글을 보고 감명을 받은 찬욱군의 도메인 개체가 빈으로 선언되야 하는 걸까?와 제가 쓴 @Configurable을 사용해야 하는 이유를 읽으시는게 좋습니다.

1. 도메인 객체 구현. + 2. @Configurable 설정.
2. XML 설정.
3. java 아규먼트 설정.
4. 테스트.

0 순위가 빠졌네요. 테스트 코드부터 작성하겠습니다.

new를 사용해서 도메인 객체를 생성하고, 이 객체가 Repository라는 객체를 가지고 있나 확인하는 매우 간단한 코드입니다.

1. 도메인 객체 구현. + 2. @Configurable 설정.

구현은 간단합니다.

주목해서 봐야할 부분은 Repository 객체를 new 키워드로 생성하여 가지고 있지 않습니다. 스프링의 DI를  사용하여 주입받을 것이기 때문입니다.

그리고 클래스 선언 부 위에 @Configurable 애노테이션을 사용하여 이 객체를 스프링이 관리하도록 설정합니다. 괄호 안에는 스프링에서 이 객체를 나타낼 bean의 이름을 적어줍니다. 위와같이 클래스 명과 동일할 때는 생략해도 됩니다.

2.  XML 설정.

스프링 설정 파일은 다음과 같습니다.
gg

스프링 2.5에 새로 추가된 context 네임스페이스를 추가한 뒤, <context:load-time-weaver /> 엘리먼트와 <context:spring-configured /> 엘리먼트를 추가해줍니다. <context:spring-configured /> 이 녀석은 @Configurable이 붙어있는 bean을 찾아서 스프링이 관리하도록 설정합니다. 이 때 LTW(load time weaver)를 필요로 하는데, 이 녀석을 사용하도록 <context:load-time-weaver /> 엘리먼트를 등록해 줍니다.

그리고 member 객체는 명시적으로 컨테이너에서 만들 수 없도록 abstract 속성을 true로 해주고, 매번 다른 객체처럼 취급해야 하기 때문에 prototype Scope으로 설정해줍니다.

beans 엘리먼트에서 Autowiring 설정을 byName으로 해두었기 때문에, Member 클래스에 RepositoryImpl 클래스를 주입해 줄 것입니다.

3. java 아규먼트 설정.

Run -> Open Run Dialog를 클릭하고 JUnit을 우클릭하여 new를 선택하여 새로운 테스트 스크립트를 작성합니다.

이때 Test에서는 기존의 Test와 같은 값을 주고, Argument 탭에서 다음과 같이 -javaagent 옵션을 사용하여 spring-agent.jar 파일의 위치를 알려줍니다.

사용자 삽입 이미지
4. 테스트.
사용자 삽입 이미지
휴~ 이제 시작이네요. ㅎㅎ