Back-end/Spring

[SpringBoot] 컴포넌트 스캔과 의존관계 자동 주입 (@Component, @Autowired, @RequiredArgsConstructor)

poppy 2022. 1. 16. 15:49
반응형

이전에 @Configuration, @Bean을 사용해 DI를 했던 것을 더 간단하게 줄여보겠다.

 

컴포넌트 스캔

- 설정 정보가 없어도 자동으로 스프링 빈으로 등록하는 기능

 

다음과 같이 설정 정보에 @ComponentScan을 붙이면 컴포넌트 스캔을 사용할 수 있다. 컴포넌트 스캔은 @Component가 붙은 클래스를 스프링 빈으로 등록해준다. 이전처럼 설정정보에 @Bean을 붙여주지 않아도 되므로 간단해진다! 스프링 빈으로 등록할 클래스에 모두 @Component를 붙여주면 컴포넌트 스캔의 대상이 된다.

@Configuration
@ComponentScan // @Component가 붙은 클래스를 스프링 빈으로 등록해준다
public class AutoAppConfig {

}

@Component // 스프링 빈으로 등록할 클래스라는 의미
public class MemoryMemberRepository implements MemberRepository{
	// ...
}

 

의존관계 자동 주입

이전에는 설정 정보에서 의존관계를 주입을 해주었는데, 위의 코드처럼 바꾸면 의존관계가 주입되지 않는다. 그렇다면 의존관계를 어떻게 주입해줘야 할까?

@Configuration
public class AppConfig {

    @Bean
    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
}

 

바로 @Autowired를 사용하면 자동으로 의존관계를 주입해준다. 스프링 컨테이너가 해당 스프링 빈을 찾아서 주입해준다.

@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

    // ...
}

 

 @RequiredArgsConstructor를 사용하면 위 코드를 더 줄일 수 있다. final이 붙은 필드들을 모아 생성자를 자동으로 만들어준다. 따라서 자동으로 의존관계가 주입된다.


@Component
@RequiredArgsConstructor // final이 붙은 필드의 생성자를 자동으로 만들어준다
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
}
반응형