Spring

[Spring] DI/생성자 주입과 필드 주입의 차이점

ryureeru 2023. 7. 15. 16:04

의존성 주입을 위한 방법에는 생성자 주입(Constructor Injection), 세터 주입(Setter Injection), 필드 주입(Field Injection)이 있다.

 

저만 필드 주입의 유용성을 모르겠나요..?!! 😲😮😮😮 (유용한 경우를 댓글로 남겨주세요🤎)

 

 

 

 

 

생성자 주입과 필드 주입의

각각의 특징과 차이점을 (@Autowired로)예시를 통해 정리해 봅시다.

 

1. 생성자 주입

 

생성자 주입은 의존성을 클래스의 생성자를 통해 주입하는 방법입니다. 의존성이 필수적인 경우에 사용되며, 클래스의 필드를 final로 선언하여 변경이 불가능하도록 만들 수 있습니다.

 

@Component
public class ExampleService {
    private final SomeDependency someDependency;

    @Autowired
    public ExampleService(SomeDependency someDependency) {
        this.someDependency = someDependency;
    }

    // ... 이하 생략 ...
}

 

위의 예시에서 ExampleService 클래스의 생성자에 SomeDependency 타입의 파라미터가 있고, @Autowired 어노테이션이 적용되어 있습니다. Spring 컨테이너는 ExampleService를 생성할 때, SomeDependency 타입의 빈을 주입하여 인스턴스를 생성합니다. 이때, someDependency 필드는 final로 선언하여 불변성을 보장합니다.

 

 

2. 필드 주입

 

필드 주입은 의존성을 클래스의 필드에 직접 주입하는 방법입니다. 주로 @Autowired 어노테이션을 필드에 적용하여 사용됩니다.

 

@Component
public class ExampleService {
    @Autowired
    private SomeDependency someDependency;

    // ... 이하 생략 ...
}

 

 

위의 예시에서 ExampleService 클래스 내부에 SomeDependency 타입의 필드에 @Autowired 어노테이션이 적용되어 있습니다. Spring 컨테이너는 ExampleService를 생성한 후, SomeDependency 타입의 빈을 찾아 해당 필드에 자동으로 주입합니다.

 

 

 

 

 

 

 

 

주요 차이점

 

  • 생성자 주입은 의존성을 필수적으로 주입받기 때문에 해당 클래스를 사용하려면 반드시 의존성을 주입해야 합니다. 이로 인해 클래스의 불변성과 테스트 용이성을 높일 수 있습니다.
  • 필드 주입은 필드에 바로 주입이 이루어지기 때문에, 해당 필드가 null일 가능성이 있습니다!! 이는 코드의 가독성을 떨어뜨릴 수 있고, 테스트 시 Mock 객체 주입이 어렵게 만듭니다.
  • 생성자 주입은 의존성을 주입받을 때 빠뜨리는 경우가 없도록 보장합니다. 반면, 필드 주입은 주입되는 시점이 런타임이기 때문에 빈의 의존성이 누락되는 경우가 발생할 수 있습니다.

 

 

 

일반적으로 생성자 주입을 사용하는 것이 더 명시적이고 안전한 방법으로 여겨집니다. 필드 주입은 특정 상황에서 유용할 수 있지만, 되도록 생성자 주입을 권장합니다.


 

 

 

'Spring' 카테고리의 다른 글

[Spring] Spring Data JPA에서 Index 적용하기  (0) 2023.07.31
[Spring] 면접 예상 질문(1)  (0) 2023.07.15
[Spring] ApplicationContext  (0) 2023.07.15
[Spring] 의존성 주입(DI)의 예시  (0) 2023.07.15
[Spring] JPA ddl-auto 옵션  (0) 2023.01.05