개발 일지/Spring

[Spring] 의존관계 주입 방법

미숫가루설탕많이 2023. 2. 7. 13:16

 스프링에서 DI 할 수 있는 방법으로는 생성자 주입, 수정자 주입(setter 주입), 필드 주입, 일반 메서드 주입이 있다.

 

 과거에는 수정자, 필드 주입을 많이 사용했지만 최근에는 생성자 주입 사용을 권장하는 추세라고 한다.

 

 

 

 

DI 주입 방법


생성자 주입

 

 생성자에 @Autowired를 하면 스프링 컨테이너에 @Component로 등록된 빈에서 생성자에 필요한 빈들을 주입한다.

 

 다음과 같은 특징이 있다.

  • 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.
  • 불변과 필수 의존 관계에 사용된다.
  • NullPointerException을 방지할 수 있다.
  • 주입받을 필드를 final로 선언 가능하다.
  • 생성자가 1개만 존재하는 경우에는 @Autowired를 생략해도 자동 주입된다. 스프링이 해당 클래스 객체를 생성하여 빈에 넣어야 하는데 생성할 때 생성자를 부를 수밖에 없기 때문이다.

 

 

 

 

수정자 주입(setter 주입)

 

 setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존 관계를 주입한다.

 

 다음과 같은 특징이 있다.

  • 선택과 변경 가능성이 있는 의존 관계에 사용된다.
  • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
  • 수정자의 경우 @Autowired를 입력하지 않으면 실행이 되지 않는다.

 

 

 

 

필드 주입

 

 필드에 @Autowired를 붙여서 바로 주입하는 방법이다.

 

 다음과 같은 특징이 있다.

  • 코드가 간결하지만, 외부에서 변경이 불가능하여 테스트하기 힘들다는 단점이 있다.
  • DI 프레임워크가 없으면 아무것도 할 수 없다.
  • 실제 코드와 상관없는 특정 테스트를 할 수 있다.
  • 정상 작동하려면 결국 setter가 필요하다.

 

 

 

 

일반 메서드 주입

 

 일반 메서드를 사용해 주입하는 방법이다.

 

 한번에 여러 필드를 주입받을 수 있다는 특징이 있다.

 

 

 

 

생성자 주입을 권장하는 이유


 

  • 의존 관계 주입은 처음 애플리케이션이 실행될 때 대부분 정해지고 종료 전까지 변경되지 않고 변경되어서는 안 된다. 생성자 주입은 객체를 생성할 때 호출되고 나서는 호출되는 일이 없기 때문에 불변하게 설계할 수 있다.
  • 주입 데이터 누락 시 컴파일 오류가 발생하기 때문에 NPE(Null Point Exception)을 방지할 수 있다.

  • final 키워드를 사용할 수 있고 생성자에서 값이 설정되지 않으면 컴파일 시점에서 오류를 확인할 수 있다.

  • 생성자 주입으로 BeanCurrentlyInCreationException을 확인할 수 있어 순환 참조를 방지할 수 있다.

  • 테스트 코드 작성이 용이하다.

  • 수정자 주입이 필요한 경우가 있을 수 있지만 옵션이 필요할 때만 선택하면 된다.

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

[Spring MVC] DispatcherServlet  (0) 2023.02.15
[Spring MVC] Spring MVC  (0) 2023.02.13
[Spring] Component Scan  (0) 2023.02.07
[Spring] 빈  (0) 2023.02.06
[Spring] 스프링 컨테이너  (0) 2023.02.06