@Configurable 사용하기
이제야... 이 글을 올릴 수 있게 됐네요. ㅎㅎㅎ 저번 주부터 올리고 싶었던 글인데, 별것도 아닌거 가지고 삽질을 하느라고 늦어졌습니다.
@Configurable이 뭔지, 왜 사용해야 하는지 궁금하시면 먼저 토비님이 마소에 기고하셨던 글인 "스프링프레임워크와 DDD(Driven Driven Design)"와 그 글을 보고 감명을 받은 찬욱군의 도메인 개체가 빈으로 선언되야 하는 걸까?와 제가 쓴 @Configurable을 사용해야 하는 이유를 읽으시는게 좋습니다.
1. 도메인 객체 구현. + 2. @Configurable 설정.
2. XML 설정.
3. java 아규먼트 설정.
4. 테스트.
0 순위가 빠졌네요. 테스트 코드부터 작성하겠습니다.
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MemberTest {
@Test
public void testDI() throws Exception {
Member member = new Member();
assertNotNull(member.getRepository());
}
}
new를 사용해서 도메인 객체를 생성하고, 이 객체가 Repository라는 객체를 가지고 있나 확인하는 매우 간단한 코드입니다.
1. 도메인 객체 구현. + 2. @Configurable 설정.
구현은 간단합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
@Configurable("member")
public class Member {
@Autowired
private Repository repository;
public void setRepository(Repository repository) {
this.repository = repository;
}
public Repository getRepository() {
return repository;
}
public Integer save() {
return repository.add(this);
}
}
주목해서 봐야할 부분은 Repository 객체를 new 키워드로 생성하여 가지고 있지 않습니다. 스프링의 DI를 사용하여 주입받을 것이기 때문입니다.
그리고 클래스 선언 부 위에 @Configurable 애노테이션을 사용하여 이 객체를 스프링이 관리하도록 설정합니다. 괄호 안에는 스프링에서 이 객체를 나타낼 bean의 이름을 적어줍니다. 위와같이 클래스 명과 동일할 때는 생략해도 됩니다.
2. XML 설정.
스프링 설정 파일은 다음과 같습니다.
<context:load-time-weaver />
<context:spring-configured />
<bean id="member" class="whiteship.Member" abstract="true"
scope="prototype" />
<bean id="repository" class="whiteship.RepositoryImpl" />
</beans>
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. 테스트.
휴~ 이제 시작이네요. ㅎㅎ