public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
OrderServiceImpl
) 는 DiscountPolicy
인터페이스에 의존하면서 DIP 를 지켰는데DiscountPolicy
FixDiscountPolicy
,RateDiscountPolicy
public class OrderServiceImpl implements OrderService {
//private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
}
Null Pointer Exception
가 발생해결 방안
누군가가 클라이언트인OrderServiceImpl
에DiscountPolicy
의 구현객체를 대신 생성하고 주입해야한다
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
new MemoryMemberRepository(),
new FixDiscountPolicy());
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
DiscountPolicy
)을 담당하는 구현을 FixDiscountPolicy
객체로 변경하면 public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
여기까지 순수한 자바 코드만으로 DI를 적용
스프링을 적용해보자
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
@Configuration
을 붙여준다@Bean
을 붙여준다ApplicationContext applicationContext = new
AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService =
applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService",
OrderService.class);
ApplicationContext
를 스프링 컨테이너 라 함
기존에는 개발자가 직접 자바코드로 모든 것을 했다면
스프링 컨테이너로 부터 객체를 스프링 빈으로 등록하고
스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경
이 게시글은 인프런 김영한님의 스프링 강의을 통해 정리한 글입니다.