제어의 역전

이재호·2023년 1월 17일
완전히 틀릴 수도 있습니다..

기존 프로그램은 구현 객체가 서버 구현 객체를 생성,연결,실행했음.
근데 AppConfig가 등장한 이후에는 구현 객체는 자신의 로직을 실행하는 역할만 담당하고 프로그램 제어 흐름은 AppConfig가 알아서 해준다.

프레임워크 같은 것들이 내가 작성한 코드를 대신 실행시켜준다.
실행시키려면 그냥 시킬 수 없다. 제어의 역전, 의존성 주입이 필요하다.
의존성은 하나의 클래스가 어떤 것을 구현하는지에 따라서 결정된다.
만약 discountPolicy라는 할인 정책이 있다면 이 할인 정책에는
정해진 %에 따라 할인해주는 정책, 가격 상관없이 개수당 얼마를 할인해주는 두 가지 정책이 있다. 근데 프레임워크 입장에서는 애플리케이션을 실행할 때 마다 어떤 할인 정책을 사용해야할 지 모른다.

"애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버가 연결되는 것을 의존 관계 주입"이라고 한다.

스프링은 컴포넌트 스캔을 한다. 그럼 클래스가 @Component라고 표시되어 있으면 스프링 컨테이너에 올려야하는데, 올리려면 생성자가 필요하다.
@Autowired가 있고
public OrderServiceImpl(MemberRepository memberRepository,
DiscountPolicy discountPolicy)라고 되어 있으면 스프링 빈에서 MemberRepository이랑 DiscountPolicy을 꺼내서 OrderserviceImpl생성자에 넣어준다.

생성자가 하나일때는 Autowired안넣어줘도 됌!

생성자 주입은 스프링이 뜰 때, 모든 bean을 등록해야하기 때문에 함께 일어난다. 그럼 스프링에서도 new OrderServiceImpl(memberRepository,discountPolicy)를 호출해야하는데, @Autowired가 달려있으면 스프링 빈에서 memberRepository,discountPolicy를 꺼내온다.

profile
에라 모르겠다~ i love it~

0개의 댓글