[Spring] 스프링 컨테이너 의존관계 자동 주입(DI)에 대한 나름의 이해

2023. 10. 6. 16:36Spring

크게 4가지 방법이 있다.

 

1. 생성자 주입: 생성자를 만들어서 주입하는 방법이다. 만약 생성자가 하나라면 @Autowired를 붙여주지 않아도 된다. 요즘에는 이렇게 많이 쓴다. 특히, 불변, 필수 의존관계에 사용된다. 불변은 상수라는 의미이고 따라서 한번 주입되면 바꿀 수 없다는 것이고 필수는 무조건 주입이 필요하다는 뜻이다. private final로 하게 될 경우 무조건 값이 필요해진다. 따라서 생성자에서 주입을 안해주면 컴파일 오류가 나게 된다. 이렇게 하면 생성자에는 웬만해서는 null을 넣지 않기 때문에 필수로 사용할 수 있어진다.

 

2. 수정자 주입: set method를 활용해서 주입하는 방법이다. 주로 선택, 변경 가능성이 있는 의존관계에서 사용한다. 왜냐하면 생성자 주입과는 다르게 set method를 활용해서 나중에도 바꿀 수 있기 때문이다. 다만 @Autowired로 지정해 주어야 한다. 또한 빈이 등록이 될 때에도 생성자가 호출이 되므로 생성자 주입이 되게 된다. 그러나 이번에는 생성자에 인자가 없어도 된다. 스프링이 빈을 등록하는 단계는 두 단계인데 먼저 빈을 모두 생성한 후 의존관계를 주입한다.

 

3. 필드 주입: 객체를 선언할 때 @Autowired를 해주는 방법이다. 다만 이 방법은 권장되지 않는데 단위 테스트와 같은 순수 자바 코드 테스트 환경에서 직접 객체를 지정할 수 없게 되기 때문이다. 그러나 스프링 테스트와 같은 특정 상황에서는 사용하기도 한다.

 

4. 일반 메소드 주입: 이건 의존관계를 주입하는 메소드를 하나 만들어서 @Autowired를 붙여주는 방법이다. 두 개 이상의 의존관계를 한번에 주입할 수 있고 변경할 수 있는 장점이 있으나 생성자 주입과 수정자 주입의 혼합이기 때문에 다소 애매한 포지션이다. 따라서 이러한 방법은 사용하지 않고 생성자 주입과 수정자 주입을 사용한다.

 

생성자 주입은 의존관계 주입의 한계를 정한다는 측면에서 디버깅에 유리하다.

마지막으로 자동 의존 관계 주입은 Spring이 관리하는 빈이어야 한다. 그렇지 않으면 @Autowired를 해도 자동 의존관계 주입이 되지 않는다.

 

Reference


https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&unitId=55373 

 

학습 페이지

 

www.inflearn.com