public class AppConfig {
//애플리케이션의 전체 동작 방식을 구성하기 위해, 구현 객체를 생성하고 연결하는 책임을 가진다.
public MemberService memberService(){
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService(){
return new OrderServiceImpl(new MemoryMemberRepository(),new FixDiscountPolicy());
}
}
AppConfig를 통해서 각 클래스는 실행에만 집중을 할 수 있게 되었다.
+) 위의 코드로 MemoryMemberRepository를 각각 생성하게 되면 static 변수를 사용했었기 때문에 오류는 안나지만 서비스 객체 마다 달른 레포지토리 객체를 할당받게 된다.
위에서 언급한 점을 수정한 코드
public class AppConfig {
//애플리케이션의 전체 동작 방식을 구성하기 위해, 구현 객체를 생성하고 연결하는 책임을 가진다.
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(),discountPolicy());
}
public DiscountPolicy discountPolicy(){
return new FixDiscountPolicy();
}
}
+) 멤버 변수를 사용해서 생성을 하게 되면 추후 스프링에서 제공하는 기능의 지원을 받지 못한다. (@Bean, @Scope)
부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식 클래스가 어떤 객체를 생성할 지 결정하도록 하는 패턴이다. 부모 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.
참조
제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전
프레임워크와 라이브러리
프레임워크 - 내가 작성한 코드를 제어하고, 대신 실행(Junit)
라이브러리 - 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리이다.