Spring

스프링 핵심 원리(기본편) - 객체 지향 원리 적용

코드파고 2022. 4. 17. 23:44

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)을 통해서 필요한 스프링 빈을 찾는다