Spring DI(Dependency Injection) 종류

겔로그·2022년 6월 25일
0

Spring Boot

목록 보기
6/21
post-thumbnail

개요

이전 글에서 의존성 주입을 설명하면서 의존성 주입 종류에 대한 내용 또한 설명했는데, 이번 글에서는 Spring Framework에서 지원하는 의존성 주입에 대해 알아보는 시간을 가지겠습니다.

의존성 주입 종류

의존성 주입의 종류에는 다음과 같은 종류가 있습니다.

Field Injection(필드 주입)

  //변수 선언부에 @Autowired Annotation을 붙인다.

  @Component
  public class SampleController {
      @Autowired
      private SampleService sampleService;
  }

그런데 필드주입을 하면 Intellij에서 다음과 같은 주의를 주며 Spring 최신 버전에서는 @Autowired의 사용을 지양하고 있습니다. 이유가 무엇일까요?

특징

  1. Spring IOC 컨테이너와의 강한 결합 발생
  • @Autowired 어노테이션을 통해 스프링 컨테이너에 등록된 빈을 찾아 해당 객체에 주입을 해주는 방식이기 때문에 생성, 변경에 어려움이 있습니다.
  • 이는 곧 Spring 컨테이너 밖에서 작동할 수 없는 코드임을 암시하기 때문에 Spring 컨테이너와의 강한 결합이 있음을 의미합니다.

  1. Immutable한 상태로 생성이 불가능합니다.
  • final 클래스로 생성이 불가능하며 final로 생성할 수 있는 방법은 오로지 생성자 주입 방식밖에 없습니다.
  • 변경 불가능한 상태의 객체를 생성하는 것이 보안적인 측면에서 더 좋기 때문에 @Autowired 사용을 지양합니다.

Setter Injection(수정자 주입)

  @Component
  public class SampleController {
      private SampleService sampleService;

      @Autowired
      public void setSampleService(SampleService sampleService) {
          this.sampleService = sampleService;
      }
  }

특징

  1. 선택적으로 의존성을 주입하고 싶을 경우 수정자 주입을 사용
  2. 주입한 의존성에 대해 setter를 통해 변경이 가능.

Constructor Injection(생성자 주입)

@Component
public class SampleService {
    private SampleDAO sampleDAO;
 
    @Autowired
    public SampleService(SampleDAO sampleDAO) {
        this.sampleDAO = sampleDAO;
    }
}

Constructor Injection의 특징

  1. Immutable한 객체 생성
  • final 객체로 생성이 가능하여 불변적인 속성을 가집니다.
  1. Lombok을 활용한 주입 방식
  • lombok의 @RequiredArgsConstructor와 함께 이용하면 짧은 코드로 생성자 주입 방식 사용이 가능합니다.
  1. 순환참조 방지

결론

앞서 말했듯 최신 Spring Framework 버전에서는 순환 참조 및 SRP, Immutable 등 다양한 이유로 생성자 주입 방식으로 의존성을 주입하는 것을 권장하고 있습니다.

선택적으로 필요한 의존성 주입에 한하여 Setter Injection을 권장하며 Feild Injection 방식은 아예 머릿속에서 지우는게 좋을 것 같습니다.

Reference

Spring beans setter injection

profile
Gelog 나쁜 것만 드려요~

0개의 댓글