본문 바로가기
개발/Java_Spring

[spring]DI, 3가지 방법

by 리내(rinae) 2023. 8. 16.

DI(Dependency Injection) 이란 의존 관계 주입 기능으로, 객체를 직접 호출(new 연산자)하는 것이 아닌 외부(스프링 컨테이)에서 생성한 후 주입 시키는 방식을 말한다.

 

외부에서 두 객체 간의 관계설정을 해주는 디자인 패턴으로 인터페이스를 사이에 두어 클래스 레벨에서는 의존 관계가 고정되지 않도록하고, 런타임 시 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 한다.

 

장점

모듈 간의 결합도를 낮춘다.

유연성을 높인다.

테스트 작성을 용이하게 한다.

 

방법 3가지

DI에는 필드 주입, setter 주입, 생성자 주입이 있으나 의존관계가 실행 중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

 

생성자 주입

@Controller 
public class Controller{
   private Service service;

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

필드 주입

@Controller
public class Controller{
  @Autowired 
  private Service service;
}

setter 주입

@Controller 
public class Controller{
   private Service service;

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

 

컴포넌트 스캔과 자동 의존관계 설정

@Component : 에노테이션이 있으면 스프링 빈으로 자동 등록된다.

@Controller : 커트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.

 

@Component를 포함하는 다음 에노테이션도 스프링 빈으로 자동 등록된다.

 - @Controller

 - @Service

 - @Repository

 

 

번외 ) 자바 코드로 직접 스프링 빈 등록하기

@Configuration ,@Bean으로 생성자 메서드 직접 return 해준다. 

 

사용하는 경우 : 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

댓글