본문 바로가기
개발/Spring

DI(Dependency Injection)

by BellOne4222 2024. 2. 4.

DI(Dependency Injection)

  • 스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입기능
  • 객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입 시켜주는 방식
  • 모듈 간의 결합도가 낮아지고 유연성이 높아진다.
  • A 객체에서 B,C객체를 사용(의존) 할 때, A 객체에서 직접 생성하는 것이 아니라 외부(IOC 컨테이너)에서 생성된 B,C 객체를 조립(주입)시켜 setter 혹은 생성자를 통해 사용하는 방식

 

  • 스프링에서는 Bean이라는 객체를 사용하는데, 프로젝트가 실행될 때, Bean으로 관리하는 객체들의 생성과 소멸에 관련된 작업을 자동적으로 수행해 주는데, 객체가 생성되는 곳을 스프링에서는 Bean 컨테이너라고 한다.

  • SOLID 원칙에서 O 에 해당하는 Open Closed Principle 을 지키기 위해서 디자인 패턴 중 전략 패턴을 사용하게 되는데, 생성자 주입을 사용하게 되면 전략 패턴을 사용하게 된다.

 

DI 종류

  • Field Injection(필드 주입) 
    • 변수 선언부에 @Autowired Annotation을 붙인다.
    • Field Injection을 사용하면 안되는 이유
      • Spring IOC 컨테이너와의 강한 결합 발생
        • @Autowired 어노테이션을 통해 스프링 컨테이너에 등록된 빈을 찾아 해당 객체에 주입을 해주는 방식이기 때문에 생성, 변경에 어려움이 있다. 이는 곧 Spring 컨테이너 밖에서 작동할 수 없는 코드임을 암시하기 때문에 Spring 컨테이너와의 강한 결합이 있음을 의미합니다.
      • Immutable한 상태로 생성이 불가능하다.
        • final 클래스로 생성이 불가능하며 final로 생성할 수 있는 방법은 오로지 생성자 주입 방식밖에 없고, 변경 불가능한 상태의 객체를 생성하는 것이 보안적인 측면에서 더 좋기 때문에 @Autowired 사용을 지양한다.
 //변수 선언부에 @Autowired Annotation을 붙인다.

  @Component
  public class SampleController {
      @Autowired
      private SampleService sampleService;
  }

 

  • Setter Injection(수정자 주입)
    • 특징
      • 선택적으로 의존성을 주입하고 싶을 경우 수정자 주입을 사용
      • 주입한 의존성에 대해 setter를 통해 변경이 가능.
  @Component
  public class SampleController {
      private SampleService sampleService;

      @Autowired
      public void setSampleService(SampleService sampleService) {
          this.sampleService = sampleService;
      }
  }



  • Constructor Injection(생성자 주입)
    • 특징
      • Immutable한 객체 생성
        • final 객체로 생성이 가능하여 불변적인 속성을 가진다.
      • Lombok을 활용한 주입 방식
        • lombok의 @RequiredArgsConstructor와 함께 이용하면 짧은 코드로 생성자 주입 방식 사용이 가능하다.
      • 순환참조 방지
@Component
public class SampleService {
    private SampleDAO sampleDAO;
 
    @Autowired
    public SampleService(SampleDAO sampleDAO) {
        this.sampleDAO = sampleDAO;
    }
}
  • Spring 프레임워크에서는 생성자 주입 방식으로 의존성을 주입하는 것을 권장하고 있다. 선택적으로 필요한 의존성 주입에 한하여 Setter Injection을 권장한다.

'개발 > Spring' 카테고리의 다른 글

AOP(Aspect Oriented Programming)  (0) 2024.02.06
스프링 빈 이벤트 라이프 사이클  (0) 2024.02.04
IoC 컨테이너  (0) 2024.02.04
IoC(Inversion Of Controll)  (0) 2024.02.04
Bean  (0) 2024.02.03