자동 등록을 선호하는 추세이다. 설정 정보를 기반으로 애플리케이션을 구성하는 부분과 실제 동작하는 부분을 명확하게 나누는 것이 이상적이지만, 개발자 입장에서 스프링 빈을 하나 등록할 때 @Component만 넣어주면 끝나는 일을 설정정보에 가서 하나씩 적어주는 과정은 번거롭다. 또한 관리할 빈이 많아서 설정 정보가 커지면 설정 정보를 관리하는 것 자체가 부담이 된다. 그리고 결정적으로 자동 빈 등록을 사용해도 OCP, DIP를 지킬 수 있다.
애플리케이션은 업무 로직과 기술 지원 로직으로 구분할 수 있다.
애플리케이션에 광범위하게 영향을 미치는 기술 지원 객체는 수동 빈으로 등록해서 설정 정보에 드러나게 하는 것이 유지보수에 좋다.
DiscountService가 의존관계 자동 주입으로 Map<String,DiscountPolicy>에 주입 받는 상황을 생각해보자. 여기에 어떤 빈들이 주입될지와 각 빈들의 이름은 무엇일지 코드만 보고 쉽게 파악할 수 없다. 자동 등록을 사용했기 때문에 파악하려면 여러 코드를 찾아봐야 한다. 이런 경우 수동 빈으로 등록하거나 또는 자동으로하면 특정 패키지에 같이 묶어두는게 좋다. 핵심은 한눈에 이해가 되어야 하는 것이다.
이 부분을 별도의 설정 정보로 만들고 수동으로 등록하면 다음과 같다. 한눈에 빈 이름과 어떤 빈들이 주입될지 파악할 수 있다. 만약 자동 등록을 사용하고 싶으면 DiscountPolicy의 구현 빈들만 따로 모아서 특정 패키지에 모아두자.
@Configuration
public class DiscountPolicyConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}