(스프링) 의존성 주입

다양한 의존성 주입 방법

종속성 주입에는 생성자 주입, 수정자 주입, 필드 주입 및 일반 메서드 주입의 네 가지 주요 방법이 있습니다.

가장 추천하는 기법인 생성자 주입을 코드로 살펴보자!

@Component
public class OrderServiceImpl implements OrderService {
	
    private final MemberRespository memberRepository;
    private final DiscountPolicy discountPolicy;
    
    @Autowired
    public OrderServiceImpl(MemberRespository memberRepository, DiscountPolicy discountPolicy) {
    	this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

}

생성자가 1개인 경우 @Autowired를 생략해도 자동으로 삽입된다.

마지막 키워드

생성자 주입을 사용할 때 필드에 final 키워드를 사용할 수 있습니다. 생성자에 값이 설정되지 않은 오류가 발생하면 컴파일 타임에 오류를 감지할 수 있습니다.

    @Autowired
    public OrderServiceImpl(MemberRespository memberRepository, DiscountPolicy discountPolicy) {
    	this.memberRepository = memberRepository;
        // 위의 코드와 다른 부분은 같고, discountPolicy에 값을 설정하는 코드가 누락됨!
        // 오류발생 java: variable discountPolicy might not have been initialized
    }

생성자를 사용하여 최종 멤버 변수 초기화
final로 표시된 변수는 상수이므로 일반적으로 동시에 선언되고 초기화됩니다. 인스턴스 변수는 생성자에서 초기화할 수 있습니다. 클래스에 매개변수가 있는 생성자를 선언하면 인스턴스 생성 시 생성자의 매개변수로 final을 사용하여 멤버 변수를 초기화하는 데 필요한 값을 제공합니다. – Java 346p의 고전 –

Lombok을 사용한 기본 코드 감소

Lombok 라이브러리에서 제공하는 @RequiredArgsConstructor 함수를 사용하면 후행 필드를 수집하여 생성자를 자동으로 생성합니다.

@Autowired를 생략하고 Lombok의 자동 생성자 생성 기능을 사용한 결과 코드는 다음과 같다.

  @Component
  @RequiredArgsConstructor
  public class OrderServiceImpl implements OrderService {
      private final MemberRepository memberRepository;
      private final DiscountPolicy discountPolicy;
}