야생토끼 블로그

[스프링기초] IoC(Inversion of Control), DI(Dependency Injection), Constructor Injection 본문

Computer science/Spring

[스프링기초] IoC(Inversion of Control), DI(Dependency Injection), Constructor Injection

lazy. 2020. 4. 28. 01:02

IoC란?

제어권 역전 : Inversion of Control

객체 생성과 관리에 대한 제어권이 역전되었음을 의미함. 프레임워크의 일반적인 특징.

IoC에는 DI와 DL가 있다.

 


DI (Dependency Injection)

  • 의존성 주입

  • 각 컴포넌트 간의 의존관계를 빈 설정(Bean Definition)정보를 바탕으로 Spring 컨테이너가 런타임에  자동으로 연결해주는 것

  • DI의 방법

 

Field Injection

@Service
public class TestService {

    @Autowired
    private TestRepository testRepository;
    .......
}

Constructor Injection

@Service
public class TestService {
    private TestRepository testRepository;
    
    @Autowired
    TestService(TestRepository testRepository){
        this.testRepository = testRepository;
    }
    .......
}

Setter Injection 

@Service
public class TestService {
    private TestRepository testRepository;
    
    @Autowired
    public void setTestRepository(TestRepository testRepository){
        this.testRepository = testRepository;
    }
    .......
}

 


DL (Dependency Lookup)

  •  의존성 검색

  •  JNDI 같은 저장소에서 관리되고 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는 것 

  •  EJB 컨테이너, Spring 컨테이너에서 지원 

  •  컨테이너 종속성이 증가하게 됨.

Spring Bean Factory

public static void main(String[] args) {
    BeanFactory factory = getBeanFactory();
    TestService ts = (TestService)factory.getBean("testService");
    ...
}

 


 

필드 주입(Field Injection) 대신 생성자 주입(Constructor Injection)을 권장하는 이유

  1. 필드주입은 보기에도 좋지만, 의존성을 여러개 주입하기가 쉽다 :
    @Autowired 선언으로 여러 개를 추가하기가 쉬우므로, 해당 클래스가 너무 많은 책임을 가진 것은 아닌지 고민하지 못하게 된다.
  2. 의존성이 코드속에 숨는다. (->애매하게 이해됨) :
    의존 객체 중 필수는 생성자 주입, 옵션은 Setter 주입으로 명시가 가능하다.
  3. DI컨테이너의 결합성, 테스트 용이성 :
    DI 컨테이너 없이도 독립적으로 인스턴스화 가능하고, 테스트 가능하다.
  4. 불변성 :
    필드 주입은 final을 선언할 수 없어서 객체가 변할 수 있고, 생성자 주입에서 필드는 final로 선언 가능하다.
  5. 순한 의존성 :
    생성자 주입 사용 시 순환 의존성은 BeanCurrentlyCreationExeption 으로 알 수 있다.

Setter Injection이 유용한 경우?

  1. 선택적인 의존성을 사용할 때 유용하다. 스프링 3.x 문서에서는 Setter Injection을 추천했다. 스프링 4.x 문서에서는  Constructor Injection을 권장한다. 

 

* 참고 : https://zorba91.tistory.com/238

* 참고 : https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/

'Computer science > Spring' 카테고리의 다른 글

spring 구조  (0) 2022.09.14
Comments