자바로 빈 와이어링하기
대부분 컴포넌트 스캐닝과 오토 와이어링을 사용한 자동 스프링 설정을 선호하지만, 이때 자동 설정은 옵션이 아니며 스프링을 명시적으로 설정해야한다. 예를 들면, 타사 라이브러리의 컴포넌트를 애플리케이션으로 와이어링 하고자 했을 때, 그 라이브러리의 소스 코드를 가지고 있지 않으므로 클래스를 @Component와 @Autowired를 사용하서 어노테이트 할 수 없다. 따라서 자동 설정은 선택지가 아니다.
JavaConfig
JavaConfig는 매우 강력하고, Type-safe하며, 리팩토링이 친화적이므로 명시적인 설정을 위해 선호하는 옵션이다.
JavaConfig는 컴포넌트와 동일한 언어로 작성되었지만, 설정용 코드이며 다른 자바 코드와 완전히 동일하지 않다.
어떠한 비즈니스 로직도 포함하지 않고, 비즈니스 로직이 있는 코드에 영향을 주지도 않는다.
1. 설정 클래스 만들기
1 2 3 4 | @Configuration public class CDPlayerConfig { } | cs |
JavaConfig 클래스 만들기의 핵심은 @Configuration으로 어노테이트하는 것이다.
@Configuration 어노테이션은 이를 설정 클래스로서 식별하고, 스프링 애플리케이션 컨텍스트에서 만들어진 빈의 자세한 내용이 포함될 수 있다는 것을 나타낸다.
2. 간단한 빈 선언하기
1 2 3 4 5 6 7 8 9 | @Configuration public class CDPlayerConfig { @Bean public CompactDisc sgtPeppers () { return new stgPeppers(); } } | cs |
JavaConfig에서 빈을 선언하기 위해서 원하는 타입의 인스턴스를 만드는 메서드를 만들고, @Bean으로 어노테이트한다.
@Bean은 이 메서드가 스프링 애플리케이션 컨텍스트에서 빈으로 등록된 객체를 반환해야 함을 나타낸다.
기본적으로 빈의 ID는 @Bean으로 어노테이트된 메서드의 이름을 따라간다. 그리고 이것 또한 설정해줄 수 있다.
1 2 3 4 5 6 7 8 9 | @Configuration public class CDPlayerConfig { @Bean(name="lonelyHeartsClubBand") public CompactDisc sgtPeppers () { return new stgPeppers(); } } | cs |
자바를 이용해서 응용을 한다면 아래처럼 만들 수 도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @Configuration public class CDPlayerConfig { @Bean(name="lonelyHeartsClubBand") public CompactDisc sgtPeppers () { int choice = (int) Math.floor(Math.random() * 4); switch (choice) { case 0 : return new SgtPeppers(); case 1 : return new WhiteAlbum(); case 2 : return new HardDaysNight(); default : return new Revolver(); } } } | cs |
3. JavaConfig 주입하기
JavaConfig에서 빈을 와이어링하는 가장 간단한 방법은 참조된 빈 메서드를 참조하는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Configuration public class CDPlayerConfig { @Bean public CDPlayer cdPlayer () { return new CDPlayer(sgtPeppers()); } @Bean public CompactDisc sgtPeppers () { return new stgPeppers(); } } | cs |
그러나 이 방법은 동일 인스턴스 여부를 혼동할 수 있으므로 아래처럼 사용하는 것이 낫다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Configuration public class CDPlayerConfig { @Bean public CDPlayer cdPlayer (CompactDisc compactDisc) { return new CDPlayer(compactDisc); } @Bean public CompactDisc sgtPeppers () { return new stgPeppers(); } } | cs |
cdPlayer() 메서드는 파라메터로 CompactDisc를 사용한다. 스프링이 CDPlayer 빈을 만들기 위해 cdPlayer() 를 호출했을 때, CompactDisc를 설정 메서드로 오토와이어링 한다. 그 후에 메서드의 몸체는 이를 사용한다.
이 방법으로 cdPlayer() 메서드는 CompactDisc의 @Bean 메서드를 명시적으로 참조하지 않고서도 CompactDisc를 CDPlayer의 생성자에 주입할 수 있다.
|
이 포스트는 스프링 인 액션을 읽고 개인적으로 필요하다고 생각되는 내용을 정리한 포스트입니다. 일부 내용, 소스코드는 스프링 인 액션의 내용일 수 있습니다. |
'🌱 SPRING > 스프링 인 액션' 카테고리의 다른 글
조건부 빈 (0) | 2018.05.21 |
---|---|
XML로 빈 와이어링하기 (0) | 2018.05.07 |
빈 와이어링 - 자동 와이어링 (0) | 2018.05.07 |
스프링 컨테이너 (0) | 2018.05.06 |
종속객체 주입 (DI, Dependency Injection) (0) | 2018.05.06 |