이번에는 @Import를 사용해서 빈 설정을 추가하는 방법입니다.

[gist id=1633142]

이렇게 @Import 애노테이션을 사용해서 다른 자바 설정을 추가할 수 있습니다. 이렇게하면, 상속을 사용하지 않아도 되지만, 상속했을 때처럼 무언가를 변경할 방법이 보이질 않습니다. 그리고 @Import에 사용할 클래스 이름을 외워야 한다는 문제는 여전히 남게되죠.

일단 @Import를 메타 애노테이션으로 사용하는 @Enable*애노테이션을 만들 수 있습니다.

[gist id=1633158 file=EnableHello.java]

이렇게 @EnableHello라는 애노테이션을 만들고, @Import로 HelloConfig.java설정을 여기에 추가해뒀습니다. 그럼 이제, AppConfig는 @Import를 직접 사용하는게 아니라, @EnableHello를 이용해서 간접적으로 사용할 수 있게 됩니다.

[gist id=1633158 file=AppConfig.java]

이제 클래스 이름을 몰라도 되긴하지만, 아직도 확장할 방법은 보이질 않죠. @EnableHello 애노테이션에 속성을 추가하고, 그 애노테이션 정보를 활용해서 빈 정보를 조작할 수 있습니다.

먼저 @EnableHello를 다음과 같이 바꿔보죠.

[gist id=1633185 file=EnableHello.java]

이렇게 애노테이션에 속성을 추가하면, 이젠 반드시 @EnableHello를 사용할 때 name 값을 줘야 합니다. (물론, default 키워드로 기본값을 설정하면 강제적으로 설정하지 않게 할 수도 있죠.)

[gist id=1633185 file=AppConfig.java]

그럼 그리고 이제 HelloConfig가 ImportAware라는 인터페이스를 구현하게합니다.

[gist id=1633185 file=HelloConfig.java]

이렇게 ImportAware 인터페이스의 구현 메서드에서 @Import가 붙어있는 곳(여기서는 AppConfig.java)의 애노테이션 정보(@EnableHello)를 바탕으로 빈 속성을 변경하게 했습니다.

이게 끝이아니라, 이제부터 시작입니다.

만약에 지금처럼 단순하게, 빈의 내용만 바꾸는게 아니라, 특정 속성에 따라 등록되어야 하는 빈 자체가 달라진다면 어떻게 해야할까요? 지금은 HelloConfig에 선언한 모든 @Bean이 반드시 빈으로 등록되고 있는데, 특정 옵션에 따라 어떤 빈이 필요하기도 하고, 필요없기도 하다면... ㅎㅎ 문제가 점점 재밌어 집니다.