[Spring] IoC, DI, 컨테이너

이지현·2023년 9월 12일
0

Spring

목록 보기
2/7
post-thumbnail
번호목차
1.IoC
2.클래스 의존관계
3.스프링 컨테이너

1. IoC

  • 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것
// 예시
// IoC 컨테이너 또는 DI 컨테이너
public class AppConfig {
	public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
	}
    
    public OrderService orderService() {
        return new OrderServiceImpl(
                memberRepository(),
                discountPolicy());
	}
    
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
	}
    
    public DiscountPolicy discountPolicy() {
          return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

2. 클래스 의존관계

정적인 클래스 의존관계

아래와 같은 클래스 의존관계만으로는 실제 어떤 객체가 OrderServiceImpl에 주입될지 알 수 없음

동적인 클래스 의존관계

  • 의존관계 주입 : 애플리케이션 실행 시점에 외부에서 실제 구현 객체 생성 후 클라이언트에 전달해 클라이언- 트와 서버의 실제 의존관계가 연결되는 것
  • 객체 인스턴스 생성 후 그 참조값을 전달해서 연결됨
  • 의존관계 주입 사용 시 클라이언트 코드 변경하지 않고 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있음
  • 의존관계 주입 사용 시 정적인 클래스 의존관계를 변경하지 않고 동적인 객체의 인스턴스 의존관계를 변경할 수 있음

3. 스프링 컨테이너

스프링 컨테이너 생성 과정

(1) 스프링 컨테이너 생성

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  • ApplicationContext : 스프링 컨테이너, 인터페이스임
  • AnnotationConfigApplicationContext : 인터페이스의 구현체

(2) 스프링 빈 등록

  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스(AppConfig.class) 정보를 사용하여 스프링 빈을 등록함

(3) 스프링 빈 의존관계 설정

	@Bean // @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록함. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 함
    public MemberService memberService() {
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() { // static 메서드로 설정 시 싱글톤 보장 X
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }
  • 스프링 컨테이너는 설정 정보를 참고하여 의존관계를 주입(DI)함

자료 출처

profile
2022.08 ~ 2023.09 / 현재 티스토리 이전 : https://jihyun-devstory.tistory.com/

0개의 댓글