본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] AspectJ로 bean이 아닌 오브젝트에 DI 적용하기

by 김코더 김주역 2022. 10. 13.
반응형

도메인 오브젝트에 비즈니스 로직을 대부분 적용하는 DDD(Domain Driven Design, 도메인 주도 설계) 방식을 사용한다면 도메인 오브젝트에도 DI가 필요할 것이다. 그렇다고 도메인 오브젝트를 프로토타입 스코프 bean으로 등록하면 iBatis, JPA 등의 프레임워크에서는 이런 방식의 적용이 불가능하다. 이럴 때는 어떡해야 할까?

 

1. DependencyInjectionAspect

- @Configurable이 붙은 도메인 오브젝트가 생성될 때마다 이 어드바이스가 적용되어 자동으로 DI를 수행해주는 애스펙트다. 정확히 말하자면, 수정자 메소드의 이름을 이용해 필요한 bean을 주입해주는 어드바이스를 갖고 있고, @Configurable이 붙은 클래스의 생성자가 호출돼서 오브젝트가 만들어질 때 어드바이스가 실행되게 하는 포인트컷을 갖고 있다.

※ 설정용 어노테이션인 @Configuration과 혼동하지 않도록 유의하자.

 

 

2. @Configurable 도메인 오브젝트

- 다음과 같이 도메인 오브젝트에 @Configuration을 붙이고, bean을 DI 받기 위한 수정자 메소드만 만들어두면 된다. 이렇게 해두면 DependencyInjectionAspect의 포인트컷에 의한 선정 대상이 되어 bean에 대한 DI가 수행된다.

@Configurable
public class User {
    private Userservice userService;
    
    public void setUserService(UserService userService) {...}
    
    ...
}

 

 

3. @Configurable 도메인 오브젝트에 대한 DI 설정 방법

1) <bean> 설정

- Bean을 생성하는 대신에 <bean>의 프로퍼티 설정을 DI 작업에 활용한다.

- bean 오브젝트가 만들어질 필요가 없기 때문에 abstract 속성을 true로 준다.

<bean class="com.example.demo.domain.User" abstract="true">
    <property name="userService" ref="userService" />
</bean>

<bean id="userService" ...>

 

2) @Configurable.autowire 설정

- @Configurable 어노테이션의 autowire 속성에 자동와이어링 방식을 지정해주는 방법이다. autowire 속성에는 Autowire.BY_NAME 또는 Autowire.BY_TYPE을 지정하여 bean의 선정 기준(이름, 타입)을 결정할 수 있다.

@Configurable(autowire=Autowire.BY_NAME)
public class User {...}

- 모든 수정자 메소드에 DI를 시도하기 때문에 위험하고 성능상 좋지 않다.

 

 

3) 어노테이션 의존관계 설정

- @Autowired나 @Resource를 이용해 bean을 주입할 수 있다.

@Configurable
public class User {
    @Autowired private Userservice userService;
    
    public void setUserService(UserService userService) {...}
    
    ...
}

- 수정자 메소드를 생략해도 되긴 하지만 단위 테스트를 할 때를 대비하여 수정자 메소드는 남겨두는 것이 좋다.

 

 

4. DependencyInjectionAspect

- DependencyInjectionAspect를 적용하기 위한 2가지 작업이 필요하다.

 

1) 로드타임 위버 추가

- 클래스를 로딩하는 시점에 바이트코드 조작이 가능하도록 로드타임 위버를 추가한다. lib 폴더에 org.springframework.instrument-3.0.7.RELEASE.jar 파일이 들어있다면 JVM 기동 옵션을 다음과 같이 지정해준다.

-javaagent:lib/org.springframework.instrument-3.0.7.RELEASE.jar

그리고 xml 설정 파일에 <context:load-time-weaver />를 추가해주면 된다. 만약 AspectJ를 위한 aop.xml 파일을 등록해두지 않았다면 aspectj-weaving을 "on"으로 지정하면 된다.

<context:load-time-weaver aspectj-weaving="on"/>

 

2) <context:spring-configured/>

- xml 설정 파일에 이 태그를 추가하면 @Configurable을 이용하는 DependencyInjectionAspect를 등록할 수 있다.

 

 

 

● 참고 자료 : 토비의 스프링 3.1 Vol.2

 

 

반응형

댓글