본문 바로가기
Spring/Spring Framework

의존성주입

by chogigang 2023. 2. 27.

스프링 프레임워크에 의존성 주입은 3가지 정도 로 정리할수 있습니다

 

  • 생성자 기반
  • 세터(수정자) 기반
  • 필드   어떠한 생성자나 수정자가 없다면 필드에 리플렉션을 통해 직접주입하는 것도 가능합니다 

 

생성자

   @Controller
public class Controller {
        public final Service service;

        @Autowired//클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면  @Autowired를 생략 할 수 있습니다.
        public Controller(Service service) {
            this.service = service;
        }
    }

 

생성자에 @Autowired를 붙여 의존성을 주입받을수 있습니다 Spring4.3이후로는 클래스 내 생성자가 하나이고,

그 생성자로 주입받을 객체가 빈으로 등록되어 있다면 @ Autowired 생략이 가능합니다

생성자 주입은 인스턴스 생성시 1회 호출되는 것이 보장되기 때문에,주입받는 객체가 변하지않거나,반드시 객체주입 이필요한 경우 강제하기 위해 사용됩니다.

 

클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면  @Autowired를 생략 할 수 있습니다.

 

 

 필드

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

어떠한 생성자나 수정자가 없다면 필드에 리플렉션을 통해 직접주입하는 것도 가능합니다

스프링 초창기부터 계속 사용되고 있는 것입니다.

 

1.타입이 같은 객체를 빈 팩토리에 검색하고,객체가 있으면 객체를 사용,타입이 두개 이상인 경우@Primary@Qualifier 명시를 통해 더 상세한 객체를 가져옵니다.

2.객체가 없다면 생성 후 빈 팩토리에 등록을 합니다.

 

 

수정자 

public class Controller {
        public Service service;

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

Setter 메소드에 @Autowired 어노테이션을 붙이는 방법입니다.

단점으로 수정자 주입을 사용하면 setXXX 메서드를 public으로 열어두어야 하기 때문에 언제든지 변경이 가능한게

단점입니다.

 

 

Spring Framwork reference에서 권장하는 방법은 생성자를 통한 주입입니다.

 

1. 순환 참조를 방지할 수 있습니다.

 

개발 하다보면 여러 컴포넌트 간의 의존성이 생기는대

필드 주입과 수정자 주입은 빈이 생성된 후에 참조를 하기 때문에 어플리케이션이 아무런 오류,경고 없이 구동을 합니다

그리고 실제 코드가 호출될 때까지 문제를 알 수 없습니다

 

반면,생성자를 통해 주입하고 실행하면BeanCurrentlyCreationException이 발생합니다.

순환 참조 뿐만아니라 더 나아가서 의존 관계에 내용을 외부로 노출 시킴으로써 어플리케이션을 실행하는 시점에

오류를 체크할 수 있습니다.

 

2. 불변성

 

생성자로 의존성을 주입할 때 final로 선언할 수 있고,이로인해 런타임에서 의존성을 주입받는 객체가 변할 일이

없어지게 됩니다.

 

수정자가 주입이나 일반 메소드를 주입을 이용하게되면 불필요하게 수정의 가능성을 열어두게 되서 코드가 위험해

집니다 그러므로 생성자 주입을 통해 변경의 가능성을 배제하고 불변성을 보장하는 것이 좋습니다.

 

또한, 필드 주입 방식은 null이 만들어질 가능성이 있는데, final로 선언한 생성자가 주입 방식은 null이 불가능합니다.4

 

3.테스트의 용이

 

생성자 주입을 사용하게 되면 테스트 코드를 좀 더 편리하게 작성할 수  있습니다.