다양한 의존관계 주입 방법

생성자 주입

생성자를 통해서 의존 관계를 주입 받는 방법

생성자

객체를 생성할 때 호출되는 특별한 메서드

⇒ 클래스의 이름과 동일하며 반환 타입이 없다

⇒ 클래스의 인스턴스를 만들 때 호출된다.

@Component
public class OrderServiceImpl implements OrderService {
/*
	기본 생성자 (하나의 클래스에는 여러 개의 생성자가 생성될 수 있다)
	public : 다른 패키지, 클래스에서 접근할 수 있는
	class : 클래스인
	OrderServiceImpl : OrderServiceImpl 객체는
	implements : 인터페이스를 구현한다.
	OrderService : OrderService 인터페이스
*/

		private final MemberRepository memberRepository;
		/*
			멤버 변수 (클래스 내 다른 메서드에서 사용할 수 있는 변수)
			private : 다른 패키지, 클래스에서 접근할 수 없으며
			final : 초기값을 가지면 수정할 수 없는
			MemberRepository : MemberRepository 타입의 (MemberReposiotry 클래스의)
			memberRepository : memberRepository 객체

			=> final (초기값을 가지면 외부에서 수정할 수 없다)
			=> **불변해야 하는 의존 관계에 사용**
		*/

		private final DiscountPolicy discountPolicy;
		/*
			멤버 변수 (클래스 내 다른 메서드에서 사용할 수 있는 변수)
			private : 다른 패키지, 클래스에서 접근할 수 없으며
			final : 초기값을 가지면 수정할 수 없는
			DiscountPolicy : DiscountPolicy 타입의
			discountPolicy : discountPolicy 객체
		*/

		@Autowired
		// 의존성 자동 주입
		public OrderServiceImpl(MemberRepository memberRepository,
														DiscountPolicy discountPolicy) {
		/*
			생성자 (초기값을 전달 받아, 객체 생성)
			
			전달 받은 값을 인스턴스 변수에 설정한다

			=> 생성자에는 거의 무조건 값을 채워 넣어야 한다
			=> **필수적인 의존 관계에 사용**
		*/

					this.memberRepository = memberRepository;
					this.discountPolicy = discountPolicy
		} 
}

기본 생성자를 제외하고 생성자가 1개만 있을 경우, @Autowired를 생략해도 자동 주입된다.

수정자 주입 (setter 주입)

setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법

필드

객체의 상태를 나타내고 객체가 가지는 데이터를 저장하는 공간