DI(Dependency Injection)에 대한 설명과 해당 기술의 장점에 대해 설명해주세요.

권성현·2023년 2월 22일
0

면접 준비

목록 보기
5/30
post-custom-banner

DI는 각자의 계층이나 서비스들 간에 의존성이 존재할 경우 스프링컨터에너로부터 주입받아 서로 연결시킵니다.

  • DI는 IoC를 달성하기 위한 방법이라고 볼 수 있습니다.제어의 역전이 일어나는 것을 전제로 객체들간의 관계를 관리할때 사용됩니다.

의존성을 낮출 수 있게 되고 즉, 결합도를 낮추게 되는 장점이 생깁니다.

DI를 하는 방식

Field Injection(필드 주입)
코드가 간결하고 편하지만 의존관계를 정확히 파악하기 힘듦.
필드 주입 시 final 키워드를 선언할 수 없어 객체가 변할 수 있음.
주입이 동시에 일어나 겹치는 경우 순환참조 에러가 남.

public class Controller{
  @Autowired 
  private Service service;
}

Setter Injection(수정자 주입)
setter 혹은 사용자정의 메서드를 통해 의존관계 주입.
setter의 경우 객체가 변경될 필요성이 있을 때만 사용한다.(주입하는객체를 변경하는 경우는 드물다)

public class Controller{
   private Service service;
   @Autowired 
   public setService(Service service){
     this.service = service; 
   }
}

Constructor Injection(생성자 주입) (*추천)
1.객체 불변성 확보
2. 테스트 용이
3. 순환참조 에러방지

생성자에 @Autowired를 붙여 의존성을 주입받을 수 있음.
Spring 4.3이후로는 클래스 내 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면 @Autowired 생략 가능.
생성자 주입은 인스턴스 생성시 1회 호출되는 것이 보장되기 때문에, 주입받은 객체가 변하지 않거나, 반드시 객체주입이 필요한 경우 강제하기 위해 사용됨.

public class Controller{
   private Service service;
   @Autowired 
   public Controller(Service service){
     this.service = service; 
   }
}

장점

코드의 재사용성, 유연성이 높아진다.
하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다.
유지보수가 쉬우며 테스트가 용이해진다.
확장성을 가진다.

profile
개발일지
post-custom-banner

0개의 댓글