Spring Framework에서 DI(Dependency Injection)를 달성하는 방법은 크게 3가지가 있다
: 객체를 생성할 때 생성자를 통해 의존성을 주입하는 방식
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
UserServiceImpl 클래스는 UserRepository 인터페이스에 의존한다.
UserServiceImpl 클래스의 생성자에서 UserRepository 객체를 주입받고, 이후에 UserRepository를 사용할 때 userRepository 변수를 사용
장점
단점
: Setter 메서드를 통해 의존성을 주입하는 방식
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
Setter Injection을 사용하여 UserRepository 객체를 주입받고, 이후에 UserRepository를 사용할 때 userRepository 변수를 사용한다
장점
단점:
: 필드에 직접 의존성을 주입하는 방식
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
// ...
}
Field Injection을 사용하여 UserRepository 객체를 주입받고, 이후에 UserRepository를 사용할 때 userRepository 변수를 사용
장점
단점
코드 가독성이 좋다
생성자 인자로 필요한 의존성을 명시적으로 알려주기 때문에, 코드가 무엇을 의미하는지 명확하게 드러난다.
의존성 주입을 보장한다.
생성자 주입의 경우 객체를 생성하는 시점에 필요한 의존성을 모두 받아야 한다. 그렇기 때문에 객체 생성 후에도 의존성이 없는 상태로 남아 있을 가능성이 없어진다.
불변성(Immutability)이 보장된다.
생성자에서 한 번만 의존성을 주입하므로, 해당 객체는 불변성을 보장할 수 있게 된다. 따라서 객체의 상태를 변경하는 위험성을 방지할 수 있다.