DI(dependency Injection)

HyeonWoo·2020년 12월 12일
1

스프링 & JPA

목록 보기
10/34
post-thumbnail

이번 장에서는 스프링에서 중요한 개념인 의존성 주입(DI)에 대해 알아보고,
의존성을 주입하는 세가지 방법, 스프링 IoC 컨테이너, 빈의 의미와 등록방법 에 대해 알아보고자 한다.


의존성 주입이란?

의존 관계 주입(Dependency Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어(new 연산자) 사용하는게 아니라, 주입 받아서 사용하는 방법.

아래 코드는 개발자가 직접 new연산자를 사용하여 직접 객체를 생성하여 코드를 제어하는 코드이다.


//배터리 일체형 
public Class ElectronicToy1 {

    private Battery battery;
    
    public ElectronicToy1(){
    	battery = new Battery();
    }
}    

아래 코드는 Battery라는 객체가 스프링 컨테이너에게 관리되고 있는 Bean이라면 @Autowired를 통해 객체를 주입받는 코드이다.


//배터리 분리형
public class ElectronicToy2 {
	
    @Autowired
    private Battery battery;

그러면 이와 같이 의존성 주입을 사용하는 이유는 뭘까?

  1. 재사용성 증가.
  2. 테스트에 용이.
  3. 코드 단순화.
  4. 코드 가독성 증가.
  5. 종속성이 감소(변경에 민감하지 않음).
  6. 결합도는 낮추면서 응집도를 높일수 있다.
  7. 객체간의 의존관계를 설정할 수 있다.

의존성 주입의 세가지 방법

1) 생성자 주입

public class TestService {

    private TestRepository testRepository;
    
    //스프링 4.3 부터는 클래스의 생성자가 하나이고, 
    //그 생성자로 주입 받을 객체가 빈으로 등록 되어 있다면
    //생성자 주입에서 @Autowired를 생략할 수 있음.
    @Autowired 
    public TestService(TestRespository testRepository) {
    	this.testRepository = testRepository;
    }
    
}    

2) 필드 주입

public class TestService{
	
    @Autowired
    private TestRepository testRepository;
    
}    

3) Setter 주입


public class TestService{

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

어떤 방법으로 의존성을 주입해줘야 할까?

Spring framework reference에서 권장하는 방법은 2번째 생성자를 통한 주입이다.
생성자를 사용하는 방법이 좋은 이유는 필수적으로 사용해야하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있기 때문이다.


IoC 컨테이너란?

  • 스프링 프레임워크 또한 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공한다.
  • IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
  • POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
  • 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.

*POJO : 주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 순수Java Object를 지칭 (getter/ setter)


빈(Bean)이란?

우선 스프링은 경량 컨테이너로 객체 생성, 소멸과 같은 Life Cycle을 관리하며 스프링 컨테이너로부터 필요한 객체를 얻을 수 있다.
스프링 컨테이너에 의해서 자바 객체가 만들어지게 되면 이 객체를 스프링은 빈(Bean)이라고 부른다.
스프링 빈과 자바 일반 객체와의 차이점은 없고 스프링 컨테이너에 의해 만들어진 객체를 스프링 빈이라고 부른다.

빈 어노테이션 종류

@Component, @Service, @Controller, @Repository, @Bean, @Configuration 등으로 필요한 빈들을 등록하고 필요한 곳에서 @Autowired를 통해 주입받아 사용한다.


참고자료
https://jjunii486.tistory.com/84 ,
https://atoz-develop.tistory.com/entry/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI-Dependency-Injection%EC%9D%98-%EC%84%B8%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95 ,
https://cbw1030.tistory.com/54 ,
https://devlog-wjdrbs96.tistory.com/165 ,
https://siyoon210.tistory.com/120

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글