본문 바로가기
Web/Spring

Spring IoC Container

by snfjddl 2021. 10. 11.

Spring IoC Container란?

IoC Container는 제어의 역전(Inversion of Control)을 구현하는 프레임워크의 특징이다.

Spring 프레임워크에서는 ApplicationContext interface가 IoC Container의 역할을 합니다.

 

Spring Container는 객체를 bean이라는 이름으로 인스턴스화하고 구성 및 조합하며

등록된 bean의 lifecycle을 관리한다.

 

Spring 프레임워크에서 ApplicationContext를 구현하는 방법은 ClassPathXmlApplication, FileSystemXmlApplication,

WebApplicationContext 3가지가 있다.

Container는 bean을 등록하기 위해 XML 형태의 설정 정보(configuration  metadata)나 annotation을 활용한다.

 

최근에는 XML을 활용한 형태는 잘 사용하지 않기 때문에 annotation을 활용하여 의존성 주입(Dependency Injection)하는 것을 알아보겠다.

* 의존성 주입(Dependency Injection) 을 자세히 알아보려면 여기로

 

의존성 주입 - DI(Dependency Injection)

의존성이란? 먼저 의존성에 대해 알아보려고 한다. 프로그램에서 의존성은 크게 두 가지로 나누어 생각해야 한다. 정적인 클래스 의존성 Class의 import만 보고 의존성을 쉽게 판단할 수 있는 것.

snfjddl.tistory.com

 

Constructor Based DI
@Configuration
public class AppConfig {

    @Bean
    public Item item() {
        return new ItemImpl();
    }

    @Bean
    public Store store() {
        return new Store(item());
    }
}

@Configuration: bean을 정의해놓은 Config Class임을 명시

@Bean: 해당 method가 관리되어야 할 bean임을 명시(별도로 이름을 지정하지 않으면 method 이름을 따름)

 

bean은 기본적으로 singleton이다. 따라서 Container는 이미 생성된 bean 인스턴스가 존재하는지 확인하며,

이미 존재한다면 새로운 인스턴스를 생성하지 않는다.

 

최근에는 Spring을 포함한 DI 프레임워크 대부분이 이 방식을 권장한다.

그 이유는 다음과 같다.

  • 프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 잘 살리는 방법임.
  • Constructor, Modifier Injection 처리를 동시에 할 수 있다.
  • 유일하게 final 지정자를 사용할 수 있다.(손쉬운 에러 체크)

 

Field Based DI
public class Store {
    @Autowired
    private Item item; 
}

@Autowired: Container가 자동으로 해당 bean을 찾아서 DI

 

Autowired를 활용한 방법은 깔끔해 보이지만 추천하지 않는다. 

그 이유는 다음과 같다.

  • Autowired는 reflection을 사용하여 DI를 수행한다. 따라서 constructor, setter based보다 의존성 관계 파악에 비용 소모가 크다.
  • 다수의 DI 추가가 쉽지만 SRP를 위반하게된다.

그냥 사용하지 말자!

 

Setter Based DI
@Bean(autowire = Autowire.BY_TYPE)
public class Store {
    
    private Item item;

    public setItem(Item item){
        this.item = item;    
    }
}

위의 방식에는 3가지 parameter가 있다.

Autowire.NO: bean에 대해 autowire가 사용되지 않는다는 의미. 의존성에 이름을 명확히 지정해야 함.

Autowire.BY_NAME: Container는 등록된 bean에서 같은 이름의 bean을 찾아 의존성 주입.

Autowire.BY_TYPE: Container는 등록된 bean에서 같은 타입의 bean을 찾아 의존성 주입. 이때, 같은 타입의 bean이 2개 이상이면 exception 발생

 

결론

DI를 자동으로 수행해주는 IoC Container에 대해 알아보았다.

여러 가지 방법이 있지만 Constructor Based DI를 가장 추천한다.

 

 

reference.

https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring

반응형

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

Unable to find a @SpringBootConfiguration  (0) 2022.01.20
의존성 주입 - DI(Dependency Injection)  (0) 2021.10.11
제어의 역전 - IoC(Inversion of Control)  (0) 2021.10.11
JPA Entity 생성자  (0) 2021.07.20
객체지향 설계원칙 SOLID  (0) 2021.06.15

댓글