의문점 공부하기/📌 Java

📌 의존성 주입 방법은 무엇이 있을까 ++ ?

아리빠 2023. 8. 22. 19:10

Field Injection (필드 주입):
필드 주입은 클래스의 필드에 직접 의존성을 주입하는 방식

클래스의 필드에 @Autowired 애노테이션을 사용하여 의존성을 주입

간결하고 편리하지만, 테스트 시에 의존성을 모의(mock) 객체로 대체하기 어렵다는 단점이 존재

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    // ...
}

 

 

Setter based Injection (Setter 주입):
Setter 주입은 클래스의 Setter 메서드를 통해 의존성을 주입하는 방식

클래스의 필드는 private으로 선언되어 있고, 각 필드에 대응하는 Setter 메서드에 @Autowired 애노테이션을 사용

의존성을 선택적으로 설정할 수 있으므로 유연성이 높다

@Service
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // ...
}

 

Constructor based Injection (생성자 주입):
생성자 주입은 클래스의 생성자를 통해 의존성을 주입하는 방식

클래스의 필드는 private으로 선언되어 있고, 생성자 매개변수로 의존성을 받는다

 빈의 생성 시점에 모든 필수적인 의존성을 받도록 보장하며, 변경 불가능한 불변성을 유지할 수 있다

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // ...
}


>> 생성자 주입이 가장 많이 사용되는 이유:

불변성과 필수 의존성 보장: 생성자 주입을 사용하면 빈이 생성될 때 필요한 모든 의존성을 전달받도록 보장할 수 있는데,  의존성이 누락되거나 불완전한 상태로 빈이 생성되는 문제를 방지할 수 있고 생성자 주입을 통해 의존성이 변경되지 않는 불변성을 유지할 수 있기 때문에

클래스 내부 의존성 명시화: 생성자 주입은 클래스의 의존성을 외부에 명시적으로 드러내는 효과가 있어서 클래스의 생성자 시그니처를 통해 필요한 의존성이 무엇인지 쉽게 파악할 수 있다.

선택적인 불변성: 생성자 주입은 빈이 생성된 후에는 의존성을 변경할 수 없으므로, 빈의 불변성을 유지하면서도 필요한 의존성을 설정할 수 있다