Intellij
객체들이 자신이 사용할 의존성을 직접 생성하거나 관리하지 않고 외부에서 주입받도록 하는 구조
- 제어의 역전: 애플리케이션의 흐름을 개발자가 직접 제어하는 것이 아니라, 프레임워크가 대신 제어합니다.
- 확장성: 코드의 결합도를 낮추고, 의존성 주입으로 인해 확장성이 높아집니다.
- 모듈화: IoC를 사용하면 코드의 모듈화가 쉬워지며, 각 모듈 간의 의존성을 명확히 관리할 수 있습니다.
- 객체가 스스로 의존성을 생성하지 않고, 외부로부터 필요한 의존성을 주입받는 방식
- 객체 간의 결합도를 줄이고, 코드의 유연성과 테스트 가능성을 높이는 중요한 역할
DI 종류
Constructor Injection (생성자 주입): 객체 생성 시 생성자를 통해 의존성을 주입받습니다.
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
장점: 불변성을 보장하고, 모든 의존성을 주입받지 않으면 객체를 생성할 수 없기 때문에 객체의 완전성을 보장합니다.
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
- 장점: 의존성이 선택적일 때 유용하며, 객체 생성 후에 의존성을 주입할 수 있습니다.
- 단점: 객체의 불완전한 상태가 발생할 수 있습니다.
public class UserService {
@Autowired
private UserRepository userRepository;
}
- 장점: 코드가 간결해집니다.
- 단점: 테스트하기 어려울 수 있고, 의존성 주입을 위한 필드가
private로 설정되면 테스트 시 주입이 복잡해질 수 있습니다.