Skills/Spring

Spring - DI & Spring Container

aoaa 2022. 8. 31. 21:23

1.  DI & DI Container

 DI는 Dependency Injection으로 의존관계 주입이라고합니다. 이는 애플리케이션 런타임에 외부에서 실제 구현 객체를 생성하고 Client에 전달해서 Client와 Server의 실제 의존관계가 연결되는 것을 의미합니다.

 이 DI를 이용하면 Client 코드를 변경하지않고 Client가 호출하는 대상의 인스턴스를 변경할 수 있습니다.

 

1.1 DI 컨테이너

 이 의존관계 주입을 이용하여 외부에서 객체를 생성하고 관리하면서 의존관계를 연결해주는것을 DI 컨테이너라고 합니다. 

이 DI 컨테이너를  IoC(Inversino of Control) 컨테이너라고도 하는데 프로그램의 제어 흐름을 개발자기 직접 제어하는 것이 아니라, 외부에서 관리하기 입니다. Java의 경우는 Spring이라는 프레임워크가 관리해주게 되겠죠.

 

 객체지향 SOLID 원칙에 의거해 코드를 작성하게 되면 오직 추상화된 클래스(인터페이스)에 의존하고 구현 클래스의 의존을 제거하여 설계를 해줘야 합니다. 이 때 추상 인터페이스의 구현객체를 대신 생성하고 구현체에 주입을 대신 해주는 역할을 DI Container가 대신하게 됩니다.


2. Spring Container

 단순 Java 코드로 작성한 config 클래스를 만든 뒤, 주입할 수 있지만 Spring 프레임워크는 애노테이션 기반으로 사용할 수 있는 Spring Container 와 Bean을 제공합니다. 

 스프링 컨테이너는 기본적으로 3가지 방법으로 설정 정보를 얻어오는데 1) 애노테이션 기반의 Java코드 형식, 2) XML 기반의 형식, 3) 커스텀 방식이 있습니다. 레거시 프로젝트들의 경우는 XML 방식으로도 많이 사용했지만 최근에는 대부분 애노테이션 기반의 Java 코드 방식으로 설정을 얻어옵니다.

 

2.1 컨테이너 생성

ApplicationContext ac = new AnnotationConfigApplicationContext(설정클래스: ex) Appconfig.class);

ApplicatinoContext는 스프링 컨테이너를 의미합니다. 이전에는 DI 컨테이너를 사용해 직접 객체를 생성하고 의존관계를 주입했지만 컨테이너를 이용해 쉽게 주입 가능합니다.

 

// Appconfig.java

@Configuration

public class Appconfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService() {
        return new OrderServiceimpl(memberRepository(), dIscountPolicy());
    }
    @Bean
    public DIscountPolicy dIscountPolicy() {
        return new RateDiscountPolicy();
    }
}

스프링 컨테이너는 @Configuratino이 붙은 클래스를 설정 정보로 사용하고, @Bean이 적힌 메서드를 모두 호출하여 반환된 객체를 스프링 컨테이너에 등록합니다. 이 때, 등록된 객체를 Spring Bean이라고 합니다. 이 때 컨테이너는 패러미터로 넘어온 설정 클래스 정보를 참고하여 의존관계를 주입하고, 생성자를 호출하여 의존관계 주입을 할 수 있습니다. 

'Skills > Spring' 카테고리의 다른 글

Spring - Singleton(싱글톤)  (0) 2022.09.04
Spring - BeanFactory & BeanDefinition  (0) 2022.09.01
Spring - 테스트 코드(TDD) 작성  (0) 2022.08.02
Spring - Spring Web Layer  (0) 2022.07.27
Spring - MockMvc를 이용한 HTTP 메시지 검증  (0) 2022.07.24