AppConfig : IoC Conatiner / DI container
-> 객체를 생성하고 관리하며 의존관계를 주입해준다
//AppConfig.java
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
@Bean
public MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
1) SRP (단일 책임 원칙)
구현 객체를 생성하고 연결하는 책임은 AppConfig가 가진다. 클라이언트는 실행하는 책임만 담당하게 된다.
2) DIP (의존관계 역전 원칙)
객체 인스턴스를 클라이언트 코드 대신 생성해 클라이언트 코드에 의존관계를 주입한다.
3) OCP (개방-폐쇄 원칙)
Appconfig가 의존관계를 변경해 클라이언트 코드에 주입하므로 클라이언트는 코드를 변경하지 않는다.
(SW 요소는 확장되나 변경되지 않음)
4) IoC(제어의 역전)
구현 객체가 제어의 흐름을 스스로 조종한다
+ 프레임워크 (ex : Junit) : 내가 작성한 코드를 제어하고 실행
+ 라이브러리 : 내가 직접 제어의 흐름을 담당
5) DI (의존관계 주입)
실행 시점에 동적인 의존관계를 주입하기 위해서 외부에서 실제 구현 객체를 생성하고 전달한다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
* ApplicationContext : 스프링 컨테이너
* 스프링 컨테이너가 @Configuration이 붙은 AppConfig를 설정 정보로 사용한다.
-> @Bean이 적힌 메서드를 호출해서 스프링 컨테이너에 등록한다.
-> 스프링 빈 탄생!
* ApplicationContext .getBean(name, class)을 통해서 필요한 스프링 빈을 찾는다
'Spring' 카테고리의 다른 글
스프링 핵심 원리 - 기본편(빈 스코프) (0) | 2022.04.28 |
---|---|
스프링 핵심 원리 - 기본편(빈 생명주기 콜백) (0) | 2022.04.27 |
스프링 핵심 원리 - 기본편(의존관계 자동 주입) (0) | 2022.04.27 |
스프링 핵심 원리 - 기본편(컴포넌트 스캔과 의존관계 자동 주입) (0) | 2022.04.25 |
스프링 핵심 원리(기본편) - 스프링 컨테이너와 스프링 빈 (0) | 2022.04.18 |