↩뒤로가기

컴포넌트 스캔과 의존관계 자동 주입 시작하기

코드로 컴포넌트 스캔과 의존관계 자동 주입을 알아보자. 먼저 기존 AppConfig.java는 과거 코드와 테스트 유지를 위해 남겨두고, 새로운 AutoAppConfig.java를 만들어서 진행한다.

package hello.core;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

@Configuration
//
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
        //뺄 내용을 지정. 기존에 만들어둔 Configuration을 중복등록하기 때문이다.
)
public class AutoAppConfig {
}

<aside> 💡 컴포넌트스캔을 사용하면 @Configuration이 붙은 설정 정보도 자동으로 등록되기 때문에, AppConfig, TestConfig 등 이전에 연습을 하며 만들어두었던 설정도 함께 등록되고 실행된다. 그래서 excludeFilters를 통해 기존 설정 정보는 스캔 대상에서 제외했다. 보통 설정 정보를 컴포넌트 스캔 대상에서 제외하지는 않지만, 예제 코드를 최대한 유지하고 남기자는 차원에서 이 방법 선택.

</aside>

MemoryMemberRepository @Component 추가

@Component
public class MemoryMemberRepository implements MemberRepository {}

RateDiscountPolicy @Component 추가

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

MemberServiceImpl @Component, @Autowired 추가

@Component
public class MemberServiceImpl implements MemberService {
	 private final MemberRepository memberRepository;
 @Autowired
	 public MemberServiceImpl(MemberRepository memberRepository) {
			 this.memberRepository = memberRepository;
	 }
}

OrderServiceImpl @Component, @Autowired 추가

@Component
public class OrderServiceImpl implements OrderService {
		private final MemberRepository memberRepository;
		private final DiscountPolicy discountPolicy;
		@Autowired
//오토와이어를 사용하면 생성자에서 여러 의존관계를 주입받을 수 있다.
		public OrderServiceImpl(MemberRepository memberRepository,
DiscountPolicy discountPolicy) {
				this.memberRepository = memberRepository;
				this.discountPolicy = discountPolicy;
		}
}