[Spring] 의존성 주입, DI(Dependency Injection)

제롬·2022년 10월 18일
0

의존성 주입(DI)란?

의존성 주입(DI)이란 클래스 사이의 의존관계를 빈(bean)설정정보를 바탕으로 Spring Container가 자동으로 연결해주는 기능이다.


스프링과 의존성 주입

  • Spring Container에서 클래스 의존관계를 직접 제어한다.
  • 스프링 설정파일(.xml)이나 Annotation을 통해 객체간의 의존관계를 설정한다.
  • Spring Container가 제공하는 API를 이용해 객체를 사용한다.
  • Spring에서 Container 실행시 객체를 주입하기 때문에 DI라고 부른다.
  • Spring DI에서 제어하는 클래스를 Bean(빈)이라고 부른다.

DI 동작

기존에는 필요로 하는 외부객체가 있으면 객체내부에서 직접 생성해서 사용했다면 Spring DI의 경우 Spring Container에서 객체를 생성해 의존관계를 설정(주입)해주기 때문에 객체내부에서 직접 객체를 생성하여 사용할 필요가 없다.

[DI 미사용]

class 엔진 {

}

class 자동차 {
     엔진 v5 = new 엔진();
}

[DI 사용]

@Component
class 엔진 {

}

@Component
class 자동차 {
     @Autowired
     엔진 v5;
}

DI를 사용했을때의 장점

  • 클래스간에 의존관계를 최소화할 수 있다.
    • DI를 사용했을경우 주입받는 대상이 변하더라도 구현 자체를 수정할 일이 없거나 줄어들게 된다.

객체 의존관계 설정방법

  1. .xml 파일을 이용한 의존관계 설정
  2. Annotation을 이용한 의존관계 설정

의존성 주입방법

  1. 생성자를 이용한 방법
public class SampleController{

    private final SampleRepository sampleRepository;

    @Autowired
    public SampleController(final SampleRepository sampleRepository) {
        this.sampleRepository = sampleRepository;
    }
    ...
}
  1. 필드에 @Autowired 어노테이션을 추가하는 방법
public class SampleController{

    @Autowired
    private final SampleRepository sampleRepository;
    ...
}
  1. setter를 이용한 방법
public class SampleController{

    private final SampleRepository sampleRepository;
    
    @Autowired    
    public setSampleRepository(final SampleRepository sampleRepository) {
        this.SampleRepository = SampleRepository;
    }
    ...
}

위의 세가지 의존성 주입방법중 @Autowired 어노테이션을 추가하는 방법이 제일 편리하지만, 생성자를 이용한 의존성 주입방법이 가장 권장된다.

이유는?

필수적으로 사용해야하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있기 때문이다.

예를들어, SampleControllerSampleRepository없이 동작할 수 없는 구조라면 SampleReposiotry Bean의 의존성 주입을 생성자를 이용해 하게 된다면 SampleRepository 없이 인스턴스를 만들지 못하도록 강제할 수 있다.

0개의 댓글